免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2632 | 回复: 7
打印 上一主题 下一主题

一个简单的溢出程序问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-06 17:17 |只看该作者 |倒序浏览
貌似没有汇编板块,就来这里了,相信这里很多C高手汇编也不陌生。
最近想学下溢出,不过我汇编基本也就知道点零星概念,拿了本《网络渗透技术》,想法是边看边学汇编吧,现在里面第一个例子我这里就不成功。代码如下


#include        <stdio.h>
#include        <string.h>
char largebuff[]  = "1234512345123451234512345===ABCD";
int main(main)
{
&nbsp;&nbsp;&nbsp;&nbsp;char smallbuff[16];
&nbsp;&nbsp;&nbsp;&nbsp;strcpy (smallbuff, largebuff);

}


这个程序很简单,正常应该是eip被改为ox44434241(即DCBA)但是我用GDB执行的时候结果是这样的:

bruce@ubuntu8:~/code/overflow$ gdb simple_overflow
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) r
Starting program: /home/bruce/code/overflow/simple_overflow
*** stack smashing detected ***: /home/bruce/code/overflow/simple_overflow terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x4[0xb7eb3138]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7eb30f0]
/home/bruce/code/overflow/simple_overflow[0x8048404]
[0x44434241]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 92601      /home/bruce/code/overflow/simple_overflow
08049000-0804a000 rw-p 00000000 08:01 92601      /home/bruce/code/overflow/simple_overflow
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7dba000-b7dc4000 r-xp 00000000 08:01 748268     /lib/libgcc_s.so.1
b7dc4000-b7dc5000 rw-p 0000a000 08:01 748268     /lib/libgcc_s.so.1
b7dc5000-b7dc6000 rw-p b7dc5000 00:00 0
b7dc6000-b7f0f000 r-xp 00000000 08:01 765232     /lib/tls/i686/cmov/libc-2.7.so
b7f0f000-b7f10000 r--p 00149000 08:01 765232     /lib/tls/i686/cmov/libc-2.7.so
b7f10000-b7f12000 rw-p 0014a000 08:01 765232     /lib/tls/i686/cmov/libc-2.7.so
b7f12000-b7f15000 rw-p b7f12000 00:00 0
b7f21000-b7f23000 rw-p b7f21000 00:00 0
b7f23000-b7f24000 r-xp b7f23000 00:00 0          [vdso]
b7f24000-b7f3e000 r-xp 00000000 08:01 748269     /lib/ld-2.7.so
b7f3e000-b7f40000 rw-p 00019000 08:01 748269     /lib/ld-2.7.so
bf900000-bf915000 rw-p bffeb000 00:00 0          [stack]

Program received signal SIGABRT, Aborted.
0xb7f23410 in __kernel_vsyscall ()
(gdb) i reg
eax            0x0        0
ecx            0x389e        14494
edx            0x6        6
ebx            0x389e        14494
esp            0xbf912e58        0xbf912e58
ebp            0xbf912e74        0xbf912e74
esi            0x0        0
edi            0xb7f10ff4        -1208938508
eip            0xb7f23410        0xb7f23410 <__kernel_vsyscall+16>
eflags         0x246        [ PF ZF IF ]
cs             0x73        115
ss             0x7b        123
ds             0x7b        123
es             0x7b        123
fs             0x0        0
gs             0x33        51
(gdb)

eip没有被改为想象中的值,这是为什么呢?是现在的CPU阻止了溢出吗?
程序环境ubuntu8.04(2.6.24-19) gcc  4.2.4 intel Core2 Duo T7250 2G RAM,系统是个VMWARE虚拟机

论坛徽章:
0
2 [报告]
发表于 2009-01-06 17:41 |只看该作者
eip指向的是代码段,你溢出的是数据段,两者不是紧挨着的。

论坛徽章:
0
3 [报告]
发表于 2009-01-06 21:21 |只看该作者
原帖由 Hawkfly 于 2009-1-6 17:17 发表
貌似没有汇编板块,就来这里了,相信这里很多C高手汇编也不陌生。
最近想学下溢出,不过我汇编基本也就知道点零星概念,拿了本《网络渗透技术》,想法是边看边学汇编吧,现在里面第一个例子我这里就不成功。代 ...



不是 cpu 有防止溢出保护功能,而是 gcc 额外为 main() 安装了防止溢出而造成破坏的功能。

详见: http://bbs.chinaunix.net/viewthread.php?tid=1244823

论坛徽章:
0
4 [报告]
发表于 2009-01-06 21:56 |只看该作者
好像根本原因就是覆盖eip,到ret的时候返回到一个错误的地址

函数调用的时候会产生这样的栈结构:

var2
var1
ebp
ret_addr
param1
param2

如果你向var1复制字符串的时候,多了8个字节的话,此时刚好能将ret_addr覆盖

这样的溢出错误要防止,尽量使用那些安全的库函数
<0day安全:软件漏洞分析>中好像说vs中加了/GS选项,能将安全性提高很多,什么DWORD SHOOT都不管用了

论坛徽章:
0
5 [报告]
发表于 2009-01-07 10:50 |只看该作者
原帖由 mik 于 2009-1-6 21:21 发表



不是 cpu 有防止溢出保护功能,而是 gcc 额外为 main() 安装了防止溢出而造成破坏的功能。

详见: http://bbs.chinaunix.net/viewthread.php?tid=1244823


不知道我理解的对不对,如果是针对main()做了溢出保护,能不能把溢出这部分单独写一个函数在main()里面调用?这样和直接写在main()里面有区别吗?我试了一下

#include        <stdio.h>
#include        <string.h>
char largebuff[]  = "1234512345123451234512345===ABCD";
char a(void)
{
    char smallbuff[16];
    strcpy (smallbuff, largebuff);
   
}
int main(void)
{
  char a();
  

}


gdb出现这样的提示

(gdb) r
Starting program: /home/bruce/code/overflow/simple_overflow

Program exited with code 01.
google了一下,没找到什么有用的信息
没什么写程序的底子,不知道这个问题是不是太弱智

论坛徽章:
0
6 [报告]
发表于 2009-01-07 10:56 |只看该作者
原帖由 GodPig 于 2009-1-6 21:56 发表
好像根本原因就是覆盖eip,到ret的时候返回到一个错误的地址

函数调用的时候会产生这样的栈结构:

var2
var1
ebp
ret_addr
param1
param2

如果你向var1复制字符串的时候,多了8个字节的话,此时刚 ...


搜了一下这本书,貌似不错,买一本回来学习

论坛徽章:
0
7 [报告]
发表于 2009-01-07 17:15 |只看该作者
原帖由 Hawkfly 于 2009-1-6 17:17 发表
貌似没有汇编板块,就来这里了,相信这里很多C高手汇编也不陌生。
最近想学下溢出,不过我汇编基本也就知道点零星概念,拿了本《网络渗透技术》,想法是边看边学汇编吧,现在里面第一个例子我这里就不成功。代 ...



不同的平台下会有些区别,用GDB设一下断点,观察栈的变化看的更清楚一些.

论坛徽章:
0
8 [报告]
发表于 2009-01-07 17:19 |只看该作者

回复 #7 system888net 的帖子

比如redhat 企业5.0下程序崩溃时GDB 所看到的eip 会是ret的地址...。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP