我正在开发一个homework problem,它需要禁用编译器优化保护才能正常工作。我在ubuntu linux上使用gcc 4.4.1,但不知道哪些标志是正确的。我意识到这是架构相关的-我的机器运行的是32位Intel处理器。谢谢。
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!
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'标志,页面将具有不可执行堆栈标记。
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参数。
-m32
5fjcxozz4#
尝试使用-fno-stack-protector标志。
-fno-stack-protector
yzuktlbb5#
你不需要禁用ASLR来做缓冲区溢出!虽然ASLR是启用的(kernel_randomize_va_space = 2),它将不会生效,除非编译的可执行文件是PIE。所以,除非你编译你的文件与-fPIC -pie标志,ASLR将不会生效。我认为只用-fno-stack-protector禁用金丝雀就足够了。如果你想检查ASLR是否工作(必须设置位置无关代码),用途:
kernel_randomize_va_space = 2
-fPIC -pie
hardening-check executable_name
lrl1mhuk6#
我不会引用整个页面,但整个手册的优化可在这里:http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options从它的声音,你需要至少-O0,默认值,和:
-O0
6条答案
按热度按时间gpnt7bae1#
这是个好问题。为了解决这个问题,你还必须禁用ASLR,否则g()的地址将不可预测。
禁用ASLR:
禁用金丝雀:
禁用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!
wwwo4jvm2#
嗯,到目前为止,所有的答案都是错误的,鲁克的答案是正确的。
输入:
接着是:
禁用ASLR,SSP/Propolice和Ubuntu的NoneXec(9.10版本中就有了,操作起来相当简单,参见mprotect(2)技术,将页面Map为可执行文件和jmp)应该会有一些帮助,但是这些"安全特性"并不是绝对正确的。如果没有'-z execstack'标志,页面将具有不可执行堆栈标记。
xggvc2p63#
在较新的发行版上(截至2016年),PIE似乎是默认启用的,因此您需要在编译时显式禁用它。
下面是一些命令的摘要,一般来说,在本地进行缓冲区溢出练习时,这些命令会很有帮助:
禁用金丝雀:
禁用DEP:
禁用PIE:
禁用上面列出的所有保护机制(警告:仅适用于本地测试):
对于32位计算机,还需要添加
-m32
参数。5fjcxozz4#
尝试使用
-fno-stack-protector
标志。yzuktlbb5#
你不需要禁用ASLR来做缓冲区溢出!虽然ASLR是启用的(
kernel_randomize_va_space = 2
),它将不会生效,除非编译的可执行文件是PIE。所以,除非你编译你的文件与-fPIC -pie
标志,ASLR将不会生效。我认为只用
-fno-stack-protector
禁用金丝雀就足够了。如果你想检查ASLR是否工作(必须设置位置无关代码),用途: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。