【问题标题】:Differences in disassembling 32 bit and 64bit反汇编32位和64位的区别
【发布时间】:2019-04-15 12:40:19
【问题描述】:

我从逆向工程开始了我的冒险,但我遇到了一些从一开始就无法解决的问题。我正在关注 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 位虚拟机上编译我的程序并得到如下结果时:

当我在 64 位虚拟机上使用 gcc -g -z execstack -fno-stack-protector -m32 编译相同的代码时,我得到了相同的结果。但是,如果我用gcc -g -z execstack -fno-stack-protector 编译它,我会得到这样的结果:

所以它看起来像教程中的屏幕截图,但它是 64 位版本。所以我的问题是,我做错了什么还是我应该改变什么?我不知道我是否应该学习使用 64 位系统或找到修复 32 位系统的方法。谁能帮帮我?

【问题讨论】:

  • 试试-no-pie
  • get_pc_thunk 的调用告诉它与位置无关的代码according to this answer,因此可能是它不同的原因。在编译器中使用-no-pie 禁用此功能可能会使它们看起来更相似。此外,优化器以神秘的方式工作,使用 -O0 禁用它也可以帮助您在代码转换为汇编后识别它。
  • 但是你知道我之前的问题,可能是我的有效载荷不起作用的情况吗?还是只是表象,与shellcode和内存无关?
  • 只要eip/rip将函数的ret地址改写为shellcode的地址或之前的\x90,shellcode就可以工作了。跨度>
  • 函数的ret地址,在使用__cdecl(C语言的默认调用约定)实现的任何函数中,地址为ebp-4(32位)或rbp-8 (64 位)。

标签: c reverse-engineering disassembly


【解决方案1】:

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

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

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

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

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

使用试错法写出各种长度的'aaaaaaaaaaaaaaaaa'并检查内存以查看它落在哪里

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 2011-09-13
    • 2010-11-08
    • 2021-04-13
    • 2011-01-31
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多