繁体   English   中英

32位和64位反汇编的区别

[英]Differences in disassembling 32 bit and 64bit

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

#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 位系统的方法。 任何人都可以帮助我吗?

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

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

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

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

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

使用试错法编写各种长度的'aaaaaaaaaaaaaaaaaaa'并检查内存以查看它的位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM