pwn中直接调用(plt)system函数和调用call system函数区别
pwn中直接调用(plt)system函数和调用call system函数区别
溢出大概有两种形式
直接调用system函数,就是plt表的system函数
1 | payload = padding + p64(system_addr)+p64(1)+p64(binsh_addr) |
调用call system
1 | payload = padding + p64(call_system_addr)+p64(binsh_addr) |
可以看出上述两种情况只差了一个p64(1)。
其实这个p64(1)的作用是相当于一个返回地址。
为什么?
先回顾一下函数调用过程,比如说我们要调用system(‘/bin/sh’)。
首先程序在编译这一步,实际上执行的是:
1 | lea eax, [address_binsh_str] |
call指令其实还有两步:
1 | push ip ;执行system_addr之后的返回地址 |
因此,直接调用system函数时,在system地址后面要接上一个返回地址,再接上system函数的参数。
而如果调用的是call system的话,返回到call system之后,才会执行push ip
的操作,这个时候的push操作不需要我们关心,因此payload直接就是call_system_addr + binsh_addr
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 z0yuan's Blog!