首页
社区
课程
招聘
[原创] 唯有逆向,夯实基础
发表于: 2020-1-9 22:04 8930

[原创] 唯有逆向,夯实基础

2020-1-9 22:04
8930

详情:
    ​① 程序返回地址(EBP+4)的重要性

    ​最近复现漏洞让我乐此不疲,是真的好玩!内心的激动简直无法形容,先来看第一个程序:定义了一个Attack函数,里面有一个死循环;main函数里定义了一个整型数组,大小为5个字节,并且全都赋值为0,也叫初始化;后面将Attack(地址值)这个值赋给 arr[6]。


其中有趣的是主函数中并没有去调用Attack函数去执行,但结果令人意外。这个程序竟然可以运行起来,而且它恰好执行了Attack函数,到底发生了什么呢,一探究竟之。


为了知根知底,需要回到汇编层面去研究它,这里列出整个过程,并配以解释。以下是它的反汇编,下面的演示说明都是基于此;


首先,为了了解程序到底干了什么,逆向一般会一步一步解析代码的执行过程,也就是去画堆栈图;

这也是很多野路子突破上层的限制时,寻找突破口的关键。

第一步,记录原始堆栈结构,EBP(栈底)、ESP(栈顶),将这个图想象成没有盖的杯子


第二步,下图中紫色的地方就是我们所熟悉的缓冲区,像缓冲区溢出攻击也就是针对这个区间的,在逆向中,我们总结的经验是( EBP -4) 以下是局部变量,(EBP + 8) 以上是函数参数;这里是说存储的位置


第三步,局部变量初始化


第四步,从下图中,可以发现用红框标注的地方就是重要的点,它就是 EBP + 4 (函数的返回地址),还记得最开始

程序中的那行代码么?  arr[6] = (int)Attack; 就是由于这行代码导致在程序执行的过程中,将Attack函数所在程序的地址

提前压入了堆栈,导致在程序快结束时,由于RETN命令将堆栈里的值弹出来了(RETN的作用如图所示),而且正好就是EIP,即CPU;


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (18)
雪    币: 441
活跃值: (1060)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
栈溢出攻击
2020-1-9 22:25
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
stack overflow ,以往的一些编程时经常会采用这样的方法,因为有些正常途径走,费劲。直接内嵌汇编,跳!
2020-1-10 08:29
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
溢出了
2020-1-11 22:06
0
雪    币: 2222
活跃值: (739)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
nig stack overflow ,以往的一些编程时经常会采用这样的方法,因为有些正常途径走,费劲。直接内嵌汇编,跳!
您好!过去是这样?那现在变成了啥样了。
2020-1-12 02:02
0
雪    币: 5453
活跃值: (1482)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大佬,膜拜下,学习了
2020-1-12 12:00
0
雪    币: 4737
活跃值: (4684)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习啦
2020-1-12 21:53
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
掉头发时,你就不感兴趣了。。。
2020-1-13 00:51
0
雪    币: 2222
活跃值: (739)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
Dstlemoner 掉头发时,你就不感兴趣了。。。
哈哈。
2020-1-13 08:15
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
10
其实我感觉主要是X86设计时的坑,导致这么多缓冲区溢出的漏洞,返回地址居然在栈里,而不是单独搞个寄存器。如果设计时,调用栈和数据栈能分开,估计也能规避这种问题。
2020-1-13 08:52
0
雪    币: 5870
活跃值: (1796)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
“所以为什么会有信息安全,它的本质就是CPU不能区分代码和数据。”

这里需要注意一下,冯诺依曼结构是代码和数据不分的,哈佛不是
2020-1-13 08:53
0
雪    币: 1556
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
就是数组越界写入,突然很好奇算不算编译器的锅
2020-1-13 12:00
0
雪    币: 1440
活跃值: (1350)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
13
NoThx 您好!过去是这样?那现在变成了啥样了。[em_12]
现在有/GS,有个cookie塞在ret地址跟ebp之间
最后于 2020-1-13 14:16 被Black貓①呺编辑 ,原因:
2020-1-13 14:13
0
雪    币: 2222
活跃值: (739)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
bxc 其实我感觉主要是X86设计时的坑,导致这么多缓冲区溢出的漏洞,返回地址居然在栈里,而不是单独搞个寄存器。如果设计时,调用栈和数据栈能分开,估计也能规避这种问题。
听君一席话,胜读十年书。涨思路了
2020-1-13 22:39
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
15
我变强了,也变秃了
2020-1-14 12:31
0
雪    币: 2222
活跃值: (739)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
有毒 我变强了,也变秃了
哈哈,我要变强
2020-1-14 15:29
0
雪    币: 1475
活跃值: (14652)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
17
这。。。看起来像是海哥的课程,很精品的课程,想学逆向一定要耐心看完
2020-1-19 22:32
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
可以
2020-1-19 22:57
0
雪    币: 3797
活跃值: (769)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
专门下了个vc6,没得到期望的溢出,是要设置什么地方吗
2020-6-22 13:34
0
游客
登录 | 注册 方可回帖
返回
//