java 缓冲区溢出_简单的【缓冲区溢出原理】(一)

本文详细解析了一段具有缓冲区溢出问题的C代码,通过OllyDbg和IDA Pro工具进行动态和静态分析,展示了如何利用溢出覆盖返回地址来执行任意代码。通过对栈空间变化的观察,解释了缓冲区溢出的原理,并演示了如何通过修改payload来控制程序流程,最终成功触发了exp()函数的执行。
摘要由CSDN通过智能技术生成

1.      一段具有缓冲区溢出的C代码

[Asm] 纯文本查看 复制代码#include "stdio.h"

#include "string.h"

#include

char payload[] = "aaaaaaaabbbbbbbbbbbbxxxx";

void exp()

{

system("whoami");

}

void func()

{

char buffer[8];

strcpy(buffer,payload);

printf("%s",buffer);

}

int main(){

func();

getchar();

return 0;

}2.      原因是strcpy()函数没有检查copy的长度而导致的溢出简单的说缓冲区溢出漏洞的原理就是因为输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符将返回地址覆盖掉,当函数需要返回的时候,由于此时的返回地址是一个无效地址,因此导致程序出错。利用:假设所覆盖的返回地址是一个有效地址,而在该地址处又包含着有效的指令,那么系统就会毫不犹豫地跳到该地址去执行指令。3.      调用func函数的压栈

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (37.74 KB, 下载次数: 0)

2020-11-20 23:54 上传

4.      编译代码,用OllyDbg进行加载分析一开始的地址并不是main 函数,所以需要定位到 main 函数的地址

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (290.71 KB, 下载次数: 0)

2020-11-20 23:55 上传

这个时候把IDA打开,找到main函数,按X键交叉引用一下

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (70.02 KB, 下载次数: 0)

2020-11-20 23:56 上传

找到调用main函数的地址0x00401804

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (74.46 KB, 下载次数: 0)

2020-11-20 23:56 上传

5.      在OD中按ctrl+G,然后输入地址0x00401804就来到调用main函数的地方

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (189.84 KB, 下载次数: 0)

2020-11-20 23:57 上传

此处按下F2下断点,然后按F9让程序跳到此处,再F7单步进入main函数里

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (185.68 KB, 下载次数: 0)

2020-11-20 23:57 上传

结合IDA分析发现地址0x 0040F988是调用func函数的地方,按F8单步步过到

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (238.92 KB, 下载次数: 0)

2020-11-20 23:58 上传

6.      程序在执行进入CALL的时候,都会将CALL下面那条语句的地址入栈,这样当CALL执行完后,程序再将该地址出栈,这样就能知道下一步应该执行哪条指令。一般将这个地址称为“返回地址”

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (234.26 KB, 下载次数: 0)

2020-11-20 23:58 上传

当call func函数的时候地址0x 0040F98D将被压入栈中,按F7步入

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (228.42 KB, 下载次数: 0)

2020-11-20 23:59 上传

堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D 7.结合IDA发现地址0x00401091就是strcpy 函数的地方

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (137.27 KB, 下载次数: 0)

2020-11-20 23:59 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (139.83 KB, 下载次数: 0)

2020-11-21 00:00 上传

观察 strcpy 函数执行前后栈空间的变化,当函数执行完后发现堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D已经被覆盖为0x62626262(bbbb)

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (187.33 KB, 下载次数: 0)

2020-11-21 00:00 上传

8.原来它所保存的值为0x 0040F98D,在执行完func函数后,需要执行该地址处的指令。现在栈中的内容变成了比如上图中的 0x62626262,那么当func函数执行完毕后,程序会跳到地址 0x62626262 处继续执行。

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (230.55 KB, 下载次数: 0)

2020-11-21 00:01 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (63.72 KB, 下载次数: 0)

2020-11-21 00:02 上传

9.根据这个原理,假设覆盖的返回地址是一个有效地址,而该地址又包含有效的指令,那么系统就会跳到该地址去执行指令。在IDA中发现exp()函数的地址为0x 00401020,把这个地址覆盖原来的返回地址可以这样修改payload字符串的值,注意大小端的问题

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (47.88 KB, 下载次数: 0)

2020-11-21 00:02 上传

重新编译程序后载入OD中分析

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (142.89 KB, 下载次数: 0)

2020-11-21 00:03 上传

当执行完func函数之后,程序成功跳到exp()函数去执行

55fd2b2273b5a8b4531f72773c469d6e.gif

image.png (140.49 KB, 下载次数: 0)

2020-11-21 00:03 上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值