如何关闭gcc编译器优化以启用缓冲区溢出

z9smfwbn  于 2023-01-25  发布在  其他
关注(0)|答案(6)|浏览(260)

我正在开发一个homework problem,它需要禁用编译器优化保护才能正常工作。我在ubuntu linux上使用gcc 4.4.1,但不知道哪些标志是正确的。我意识到这是架构相关的-我的机器运行的是32位Intel处理器。
谢谢。

gpnt7bae

gpnt7bae1#

这是个好问题。为了解决这个问题,你还必须禁用ASLR,否则g()的地址将不可预测。
禁用ASLR:

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

禁用金丝雀:

gcc overflow.c -o overflow -fno-stack-protector

禁用canaries和ASLR后,它应该像Smashing the Stack for Fun and Profit中描述的攻击一样直接攻击
下面是ubuntu中使用的安全特性列表:https://wiki.ubuntu.com/Security/Features您不必担心NX位,即g的地址()将始终位于内存的可执行区域,因为它位于TEXT内存段中。NX位仅在您尝试在堆栈或堆上执行 shell 代码时起作用,这对于该分配是不需要的,因为它使用Return-Oriented Programming(ROP或ROP链),该Return-Oriented Programming通常用于使NX位提供的保护失效。
现在去痛扁那个EIP

wwwo4jvm

wwwo4jvm2#

嗯,到目前为止,所有的答案都是错误的,鲁克的答案是正确的。
输入:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

接着是:

gcc -fno-stack-protector -z execstack -o bug bug.c

禁用ASLR,SSP/Propolice和Ubuntu的NoneXec(9.10版本中就有了,操作起来相当简单,参见mprotect(2)技术,将页面Map为可执行文件和jmp)应该会有一些帮助,但是这些"安全特性"并不是绝对正确的。如果没有'-z execstack'标志,页面将具有不可执行堆栈标记。

xggvc2p6

xggvc2p63#

在较新的发行版上(截至2016年),PIE似乎是默认启用的,因此您需要在编译时显式禁用它。
下面是一些命令的摘要,一般来说,在本地进行缓冲区溢出练习时,这些命令会很有帮助:

禁用金丝雀:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

禁用DEP:

gcc vuln.c -o vuln_disable_dep -z execstack

禁用PIE:

gcc vuln.c -o vuln_disable_pie -no-pie

禁用上面列出的所有保护机制(警告:仅适用于本地测试):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

对于32位计算机,还需要添加-m32参数。

5fjcxozz

5fjcxozz4#

尝试使用-fno-stack-protector标志。

yzuktlbb

yzuktlbb5#

你不需要禁用ASLR来做缓冲区溢出!虽然ASLR是启用的(kernel_randomize_va_space = 2),它将不会生效,除非编译的可执行文件是PIE。所以,除非你编译你的文件与-fPIC -pie标志,ASLR将不会生效。
我认为只用-fno-stack-protector禁用金丝雀就足够了。如果你想检查ASLR是否工作(必须设置位置无关代码),用途:

hardening-check executable_name
lrl1mhuk

lrl1mhuk6#

我不会引用整个页面,但整个手册的优化可在这里:http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options
从它的声音,你需要至少-O0,默认值,和:

  • 翻板-翻板-翻板
    对于支持它的前端(C和C++),检测所有危险的指针/数组取消引用操作、一些标准库字符串/堆函数以及其他一些具有范围/有效性测试的关联构造。这样检测的模块应该不会出现缓冲区溢出、无效堆使用以及其他一些C/C++编程错误。检测依赖于单独的运行时库(libmudflap),如果在链接时给定-fmudflap,则将链接到程序中。插入指令的程序的运行时行为由MUDFLAP_OPTIONS环境变量控制。有关其选项,请参见env MUDFLAP_OPTIONS=-help a.out。

相关问题