jjzjj

关于C#:缓冲区溢出的编译器艺术

codeneng 2023-03-28 原文

The Art of Compiler on Buffer Overflow

现代编译器GCC非常强大,它甚至可以在编译阶段防止缓冲区溢出,使操作系统无法在堆栈空间上运行代码。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void function(char *str)
{
   char buffer[16];

   strncpy(buffer, str, 256);
}

void main()
{
  char large_string[256];
  int i;

  for( i = 0; i < 256; i++)
    large_string[i] = 'A';

  function(large_string);
}

获得魔法 0x41414141 的唯一方法是设置 GCC 编译参数,例如:

1
gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

(我在 ubuntu 10.04 x86 lucid 32bits box 上测试过)

有什么办法可以绕过 GCC 堆栈粉碎保护吗?

  • 您指的是哪个限制,为什么要绕过它?
  • 你想故意破坏堆栈吗?为什么?顺便说一句,您的代码有一个错误。您忘记了 NULL 终止 large_stringstrcpy() 将不限于 255 个字节。
  • 我认为您的意思是询问是否可以绕过 gcc 堆栈保护,如果可以,您应该编辑问题以使其清楚。
  • @NikosChantziaras 有了这个错误,它就更好了!
  • @JonathanLeffler 限制是我只能覆盖 eip 寄存器,并且在编译代码时必须设置 -fno-stack-protector 和 execstack 参数。如果不设置上面的两个参数,即使存在"strcpy(buffer,str)"问题,我也无法利用缓冲区溢出技巧
  • 您可以绕过它,但最有效的方法是查看生成的代码以了解它应该如何完成。
  • @JustForTest 这不是限制它是一个功能
  • @mux 完全正确!这就是我想要的。实际上,我的作业是我们需要在 C 代码中找到缓冲区溢出的古老性并加以利用(通过它运行 shellcode)。问题是,即使我在 strcpy() 函数中发现了问题,我也无法利用它,因为代码是使用 gcc 堆栈保护编译的。
  • 然后在没有保护的情况下编译它。问题出在哪里?
  • @mux 感谢您进行编辑以使问题更清楚;-)
  • @AlexeyFrunze 你能告诉我一个关于如何绕过我遇到的这个问题的 GCC 堆栈粉碎保护的解决方案吗?
  • 研究编译器的汇编输出以了解保护的工作原理。使用 -S 选项。
  • @NikosChantziaras问题是没有保护我无法编译它,我需??要绕过堆栈保护
  • @AlexeyFrunze 代码中的那个错误可能会使 strcpy 在返回之前崩溃,并且它还可能用意外的值(不是 \\'A\\'s)填充堆栈,你不认为它应该被修复吗?
  • @mux 是的,我应该添加一个笑脸。
  • 该示例代码中有一个错误,这只会使您的事情变得更加复杂,我对帖子进行了一些更改,我认为它们没有被提交。
  • @mux 你能再次发送提交吗?
  • @mux 为什么我们应该使用 strncpy() 而不是 strcpy()?
  • @JustForTest 因为您必须以空值终止或指定要从字符串复制的字节数,否则, strcpy 将继续复制字节,直到达到空字节或崩溃,并且永远不会返回,请参见上面的评论。


编译时应禁用堆栈保护:

1
gcc  -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

您可能还想禁用地址空间随机化 (ASLR):

1
sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

现在你可以试试缓冲区溢出了,我推荐阅读 Smashing the Stack for Fun and Profit

编辑:

就像我在评论中所说的那样,可以安全地假设在您的分配中禁用堆栈保护是可以接受的,但是,如果您想绕过堆栈保护,您应该检查 SOF 中与金丝雀相关的问题,例如以下问题:

有没有办法绕过 SSP (StackSmashing Protection)/Propolice?

  • 有没有一种方法可以直接粉碎堆栈而无需任何参数设置?
  • 您的作业要求利用缓冲区溢出,我认为可以安全地假设禁用堆栈保护是可以接受的,否则问题实际上要复杂得多。
  • 是的,我想是这样。很好奇是否有办法绕过如此强大的堆栈保护。另一方面,即使代码中存在堆栈溢出漏洞,也可以说它对代码是安全的,因为堆栈中的代码在堆栈保护编译后无法运行。(此类问题的最坏情况是程序终止,黑客无法通过它运行shellcode)
  • 只是一个小的更正:您的 echo 命令将不起作用。它应该类似于 sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
  • @工作谢谢!我总是忘记这一点:)
  • @mux 为什么我不能简单地将 "0" 回显到 randomize_va_space 文件?
  • @JustForTest 您需要以 root 身份执行此操作并以 root 身份执行整个命令。
  • @mux 嗨,mux。你能给我你的电子邮件地址,我想更多地谈谈我的缓冲区溢出作业吗?


当然有一些方法可以绕过堆栈粉碎保护(称为堆栈金丝雀),尽管在您的示例中并不容易。有关堆栈金丝雀的一些弱点,请参阅我的答案。

  • 你能为这种堆栈金丝雀举一个简单可行的例子吗
  • @JustForTest:恐怕不会。在您的示例中绕过堆栈金丝雀的唯一方法是用相同的值覆盖它。由于没有内存泄漏漏洞,唯一的方法就是暴力破解它,这可能是不可行的......

有关关于C#:缓冲区溢出的编译器艺术的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  7. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  8. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  9. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  10. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

随机推荐