문제를 보면 문제 파일과 소스파일을 준다. 문제 파일을 file 명령어로 확인하면 32비트 실행파일임을 확인할 수 있다.

문제 파일의 c 소스 파일은 다음과 같다.

main 함수에서는 func함수를 실행하고 있고, func 함수에서는 key를 인자로 받고 있고, key 값이 0xcafebabe면 system 함수로 쉘을 실행하고 있다. overflow 변수에 값을 입력받는데, overflow의 크기는 32바이트인데, 입력받는 곳에서 크기의 제한을 하고 있지 않아서 bof 취약점이 발생할 것 같다. gdb로 main 함수와 func 함수를 보면 다음과 같다.

func + 40의 위치에서 func함수의 인자와 0xcafebabe를 비교하고 있다.

func + 40에 breakpoint를 걸고 실행하여 값(AAAAA

~

)를 넣어주고 esp를 확인해보면 다음과 같다.

넣어준 값과 main함수에서 func를 실행할 때 인자로 넣은 0xdeadbeef의 위치를 확인할 수 있다. 0xdeadbeef가 있는 위치까지 입력값으로 덮고 0xcafebabe를 덮으면 조건을 만족시켜 system함수를 실행시킬 수 있을 것 같다.

입력값이 들어가는 부분의 시작 위치는 0xffffd09c 이고, 0xdeadbeef의 시작점은 0xffffd0d0이므로 0xffffd0d0 - 0xffffd09c는 10진수로 52이다. 따라서 52만큼 다른 값을 채우고, 0xcafebabe를 리틀엔디언 형식으로 넣으면 쉘을 딸 수 있을 것 같다.

다음과 같이 파이썬 코드를 짜서 실행시켰다.

1
2
3
4
5
6
from pwn import *
 
= remote("pwnable.kr"9000)
pay = "A" * 52 + p32(0xcafebabe)
p.sendline(pay)
p.interactive()
cs

+ Recent posts