吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 3404|回复: 24

[其他图文] 初步认识栈溢出漏洞

  [复制链接]
BattleHeart 发表于 2015-4-8 13:23 | 显示全部楼层 |阅读模式

本帖最后由 BattleHeart 于 2015-4-8 15:15 编辑

初步认识栈溢出漏洞
1.   什么是栈?
栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。栈的作用如同一个缓冲区,保存着函数所需的所有信息。在函数的开始时候产生栈,并在函数的结束时候释放它。栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。
2.   缓冲溢出分为两种,一种是栈溢出,一种是堆溢出。
3.   如何找到栈?
EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。
ESP:扩展栈指针。这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。
EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。
4.   通过实践来进行处理
首先演示一下栈的形成:下面是以下代码;

  1. #include<stdio.h>
  2. int main()
  3. {
  4.       _asm
  5.      {
  6.          push 0x12345678
  7.          pop eax
  8.      }
  9. }
复制代码

我们可以在VC++6.0 进行调试来观察一下esp和eip以及ebp的状态变化;

1

1

我们F11来进行跟进下,就会发现esp栈顶指针会跟随变化,因为我们向栈中压人了12345678这样四个字节的数据,指针会减小4个字节的。

2

2

而我们pop的时候就会发现栈顶指针就变大成为了原来的样子。这就告诉我们一个道理栈中压人数据的时候栈顶指针是变小的,而弹出栈的时候栈顶指针是变大的。也就是栈底地址高于栈顶地址。
接下来演示函数内栈的调用过程。

3

3

首先没有进入到overflow函数里面的的时候ebp和esp都是有值得,说明外面的main函数也有栈的实现。我们反汇编看一下具体栈的实现。F11单步走一下就会发现一个跳转jmp跳转到函数overflow。

4

4

这时候后我们单步运行F11。

  1. 00401020   push        ebp
  2. 00401021   mov         ebp,esp
  3. 00401023   sub         esp,44h
  4. 00401026   push        ebx
  5. 00401027   push        esi
  6. 00401028   push        edi
  7. 00401029   lea         edi,[ebp-44h]
  8. 0040102C   mov         ecx,11h
  9. 00401031   mov         eax,0CCCCCCCCh
  10. 00401036   rep stos    dword ptr [edi]
  11. 5:        int our=0;
  12. 00401038   mov         dword ptr [ebp-4],0
  13. 6:        return;
复制代码

      就会看到如上代码,这时候我们来进一步分析一下。首先它将ebp指针压人栈内,将当前的esp指向的地址给了ebp,这时候esp减小了44h,这时候在堆栈中又开辟了一个长度为44h的一个新的栈空间。从我们分析可以得出dwordptr[ebp-4]0这个局部变量是存放在新的栈空间里面的。ebp-4远远小于44h空间大小。局部变量是存放在栈中的。
通过这个例子我们可以得出一个结论就是:
栈中存放的数据是什么?
      如果程序要调用某个函数,那么计算机就会自动将函数返回后执行的指令地址先压入栈里,等函数调用完之后再从中取出,跳转到该处执行。
溢出的原因?
      正式因为先放入栈的地址在前,而后放入栈的数据一旦过长,就会覆盖到前面的地址这就会导致程序发生错误。
下面来看一下如下的例子来演示栈溢出现象;

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<windows.h>
  4. void overflow(char *buf)
  5. {
  6.         char des[5]="";
  7.         strcpy(des,buf);
  8.         return;
  9. }
  10. void main(int argc,char *argc[])
  11. {
  12.         LoadLibrary("user32.dll");
  13.         char longbuf[100]="aaaaaaaaaaaabbbbcccccccccccc";
  14.         overflow(longbuf);
  15.         return;
  16. }
复制代码

程序一运行就会停止工作:

5

5

下面我们来但不跟踪一下程序:

6

6

首先先把函数下一个地址以及参数压入栈中:

7

7

这时候但不运行到了strcopy这里:这是我们会发现将参数的值出来放在寄存器edx里面了,请看下面图:48 FF 18 00

8

8

这时候将程序运行到了ret的时候发现程序被strcopy给覆盖了。

9

9

返回地址变成了62626262
这是返回地址是错误的所以就会爆出该内存不可读之类的错误提示。
接下来的操作就是将溢出的地址跳转到一个地方然后对让它执行我们要执行的操作,执行完之后再跳转回真实的返回地址就达到了我们想要的目的。
我们分两个环节来讲。上面讲述的是栈溢出的原理,下面的一个章节用来将栈溢出的利用。

下篇地址:https://www.52hb.com/thread-8694-1-1.html

很久没有写东西了,我又出来冒个泡,希望大家能够喜欢这个教程~







评分

参与人数 39威望 +1 HB +84 THX +29 收起 理由
lies + 1
sjtkxy + 1 + 1
Jawon + 2
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
Soul1999 + 1
消逝的过去 + 1
l278785481 + 1
jaunic + 2
我是好人 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
ldljlzw + 1
kdayjj966 + 2 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
hackysh + 1
hnymsh + 2
小柯师傅 + 1 + 1 我收藏了!
十月 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
luojianeng + 2 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
wo6526891 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
梦游枪手 + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
明明是错 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
有何不可 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
向往神鹰 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
彡墨鱼灬丶 + 5 + 1 好人有好报!你的热心我永远不忘!谢谢!
China小二 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
虚竹 + 5 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
忆晨轩 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Griselda + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
vigers + 2 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
小泉 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
2573668719 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!
Shark恒 + 10 + 1 小丁讲解的就是详细!
Scar-疤痕 + 3 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
trustguan + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
雪里红 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
zx2cwf + 3 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark_鹏 + 1 + 10 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
DaoGod + 1 + 1 好人有好报!你的热心我永远不忘!谢谢!
逆逆风 + 2 + 1 好人有好报!你的热心我永远不忘!谢谢!
陈雨馨 + 6 评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
童话Wayn 发表于 2015-4-8 13:33 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
千千万是福朋友 发表于 2015-4-8 14:47 | 显示全部楼层

很好的内容,现在还看不懂
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zx2cwf 发表于 2015-4-8 15:39 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2015-4-8 16:57 | 显示全部楼层

楼主再出个视频教程就完美了
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2015-4-8 17:10 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
vigers 发表于 2015-4-8 20:30 | 显示全部楼层

看的云里雾里
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
彡墨鱼灬丶 发表于 2015-4-9 00:16 | 显示全部楼层

这种基础性资料最好了,进来充电
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
梦游枪手 发表于 2015-4-9 12:41 | 显示全部楼层

哈哈,教程不错,赞一个
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
luojianeng 发表于 2015-4-9 21:35 | 显示全部楼层

我也晕了 = =
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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