首页
社区
课程
招聘
[求助]问一个弱弱的问题,关于linux下这样的情况,还能否进行栈溢出的?
发表于: 2018-2-27 17:12 4171

[求助]问一个弱弱的问题,关于linux下这样的情况,还能否进行栈溢出的?

2018-2-27 17:12
4171

程序代码如下:

#include <string.h>

int main(int argc,char *argv[]){
char buffer[5]; //缓冲区大小为5
strcpy(buffer,argv[1]); //发生缓冲区溢出的语句
return 0;
}
在64位上编译,
系统版本是
[admin@bogon ctf_stack]$cat /etc/redhat-release
Fedora release 23 (Twenty Three)
一切配置都是新安装系统的默认配置
编译
[admin@bogon ctf_stack]gcc -o vuln vuln.c
执行的结果:
[admin@bogon ctf_stack]$ ./vuln `perl -e 'print "A"x22'`
[admin@bogon ctf_stack]$ ./vuln `perl -e 'print "A"x23'`
[admin@bogon ctf_stack]$ ./vuln `perl -e 'print "A"x24'`
Segmentation fault (core dumped)
[admin@bogon ctf_stack]$ ./vuln `perl -e 'print "A"x25'`
Segmentation fault (core dumped)
可以看到,当argv[1]长度为23时,程序是可以正常运行的,但到了24的时候,就会报Segmentation fault了。未发现illegal instruction之类的提示。这样是不是就无法当作溢出漏洞利用了?
gdb里面跟踪长度为24时的报错信息为:

[admin@bogon ctf_stack]$ gdb -q ./vuln
Reading symbols from ./vuln...done.
(gdb) r `perl -e 'print "A"x24'`
Starting program: /home/songkun/ctf_stack/vuln `perl -e 'print "A"x24'`

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a3b500 in __libc_start_main (main=0x400536 <main>, argc=2, argv=0x7fffffffe3a8, init=0x4141414141414141,
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe398) at libc-start.c:245
245         (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
(gdb) i r rip
rip            0x7ffff7a3b500   0x7ffff7a3b500 <__libc_start_main+112>
(gdb) x/i 0x7ffff7a3b500
=> 0x7ffff7a3b500 <__libc_start_main+112>:      add    %cl,-0x75(%rax)

(gdb)i r rax

rax            0x0      0
(gdb) disass
Dump of assembler code for function __libc_start_main:
   0x00007ffff7a3b490 <+0>:     push   %r14
   0x00007ffff7a3b492 <+2>:     push   %r13
   0x00007ffff7a3b494 <+4>:     push   %r12
   0x00007ffff7a3b496 <+6>:     push   %rbp
   0x00007ffff7a3b497 <+7>:     mov    %rcx,%rbp
   0x00007ffff7a3b49a <+10>:    push   %rbx
   0x00007ffff7a3b49b <+11>:    sub    $0x90,%rsp
   0x00007ffff7a3b4a2 <+18>:    mov    0x39a90f(%rip),%rax        # 0x7ffff7dd5db8
   0x00007ffff7a3b4a9 <+25>:    mov    %rdi,0x18(%rsp)
   0x00007ffff7a3b4ae <+30>:    mov    %esi,0x14(%rsp)
   0x00007ffff7a3b4b2 <+34>:    mov    %rdx,0x8(%rsp)
   0x00007ffff7a3b4b7 <+39>:    test   %rax,%rax
   0x00007ffff7a3b4ba <+42>:    je     0x7ffff7a3b587 <__libc_start_main+247>
   0x00007ffff7a3b4c0 <+48>:    mov    (%rax),%eax
   0x00007ffff7a3b4c2 <+50>:    xor    %edx,%edx
   0x00007ffff7a3b4c4 <+52>:    test   %eax,%eax
   0x00007ffff7a3b4c6 <+54>:    sete   %dl
   0x00007ffff7a3b4c9 <+57>:    lea    0x39abd0(%rip),%rax        # 0x7ffff7dd60a0 <__libc_multiple_libcs>
   0x00007ffff7a3b4d0 <+64>:    test   %r9,%r9
   0x00007ffff7a3b4d3 <+67>:    mov    %edx,(%rax)
   0x00007ffff7a3b4d5 <+69>:    je     0x7ffff7a3b4e3 <__libc_start_main+83>
   0x00007ffff7a3b4d7 <+71>:    xor    %edx,%edx
   0x00007ffff7a3b4d9 <+73>:    xor    %esi,%esi
   0x00007ffff7a3b4db <+75>:    mov    %r9,%rdi
   0x00007ffff7a3b4de <+78>:    callq  0x7ffff7a54850 <__GI___cxa_atexit>
   0x00007ffff7a3b4e3 <+83>:    mov    0x39a976(%rip),%rdx        # 0x7ffff7dd5e60
   0x00007ffff7a3b4ea <+90>:    mov    (%rdx),%ebx
   0x00007ffff7a3b4ec <+92>:    and    $0x2,%ebx
   0x00007ffff7a3b4ef <+95>:    jne    0x7ffff7a3b5c6 <__libc_start_main+310>
   0x00007ffff7a3b4f5 <+101>:   test   %rbp,%rbp
   0x00007ffff7a3b4f8 <+104>:   je     0x7ffff7a3b50f <__libc_start_main+127>
---Type <return> to continue, or q <return> to quit---
   0x00007ffff7a3b4fa <+106>:   mov    0x39a9a7(%rip),%rax        # 0x7ffff7dd5ea8//未找到偏移为112的指令
   0x00007ffff7a3b501 <+113>:   mov    0x8(%rsp),%rsi



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
2
能不能利用要看有没有开保护,一个过于简单的程序是比较难找到能利用的gadget的。
栈溢出本来就是seg  fault,就算是illegal指令好像也是seg  fault。
2018-2-27 18:51
0
雪    币: 842
活跃值: (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是,如果填充的字符串正好溢出到当前函数的返回地址,那么当当前函数执行完返回时就会提示illegal  instruction,而segment  fault如上面例子的情况是因为引用了不能引用的内存。
而且,这个例子是个很明显的存在溢出的程序,所以才想问一下这样的程序为啥就不能溢出呢?
最后于 2018-2-28 17:48 被lishua编辑 ,原因:
2018-2-28 17:47
0
雪    币: 60
活跃值: (414)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
4
通常0x41414141不会是合法地址,连fetch都无法就会马上seg  fault,自然也不会有illegal  instruction错误

你真的有成功exploit任何一个简单的小程式吗?如果有的话应该会知道0x41414141之类的overwrite return address後会seg fault(如一楼所说),而不会跑出什麽illegal instruction
最后于 2018-3-1 00:09 被返無歸一编辑 ,原因:
2018-3-1 00:06
0
雪    币: 842
活跃值: (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢,我只是印象中0x41414141会报illegal  instruction,看了一下这个帖子https://bbs.pediy.com/thread-216868.htm,发现是自己记得不准确,确实直接报segment  fault了。
能否溢出确实是和保护机制有关,如下
[admin@localhost  ctf_stack]$  gcc  -g  -fno-stack-protector  -z  execstack  -o  vuln  vuln.c
[admin@localhost  ctf_stack]$  gdb  -q  ./vuln
Reading  symbols  from  ./vuln...done.
(gdb)  r  `perl  -e  'print  "A"x30'`
Starting  program:  /home/admin/ctf_stack/vuln  `perl  -e  'print  "A"x30'`

Program  received  signal  SIGSEGV,  Segmentation  fault.
0x0000414141414141  in  ??  ()

这样一个简单的小程序到底能不能溢出呢?有点糊涂了,我准备再去查一些资料
最后于 2018-3-15 16:58 被lishua编辑 ,原因: 去掉一些标识类的东西
2018-3-2 16:10
0
雪    币: 60
活跃值: (414)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
6
lishua 多谢,我只是印象中0x41414141会报illegal&nbsp; instruction,看了一下这个帖子https://bbs.pediy.com/thread-216868.htm,发 ...
你放上来的结果已经成功溢出了......只要超过原先预定buffer大小盖到其他记忆体位置上就是溢出

如果说是可不可以拿到shell的话,鉴於你已经关闭NX  CANARY,如果能得到argv[1]地址丶摆上shellcode然後return过去就可以了吧
2018-3-4 05:24
0
雪    币: 842
活跃值: (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
写错了,等再试一下,然后再发帖。
最后于 2018-3-12 17:28 被lishua编辑 ,原因:
2018-3-12 17:26
0
雪    币: 3838
活跃值: (1965)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
溢出是溢出了,但是不能利用罢了.我觉得你应该把这两个概念理清.

另外,这个简单的程序理论上应该找不出gadgets.除非你知道你系统libc的基址(这就相当于监守自盗了).所以玩玩就好,不要想那么多.

如果非要写出一个可被利用的栈溢出,你或许可以让溢出可跳跃.比如strcpy(x+offset,data);另外啊,你好歹上一下调试,看看栈布局吧
2018-3-13 10:10
0
雪    币: 842
活跃值: (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢楼上的大大。
试的结果是,在32位Fedora25下,输入过长字符串对不准返回地址,所以没法用;
在64位Fedora  23下,输入过长字符串可以对准返回地址,但是可能是因为返回地址是6位,前面还有两位必须为0x00,字符串中出现“\x00”老是被截断,所以没法把"/bin/sh"覆盖过去,也没能利用成功。我本想试一下ret2system办法。
感谢楼上指点方向
最后于 2018-3-15 16:43 被lishua编辑 ,原因:
2018-3-15 13:45
0
雪    币: 842
活跃值: (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

另外,整理了一下思路,原来问的不对,应该是输入构造的字符串后,EIP无法对准, 就肯定无法成功利用了。


我又翻了一些ret2libc和ret2plt的文章,发现一开始都要对准EIP,这样的话这个小程序就肯定无法溢出了(在我的测试环境下,在老的系统上未必)。

最后于 2018-3-23 17:28 被lishua编辑 ,原因:
2018-3-15 17:08
0
游客
登录 | 注册 方可回帖
返回
//