昨晚同学问了关于ret2libc时参数布置的问题,今天在此记录
假设熟悉stack overflow
Ps:ret2libc是为了对抗DEP/NX产生
栈的布置
在说明ret2libc之前,栈的布置需要提前说明一下,以以下简单代码为例
#include <stdio.h>
int trap(int x)
{
int y=0;
y+=x;
return y;
}
int main(int argc,char **argv)
{
int z=5;
trap(5);
return 0;
}
在执行trap(5)之后的栈布局就像是这样
注意5是在ebp+8这个位置的。
为了对抗DEP/NX,覆盖后的ret-addr必须是可以执行的内存位置,所以引入了ret2libc。
在libc.so中,有一个system()函数,如果我们能把ret-addr覆盖到这里就好了,system需要一个参数,常见的有”/bin/bash”,这个参数又该放在哪里?
假如我们现在成功的覆盖为system,考虑现在的esp和ebp位置
当下一步pop eip执行之后,我们就会进入到system()
而system()内执行的是
push ebp
mov ebp,esp
...
所以,ebp会指向上方的over flow,所以,在str-addr就是我们要放置”/bin/bash”的地方啦~(ebp+8)
而下方的overflow我们会放置exit()的地址,因为system()执行完毕后,下一个pop eip的就是这里了
既然都说到了ret2libc,那么ROP也不远啦~有空再来说说ROP
详细ret2libc资料,请参考此pdf