문제 파일을 확인해 보니 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 *
p = remote("ctf.j0n9hyun.xyz", 3000)
pay = "A"*40 + "\xef\xbe\xad\xde"
p.sendline(pay)
p.interactive()
|
cs |
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][Hack CTF] Basic_FSB (0) | 2021.03.17 |
---|---|
[Project H4C][Hack CTF] Basic_BOF #2 (0) | 2021.03.16 |
[Project H4C] C언어 코딩도장(12) (0) | 2021.03.12 |
[Project H4C] C언어 코딩도장(11) (0) | 2021.03.11 |
[Project H4C] C언어 코딩도장(10) (0) | 2021.03.10 |