我从逆向工程开始了我的冒险,但是我有一些从一开始就无法解决的问题。我正在关注有关YouTube的教程,但遇到了一些分歧。因此,当我使用本教程中的这段代码时:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
但是当我使用gcc -g -z execstack -fno-stack-protector
在32位虚拟机上编译程序并得到如下结果:
当我使用gcc -g -z execstack -fno-stack-protector -m32
在64位虚拟机上编译相同的cod时,得到相同的结果。但是,如果我使用gcc -g -z execstack -fno-stack-protector
进行编译,则会得到如下内容:
因此,它看起来像是教程中的屏幕截图,但它是64位版本。所以我的问题是,我做错了什么还是应该改变某些东西?我不知道我应该学习使用64位系统还是找到一种修复32位系统的方法。有人可以帮助我吗?
答案 0 :(得分:0)
对于x86和x64,您不需要两个不同的虚拟机,只需为x64创建一个虚拟机,就可以执行x86和x64二进制文件。
您可能想找到提供二进制文件的教程,因此您不必弄乱编译器标志。程序集不同的原因是由于编译器版本和设置不同。您可以尝试禁用优化,但有时会浪费时间,最好是找到提供二进制文件的教程。
您的漏洞利用必须针对您的二进制文件,而不是与教程不同的二进制文件。
在您的示例中,最值得注意的是,第二个屏幕截图中本地堆栈帧的大小为0x200,但在原始屏幕截图中为0x1F4。
您需要对齐shellcode以匹配扩大后的堆栈框架的布局。
使用反复试验的方法编写各种长度的'aaaaaaaaaaaaaaaaaaaaaaaaa'并检查内存以了解其降落的地方