Hack CTF – poet
Execute
파일을 실행시키면 시의 내용을 입력받고 시의 저자를 입력받는다. 그럼 점수와 아까 입력한 시의 내용을 출력해주는데 1,000,000점을 획득하라고 한다. 이부분만 봐서는 별로 할 수 있는게 없는것 같다.
Analyze
메모리 보호기법을 확인해보면 NXbit만 걸려있는 것을 확인 할 수 있다.
Main
main함수는 크게 별다른 동작을 하지 않고 각각의 함수들을 호출해주고 dword_6024E0의 값이 100000인 경우 break한다. 그리고 reward함수를 실행해준다.
Get_poem
해당함수에서는 시의 내용을 입력 받는 부분이다. get함수를 통해 poem 전역변수에 입력을 받는것을 확인 할 수 있다. 또한 dword_6024E0을 0으로 초기화해준다.
Get_author
get함수를 통해 &unk_6024A0 전역변수에 입력을 받는다.
Rate_poem
- Line 6 : strcpy함수를 통해 dest에 poem의 내용을 복사해준다.
- Line 7 : for문으로 걸려있다. S1이 0일때까지 반복하며 s1은 strtok함수를 통해 문자열을 잘라준다.
- Line 9~18 : s1이 특정 조건에 맞을 경우 dword_6024E0변수의 값을 100 증가 시켜준다.
reward
Flag를 출력해주는 함수임을 알 수 있다.
Solve
reward함수의 실행조건이 dword_6024E0값이 1,000,000이 되어야한다. 해당 변수는 전역변수로 선언 되어있는데 앞서 확인 한 것 처럼 gets함수들이 다른 전역변수를 입력받는다.
따라서 buffer overflow가 발생하는데 실제 공격이 가능한지 확인하기위해 bss영역을 확인해보자.
unk_6024A0에서 dummy를 계속 넣어주어 dword_6024E0을 조작할 수 있음을 확인하였다. 따라서 둘사이의 거리를 계산해보자.
둘 사이의 거리는 0x40(64)임을 확인 할 수 있다. 따라서 64개의 dummy와 1,000,000을 입력해준다면 문제를 해결 할 수 있을 것이다.
Exploit은 아래와 같다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3012)
p.recvuntil("> ")
p.sendline("aaaaaaaaaa")
p.recvuntil("> ")
payload = b"a"*64
payload += p64(1000000)
p.sendline(payload)
p.interactive()
성공적으로 flag를 획득할 수 있었다.
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF - look at me] (0) | 2021.01.21 |
---|---|
[Hack CTF - RTL_core] (0) | 2021.01.16 |
[Hack CTF - g++pwn] (1) | 2021.01.11 |
[Hack CTF - RTL_World] (2) | 2021.01.10 |
[Hack CTF - yes or no] (0) | 2021.01.09 |