12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 480|回复: 0

栈溢出的利用

[复制链接]
发表于 2019-8-20 11:13:01 | 显示全部楼层 |阅读模式
栈溢出的利用        我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。再进行讲一遍栈溢出的原理。更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。下面的例子代码如下:(代码很简单我不做解释)[C] 纯文本查看 复制代码#include #include#define PASSWORD "qqqqqqq"int verify_password(char *password){    int authenticated;    char buffer[8];    authenticated=strcmp(password,PASSWORD);    strcpy(buffer,password); //构造栈溢出    return authenticated;}int main(){    int valid_flag=0;    char password[1024];    while(1)    {       printf("please input password:     ");       scanf("%s",password);       valid_flag=verify_password(password);       if(valid_flag)       {           printf("incorrect password!\n\n");       }       else       {           printf("Congratulation! you have passed the Verification !\n");           break;       }    }    getchar();    char i;    scanf("%s",&i);} 从上面的例子可以看出是密码有效性的验证的一个例子,是通过输入密码进行验证密码是否输入正确,首先我们现在运行下程序。
通过输入正确密码和不正确密码的区别;输入7个'q'程序正常运行时的栈状态。如下图可以看到栈的内部情况:
如果继续增加输入的字符那么超出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"(测试)。
下面来进行分析:当输入7q时,观察程序返回时堆栈的里面的内容。
下面执行这段代码:4321432143214321432实际的内存状况和我们分析的结论一致,此时的栈状态见。请见下表的内容:
接下来我们用OD来调试下程序的运行过程:
返回地址用于在当前函数返回时重定向程序的代码。在函数返回的"retn"指令执行时,栈顶元素恰好是这个返回地址。"retn"指令会把这个返回地址弹入EIP寄存器,之后跳转到这个地址去 执行。    在这个例子中,返回地址本来是0x040FACB,对应的是main函数代码区的指令,现在我们已经把这个地址用字符的ASCII码覆盖成了0x00323334我们可以从调试器中的显示看出计算机中发生的事件。(1)函数返回时将返回地址装入EIP寄存器。(2)处理器按照EIP寄存器的地址0x00323334取指。(3)内存0x00323334处并没有合法的指令,处理器不知道该如何处理,故报错。由于0x00323334是一个无效的指令地址,所以处理器在取指的时候发生了错误使程序崩溃。但如果这里我们给出一个有效的指令地址,就可以让处理器跳转到任意指令区去执行(比如直接跳转到程序验证通过的部分),也就是说,我们可以通过淹没返回地址而控制程序的执行流程。这时候我们会想到这段代码是进行对密码的验证,如果对了就显示正确信息,如果不对弹出错误消息,这时候我们可以修改这个函数返回地址,直接执行正确信息这样就达到了我们的目的;接下来我们要对程序进行一定的改进。程序代码如下所示:[C] 纯文本查看 复制代码#include #define PASSWORD "1234567"int verify_password (char *password){      intauthenticated;      charbuffer[8];      authenticated=strcmp(password,PASSWORD);      strcpy(buffer,password);//over flowed here!            returnauthenticated;}main(){      intvalid_flag=0;      charpassword[1024];      FILE * fp;      if(!(fp=fopen("password.txt","rw+")))      {             exit(0);      }      fscanf(fp,"%s",password);      valid_flag= verify_password(password);      if(valid_flag)      {             printf("incorrectpassword!\n");      }      else      {             printf("Congratulation!You have passed the verification!\n");      }      fclose(fp);}这段代码主要改进部分是密码是从txt文件中读取出来的不是手动输入了,这样的好处就是能够用UE输入一些16进制来进行修改数据;首先我们将程序载入到OD中,看一下我们要跳转的地方地址在哪里,我们看下面这张图,我们可以清晰的看到我们要返回的地址应该是0x401122这个地址
       这时候我们在程序的同目录下面创建一个password.txt首先前面的东西可以随便输入,还是4321432143214321后面这个就要输入0x401122如下图所示:
这时候可以看一下栈帧情况,栈帧的情况如下图所示:
运行程序看一下结果
OK我们就可以看到我们想要的效果,当然这样修改会有瑕疵,因为没有通过一些手段进行处理,代码里面还存在一些非法的指令因为我们修改了程序的返回地址。由于栈内EBP等被覆盖为无效值,使得程序在退出时堆栈无法平衡,导致崩溃。虽然如此,我们已经成功地淹没了返回地址,并让处理器如我们设想的那样,在函数返回时直接跳转到了提示验证通过的分支。 本节接上篇文章内容。如果大家觉得好可以给点评分,有不对的地方请大家指正。
上一篇地址:http://www.52pojie.cn/thread-349478-1-1.html


来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 15:53 , Processed in 0.093750 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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