문제 파일을 확인해 보니 32비트 리눅스 실행파일 이라는 것을 확인할 수 있었다.

이 파일을 gdb로 열어서 main 함수를 확인해보면 다음과 같다.

fgets 함수로 문자열을 입력 받고, printf 함수로 두 번 출력하고, ebp-0xc 의 값이 0x4030201 이면 main + 120 으로 이동하고, ebp-0xc의 값이 0xdeadbeef이면 main+120으로 이동시킨다. main+120을 보면 ebp-0xc가 0xdeadbeef 가 아닐 경우 main+ 177 로 보내서 main 함수를 종료하고, 같으면 어셈 코드가 진행되다가 system 함수가 실행되게 된다.

프로그램의 동작을 더 확실하게 알기 위해 아이다 헥스레이로 main 함수를 보면 다음과 같다.

s 라는 문자열을 받는 배열과 , v5 변수가 선언되어 있고, v5는 0x4030201로 할당되어 있고, s에는 입력값이 할당된다. s의 크기는 40이기 때문에 s 변수에서 버퍼 오버플로우를 발생시켜서 v5의 값을 바꾸면 될 것 같다.

일단 프로그램을 실행시키고 40이상의 문자을 입력하면 v5의 값이 변경되어 첫번째 조건문을 만족시킨다.

실행할 때 check 부분에 0xDEADBEEF가 들어가야 할 것 같다.

배열을 40칸 채운 후 리틀 엔디언 방식으로 0xdeadbeef를 넣어주면 시스템 함수가 실행되어 쉘을 딸 수 있다.

파이썬 pwntools 모듈을 이용하여 스크립트를 짜서 풀었다.

1
2
3
4
5
6
7
# bofex.py
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3000)
pay = "A"*40 + "\xef\xbe\xad\xde"
p.sendline(pay)
p.interactive()
cs

+ Recent posts