吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 4586|回复: 26

[其他图文] 栈溢出的利用

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

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

栈溢出的利用

我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。再进行讲一遍栈溢出的原理。更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。    下面的例子代码如下:(代码很简单我不做解释)
  1. #include <stdio.h>
  2. #include<string.h>
  3. #define PASSWORD "qqqqqqq"
  4. int verify_password(char *password)
  5. {
  6.             int authenticated;
  7.             char buffer[8];
  8.             authenticated=strcmp(password,PASSWORD);
  9.             strcpy(buffer,password); //构造栈溢出
  10.             return authenticated;
  11. }
  12. int main()
  13. {
  14.             int valid_flag=0;
  15.             char password[1024];
  16.             while(1)
  17.            {
  18.                         printf("please input password:     ");
  19.                         scanf("%s",password);
  20.                         valid_flag=verify_password(password);
  21.                         if(valid_flag)
  22.                        {
  23.                                    printf("incorrect password!\n\n");
  24.                         }
  25.                        else
  26.                        {
  27.                                    printf("Congratulation! you have passed the Verification !\n");
  28.                                    break;
  29.                        }
  30.            }
  31.            getchar();
  32.            char i;
  33.            scanf("%s",&i);
  34. }
复制代码
从上面的例子可以看出是密码有效性的验证的一个例子,是通过输入密码进行验证密码是否输入正确,首先我们现在运行下程序。

1

1

通过输入正确密码和不正确密码的区别;
输入7个'q'程序正常运行时的栈状态。
如下图可以看到栈的内部情况:

2

2

如果继续增加输入的字符那么超出buffer[8]边界的字符将依次淹没authenticated、前栈帧EBP、返回地址。也就是说,控制好字符串的长度就可以让字符串中相应位置字符的ASCII码覆盖掉这些栈帧状态值。
按照上面对栈帧的分析,可以得出以下的结论:
(1)输入11个'q',第9-11个字符连同NULL结束符将authenticated冲刷为0x00717171。
(2)输入15个'q',第9-12个字符将authenticated冲刷为0x71717171;第13-15个字符连同NULL结束符将前
栈帧EBP冲刷为0x00717171。
(3)输入19个'q',第9-12字符将authenticated冲刷为0x71717171;第13-16个字符连同NULL结束符将前栈
帧EBP冲刷为0x71717171;第17-19个字符连同NULL结束符将返回地址冲刷为0x00717171。
    这里用19个字符作为输入,看看淹没返回地址会对程序产生什么影响。出于双字对齐的目的,我们输
入的字符串按照"4321"为一个单元进行组织,最后输入的字符串为"4321432143214321432"(测试)。

<用OllyDbg加载程序,在字符串拷贝函数调用结束后观察栈状态。>下面来进行分析:

当输入7q时,观察程序返回时堆栈的里面的内容。

3

3

下面执行这段代码:4321432143214321432
实际的内存状况和我们分析的结论一致,此时的栈状态见。请见下表的内容:

4

4

接下来我们用OD来调试下程序的运行过程:

5

5

返回地址用于在当前函数返回时重定向程序的代码。在函数返回的"retn"指令执行时,栈顶元素恰好是这个返回地址。"retn"指令会把这个返回地址弹入EIP寄存器,之后跳转到这个地址去
执行。
    在这个例子中,返回地址本来是0x040FACB,对应的是main函数代码区的指令,现在我们已经把这个地址用字符的ASCII码覆盖成了0x00323334
我们可以从调试器中的显示看出计算机中发生的事件。
(1)函数返回时将返回地址装入EIP寄存器。
(2)处理器按照EIP寄存器的地址0x00323334取指。
(3)内存0x00323334处并没有合法的指令,处理器不知道该如何处理,故报错。
由于0x00323334是一个无效的指令地址,所以处理器在取指的时候发生了错误使程序崩溃。但如果这里我们给出一个有效的指令地址,就可以让处理器跳转到任意指令区去执行(比如直接跳转到程序验证通过的部分),也就是说,我们可以通过淹没返回地址而控制程序的执行流程。
这时候我们会想到这段代码是进行对密码的验证,如果对了就显示正确信息,如果不对弹出错误消息,这时候我们可以修改这个函数返回地址,直接执行正确信息这样就达到了我们的目的;接下来我们要对程序进行一定的改进。
程序代码如下所示:

  1. #include <stdio.h>
  2. #define PASSWORD "1234567"
  3. int verify_password (char *password)
  4. {
  5.         int authenticated;
  6.         char buffer[8];
  7.         authenticated=strcmp(password,PASSWORD);
  8.         strcpy(buffer,password);//over flowed here!        
  9.         return authenticated;
  10. }
  11. main()
  12. {
  13.         int valid_flag=0;
  14.         char password[1024];
  15.         FILE * fp;
  16.         if(!(fp=fopen("password.txt","rw+")))
  17.         {
  18.                 exit(0);
  19.         }
  20.         fscanf(fp,"%s",password);
  21.         valid_flag = verify_password(password);
  22.         if(valid_flag)
  23.         {
  24.                 printf("incorrect password!\n");
  25.         }
  26.         else
  27.         {
  28.                 printf("Congratulation! You have passed the verification!\n");
  29.         }
  30.         fclose(fp);
  31. }
复制代码

这段代码主要改进部分是密码是从txt文件中读取出来的不是手动输入了,这样的好处就是能够用UE输入一些16进制来进行修改数据;首先我们将程序载入到OD中,看一下我们要跳转的地方地址在哪里,我们看下面这张图,我们可以清晰的看到我们要返回的地址应该是0x401122这个地址

6

6

       这时候我们在程序的同目录下面创建一个password.txt首先前面的东西可以随便输入,还是4321432143214321后面这个就要输入0x401122如下图所示:

7

7

这时候可以看一下栈帧情况,栈帧的情况如下图所示:

8

8

运行程序看一下结果

9

9

OK我们就可以看到我们想要的效果,当然这样修改会有问题存在,因为没有通过一些手段进行处理,代码里面还存在一些非法的指令因为我们修改了程序的返回地址。由于栈内EBP等被覆盖为无效值,使得程序在退出时堆栈无法平衡,导致崩溃。虽然如此,我们已经成功地淹没了返回地址,并让处理器如我们设想的那样,在函数返回时直接跳转到了提示验证通过的分支。

上一篇地址:https://www.52hb.com/thread-8692-1-1.html
本篇文章接上一节内容。如果觉得还可以可以给点评分。









评分

参与人数 34威望 +1 HB +71 THX +24 收起 理由
lies + 1
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
Jawon + 2
24567 + 1
太阳神 + 2 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
Soul1999 + 1
shaokui123 + 1
极速菜 + 1
消逝的过去 + 1
l278785481 + 1
jaunic + 2
hackysh + 1
hnymsh + 2
muker + 1
十月 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
初亦泽 + 1 + 1 温馨提示:自2014.12.01起,严抓悬赏问答区“答非所问”现象,故收回所得积
羽懿521 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
m0bil3_xT + 1 + 1 看不懂,但是觉得很牛逼
有何不可 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
虚竹 + 10 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
kangda666 + 1 评分=感恩!简单却充满爱!感谢您的作品!
快乐の神 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
kang + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!
Shark恒 + 10 + 1 小丁讲解的就是详细!
China小二 + 4 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Scar-疤痕 + 3 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
cyx520 + 2 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
雪里红 + 1 + 1 好人有好报!你的热心我永远不忘!谢谢!
duanbin109 + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
zx2cwf + 3 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
Shark_鹏 + 1 + 10 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
DaoGod + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!

查看全部评分

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

不错   要是能录成视频 更棒
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
duanbin109 发表于 2015-4-8 15:58 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2015-4-8 16:58 | 显示全部楼层

期待楼主能录个视频教程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| BattleHeart 发表于 2015-4-8 16:59 | 显示全部楼层

哈哈~统一回复下哈~最近么有太多时间出视频。出视频太费精力了,写这个写了很久的。哎~~~望大家体谅~
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Shark恒 发表于 2015-4-8 17:11 | 显示全部楼层

小丁讲解的就是详细!必须赞!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| BattleHeart 发表于 2015-4-8 18:27 | 显示全部楼层

Shark恒 发表于 2015-4-8 17:11
小丁讲解的就是详细!必须赞!

哈哈~恒大过奖了~呵呵
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
鏖杀公 发表于 2015-4-8 18:38 | 显示全部楼层

学习了,虽然我新手看不太明白...
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
CKX 发表于 2015-4-8 23:13 | 显示全部楼层

很详细,很好的教程!谢谢楼主!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!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

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