吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5777|回复: 20
收起左侧

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

  [复制链接]
Chost 发表于 2020-11-21 00:10
1.      一段具有缓冲区溢出的C代码
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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函数的压栈 image.png 4.      编译代码,用OllyDbg进行加载分析一开始的地址并不是main 函数,所以需要定位到 main 函数的地址 image.png 这个时候把IDA打开,找到main函数,按X键交叉引用一下 image.png 找到调用main函数的地址0x00401804 image.png 5.      OD中按ctrl+G,然后输入地址0x00401804就来到调用main函数的地方 image.png 此处按下F2下断点,然后按F9让程序跳到此处,再F7单步进入main函数里 image.png 结合IDA分析发现地址0x 0040F988是调用func函数的地方,按F8单步步过到 image.png   6.      程序在执行进入CALL的时候,都会将CALL下面那条语句的地址入栈,这样当CALL执行完后,程序再将该地址出栈,这样就能知道下一步应该执行哪条指令。一般将这个地址称为返回地址 image.png call func函数的时候地址0x 0040F98D将被压入栈中,按F7步入 image.png 堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D 7.结合IDA发现地址0x00401091就是strcpy 函数的地方 image.png image.png 观察 strcpy 函数执行前后栈空间的变化,当函数执行完后发现堆栈区 0x0012FF2C 处保存要返回的地址0x 0040F98D已经被覆盖为0x62626262(bbbb) image.png 8.原来它所保存的值为0x 0040F98D,在执行完func函数后,需要执行该地址处的指令。现在栈中的内容变成了比如上图中的 0x62626262,那么当func函数执行完毕后,程序会跳到地址 0x62626262 处继续执行。 image.png image.png 9.根据这个原理,假设覆盖的返回地址是一个有效地址,而该地址又包含有效的指令,那么系统就会跳到该地址去执行指令。IDA中发现exp()函数的地址为0x 00401020,把这个地址覆盖原来的返回地址可以这样修改payload字符串的值,注意大小端的问题 image.png 重新编译程序后载入OD中分析 image.png 当执行完func函数之后,程序成功跳到exp()函数去执行 image.png

免费评分

参与人数 7吾爱币 +13 热心值 +7 收起 理由
飞行者 + 1 + 1 谢谢@Thanks!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
LedZeppelin + 1 + 1 热心回复!
金色传说 + 1 我很赞同!
Victory.ms + 2 + 1 用心讨论,共获提升!
ywj0909 + 1 + 1 用心讨论,共获提升!
fengbolee + 1 + 1 用心讨论,共获提升!

查看全部评分

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

头像被屏蔽
ironhulk 发表于 2020-11-21 08:30
提示: 作者被禁止或删除 内容自动屏蔽
tsecond 发表于 2020-11-21 00:21
SJZXR2006 发表于 2020-11-21 12:50
2016wapjpc 发表于 2020-11-21 13:09
分析的很到位,esp是栈顶,ebp是栈低,esp在在调用时不断变化,ebp也随之调用在提升,然后在call后随ret一步一步返回到原来的ebp
鸭子咯咯哒~ 发表于 2020-11-21 17:01
wow!学习了
awseq 发表于 2020-11-21 17:33
楼主用的是C,python和Java好像缓冲区溢出不是那么常见?
duoyuba 发表于 2020-11-21 21:51
认真认真的看了  还是有些头晕  
cptw 发表于 2020-11-21 22:13
大佬大佬,但没看懂
bingshzl 发表于 2020-11-21 22:53
终于学到了,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-3 08:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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