鱼C论坛

 找回密码
 立即注册
查看: 7854|回复: 32

[技术交流] 【悬赏促学习】栈溢出举例,已提升悬赏金额求精品代码

  [复制链接]
发表于 2011-11-25 12:00:34 | 显示全部楼层 |阅读模式
100鱼币
关于栈溢出,您有何想法?

代码不需要多细腻,需要加点想象力。

来,任你驰骋,鱼币和技术值奖励给想象力最好的鱼油。

“计算机不能正确区分指令与数据,所以当我们把数据作为指令提交给处理器时,它也会很高兴的执行这些“指令”,正是因为这个原因,才使破解目标系统成为可能。”





                               
登录/注册后可看大图
该贴已经同步到 小甲鱼的微博

最佳答案

查看完整内容

栈的示意图这段代码的本意是var[20]的地址加8个字节就是copy函数的返回地址(参考上图)。strcpy由于不会检查长度,所以如果input指向的数组超过了var的长度,是有可能覆盖到copy函数的返回地址的。这个时候copy函数就会返回被覆盖的地址,就是程序中hacked函数的起始地址。 代码不能工作的原因: 1.现在编译分配栈的时候,会预留空间,所以从&var[20] 到函数的返回地址之间会有一段空隙,你用28个字节的数组(数组hackstr后跟了 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-25 12:00:35 | 显示全部楼层
  1. #include <string.h>
  2. #include <stdlib.h>

  3. int copy(char* input)
  4. {
  5.     char var[20];
  6.     strcpy (var, input);
  7.     return 0;
  8. }
  9. int hacked(void)
  10. {
  11.     printf("这里是堆栈溢出程序.看到我了吧.\n");
  12.     exit(0);
  13. }
  14. int main(int argc, char* argv[])
  15. {
  16.     char hackstr[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGG";
  17.     int *eip = (int*)&hackstr[24];        
  18.     *eip = (int)hacked;

  19.     copy(hackstr);
  20.     return 0;
  21. }
复制代码
栈的示意图
  1. _______________
  2. |   arg n       |
  3. ---------------
  4. |               |
  5. |...............|
  6. ---------------
  7. |   arg 2       |
  8. ---------------
  9. |   arg 1       |
  10. ---------------
  11. |   return addr |
  12. ---------------  <----- above is caller's stack frame, below is callee's stack frame
  13. |   %ebp        |
  14. ---------------
  15. |  callee data  |
  16. |               |
  17. |               |
  18. ---------------
  19. |   %esp        |
  20. _______________
复制代码
这段代码的本意是var[20]的地址加8个字节就是copy函数的返回地址(参考上图)。strcpy由于不会检查长度,所以如果input指向的数组超过了var的长度,是有可能覆盖到copy函数的返回地址的。这个时候copy函数就会返回被覆盖的地址,就是程序中hacked函数的起始地址。
代码不能工作的原因:
1.现在编译分配栈的时候,会预留空间,所以从&var[20] 到函数的返回地址之间会有一段空隙,你用28个字节的数组(数组hackstr后跟了一个4字节用于覆盖的地址)不一定能覆盖到返回地址。
2.strcpy函数以'\0'作为结束拷贝的判断条件。你这里在hackstr数组后面加上了4个字节的返回地址,却没有多加一个'\0'作为结束符,很有可能strcpy发生segmentation fault(当然,这个不一定)。应该再加一句hackstr[28] = '\0'

评分

参与人数 1鱼币 +16 收起 理由
小甲鱼 + 16 相当不错!先奖励16鱼币作为鼓励!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-25 12:02:03 | 显示全部楼层
{:1_1:}  要什么的例子?  C还是asm?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-25 12:54:03 | 显示全部楼层
   本人小白 有错的情大神指点: 栈溢出  很容易设计到黑客对其进行溢出攻击  比如C编写的 程序 后台无法检测溢出   需要程序员自我检测 而java却 在编译过程中后台进行溢出检测, 溢出 攻击 是黑客攻击的常用手段!      
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-25 19:51:17 | 显示全部楼层
API的危险函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2011-11-25 21:47:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-11-25 22:49:24 | 显示全部楼层
neur2520 发表于 2011-11-25 21:47
小甲鱼的这个题目算是给我做复习用了,都忘得差不多了,研究了半天,才研究清楚简单介绍下:这个是利用静态 ...

再加上点利用?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-25 23:14:31 | 显示全部楼层
晕死
就这么简单吗
溢出也太简单了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2011-11-25 23:58:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2011-11-26 00:00:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 00:06:35 | 显示全部楼层
我在网吧包夜
溢出我没与研究过
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 00:10:35 | 显示全部楼层
C语言里面的数据类型可以实现溢出吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-11-26 00:53:02 | 显示全部楼层
neur2520 发表于 2011-11-25 23:58
不懂啥意思,是要实现什么功能还是什么?

例如你可以利用溢出,调用另一段代码,或者将某些意图的机器码作为溢出覆盖做成ShellCode?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-11-26 00:53:14 | 显示全部楼层
yulin3192 发表于 2011-11-25 23:14
晕死
就这么简单吗
溢出也太简单了吧

世界上百分之八十的攻击来自于溢出攻击。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 01:00:02 | 显示全部楼层
好可怕
学习学习
得先把基础打好
在去研究溢出吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 12:17:45 | 显示全部楼层
neur2520 发表于 2011-11-25 21:47
小甲鱼的这个题目算是给我做复习用了,都忘得差不多了,研究了半天,才研究清楚简单介绍下:这个是利用静态 ...

呵呵,好久没有联系了哈。
你说的这个不属于“栈溢出”,“栈溢出”前提条件是栈,static局部变量并不产生于栈里。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2011-11-26 12:53:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-11-26 16:17:46 | 显示全部楼层
已经提升悬赏金额,求精品代码~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 17:53:34 | 显示全部楼层
栈溢出就是不顾栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的栈数据。 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2011-11-26 17:54:31 | 显示全部楼层
#include   int main()   {   char name(8);   printf("Please type your name:");   gets(name);   printf("Hello.%s!",name);   return 0;   }   编译并且执行,输入ipxodiAAAAAAAAAAAAAAAA,执行完gets(name)之后,堆栈如下:   内存底部 内存顶部   name EBP ret   <-------[ipxodiAA][AAAA][AAAA]............   ^&name   堆栈顶部 堆栈顶部
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-21 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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