# process
1000000점을 획득해야 while문에서 break하고 reward() 함수를 호출해서 flag를 얻을 수 있다.
그리고 if문 조건에 제시된 단어 하나 당 100점씩 얻게 된다.
하지만 단어 10000개를 줘도 되지 않는다.
다른 방법으로 dword_6024e0 변수를 1000000으로 만들어야 한다.
타겟이 되는 변수는 bss 섹션에 위치한다.
따라서 이 주소가 고정적이다.
gets() 함수의 입력버퍼인 poem의 위치도 확인해보면
bss 섹션에 위치하고 있다.
dword_6024e0과 poem 변수 모두 고정적인 전역변수이다.
&dword_6024e0 - &poem = 0x40
으로 poem+0x40 위치에 dword_6024e0이 위치한다.
즉, gets() 함수로 입력받을 때 dword_6024e0 변수의 값을 제어할 수 있다.
또 get_poem 함수 이후에 get_author 함수에서 unk_6024a0에 gets() 함수로 입력받는데 확인해보면 poem과 같은 주소에 위치한다.
그렇다면 get_poem, get_author의 두 번의 입력이 있는데, 어디에 payload를 전달해야 할까?
디버깅으로 확인해보면, get_poem에서는 버퍼주소가 0x6020a0이고, get_author에서는 입력버퍼주소가 0x6024a0, 즉 우리가 알고있는 unk_6024e0이 위치한 주소이다.
따라서 get_author 함수로 payload를 전달한다.
pay = 'A'*0x40 + p64(1000000)
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./poet")
p = remote("ctf.j0n9hyun.xyz", 3012)
p.sendlineafter("> ", "")
p.sendlineafter("> ", 'A'*0x40 + p64(1000000))
p.interactive()
# exploit
[HackCTF] RTL_Core (0) | 2020.01.08 |
---|---|
[HackCTF] g++pwn (0) | 2020.01.08 |
[HackCTF] RTL_World (0) | 2020.01.02 |
[HackCTF] BOF_PIE (0) | 2020.01.01 |
[HackCTF] offset (0) | 2020.01.01 |