拆卸32位和64位的差异

时间:2018-11-12 18:36:57

标签: c reverse-engineering disassembly

我从逆向工程开始了我的冒险,但是我有一些从一开始就无法解决的问题。我正在关注有关YouTube的教程,但遇到了一些分歧。因此,当我使用本教程中的这段代码时:

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
    char buffer[500];
    strcpy(buffer, argv[1]);

    return 0;
}

我应该以教程中的家伙的身份得到反汇编结果: expected result

但是当我使用gcc -g -z execstack -fno-stack-protector在32位虚拟机上编译程序并得到如下结果:enter image description here

当我使用gcc -g -z execstack -fno-stack-protector -m32在64位虚拟机上编译相同的cod时,得到相同的结果。但是,如果我使用gcc -g -z execstack -fno-stack-protector进行编译,则会得到如下内容:enter image description here

因此,它看起来像是教程中的屏幕截图,但它是64位版本。所以我的问题是,我做错了什么还是应该改变某些东西?我不知道我应该学习使用64位系统还是找到一种修复32位系统的方法。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

对于x86和x64,您不需要两个不同的虚拟机,只需为x64创建一个虚拟机,就可以执行x86和x64二进制文件。

您可能想找到提供二进制文件的教程,因此您不必弄乱编译器标志。程序集不同的原因是由于编译器版本和设置不同。您可以尝试禁用优化,但有时会浪费时间,最好是找到提供二进制文件的教程。

您的漏洞利用必须针对您的二进制文件,而不是与教程不同的二进制文件。

在您的示例中,最值得注意的是,第二个屏幕截图中本地堆栈帧的大小为0x200,但在原始屏幕截图中为0x1F4。

您需要对齐shellcode以匹配扩大后的堆栈框架的布局。

使用反复试验的方法编写各种长度的'aaaaaaaaaaaaaaaaaaaaaaaaa'并检查内存以了解其降落的地方