吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 1027|回复: 20
上一主题 下一主题

[漏洞分析] 简单的【缓冲区溢出原理】(一)

  [复制链接]
跳转到指定楼层
楼主
Chost 发表于 2020-11-21 00:10 回帖奖励
1.      一段具有缓冲区溢出的C代码
[Asm] 纯文本查看 复制代码
#include "stdio.h"

#include "string.h"

#include <windows.h>

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函数的压栈 4.      编译代码,用OllyDbg进行加载分析一开始的地址并不是main 函数,所以需要定位到 main 函数的地址 这个时候把IDA打开,找到main函数,按X键交叉引用一下 找到调用main函数的地址0x00401804 5.      OD中按ctrl+G,然后输入地址0x00401804就来到调用main函数的地方 此处按下F2下断点,然后按F9让程序跳到此处,再F7单步进入main函数里 结合IDA分析发现地址0x 0040F988是调用func函数的地方,按F8单步步过到   6.      程序在执行进入CALL的时候,都会将CALL下面那条语句的地址入栈,这样当CALL执行完后,程序再将该地址出栈,这样就能知道下一步应该执行哪条指令。一般将这个地址称为返回地址 call func函数的时候地址0x 0040F98D将被压入栈中,按F7步入 堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D 7.结合IDA发现地址0x00401091就是strcpy 函数的地方 观察 strcpy 函数执行前后栈空间的变化,当函数执行完后发现堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D已经被覆盖为0x62626262(bbbb) 8.原来它所保存的值为0x 0040F98D,在执行完func函数后,需要执行该地址处的指令。现在栈中的内容变成了比如上图中的 0x62626262,那么当func函数执行完毕后,程序会跳到地址 0x62626262 处继续执行。 9.根据这个原理,假设覆盖的返回地址是一个有效地址,而该地址又包含有效的指令,那么系统就会跳到该地址去执行指令。IDA中发现exp()函数的地址为0x 00401020,把这个地址覆盖原来的返回地址可以这样修改payload字符串的值,注意大小端的问题 重新编译程序后载入OD中分析 当执行完func函数之后,程序成功跳到exp()函数去执行

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
金色传说 + 1 我很赞同!
Victory.ms + 2 + 1 用心讨论,共获提升!
ywj0909 + 1 + 1 用心讨论,共获提升!
fengbolee + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
ironhulk 发表于 2020-11-21 08:30
楼主最好说明什么编译环境和注意事项,不然像我们初学者按照这个步骤学习,突然遇到一个DEP或者SEHOP之类的,就会回头怀疑自己。。。
感谢楼主分享
推荐
doctordc 发表于 2020-11-22 16:24
楼主讲的非常好!不过有一个问题就是,就是64位下同样的代码还能这样操作溢出吗?我试了好像只会报段错误,可能是原理有些不同了吧?
沙发
tsecond 发表于 2020-11-21 00:21
4#
留下平凡的一生 发表于 2020-11-21 11:17
大佬大佬
5#
SJZXR2006 发表于 2020-11-21 12:50
大佬,顶起。
6#
2016wapjpc 发表于 2020-11-21 13:09
分析的很到位,esp是栈顶,ebp是栈低,esp在在调用时不断变化,ebp也随之调用在提升,然后在call后随ret一步一步返回到原来的ebp
7#
鸭子咯咯哒~ 发表于 2020-11-21 17:01
wow!学习了
8#
awseq 发表于 2020-11-21 17:33
楼主用的是C,python和Java好像缓冲区溢出不是那么常见?
9#
duoyuba 发表于 2020-11-21 21:51
认真认真的看了  还是有些头晕  
10#
cptw 发表于 2020-11-21 22:13
大佬大佬,但没看懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2020-11-24 18:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表