拆解Hex组装,然后呢?

逆向工程 拆卸 十六进制
2021-07-10 09:32:59

我正在处理一个十六进制字符串,我发现它是一个二进制文件。在我从十六进制反汇编到汇编之后,我想要一些关于下一步要做什么的指示。我只是假设架构可能是 x86 并使用 onlinedisassembler.com 转换为汇编代码。

有没有办法使用 gdb 运行/调试?这是一个挑战,所以我需要运行程序集、调试它或进行静态分析并找出发生了什么!任何帮助,将不胜感激。

反汇编后的代码看起来像这样(不共享整个内容,只共享前两行):

                       .data:00000000 77 90                            ja     0xffffff92
                       .data:00000002 97                               xchg   edi,eax
2个回答

编写一个程序,将二进制数据加载到内存中,并随着执行跳转到该区域。如果您假设的一切都是正确的,它将被执行(没有问题)并且您将能够进行调试。

真正幼稚的加载器可能看起来像这样(没有错误检查):

#include <stdio.h>
#include <sys/mman.h>

int main() {
    FILE *fp = fopen("data", "rb");

    fseek(fp, 0, SEEK_END);
    int size = ftell(fp); //size of you data
    rewind(fp);
    void *data = mmap(NULL, size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);

    fread((void*)data, 1, size, fp);
    typedef void (*exec_func)(void);
    ((exec_func)data)();

    fclose(fp);
    return 0;
}

如果你的数据是

十六进制转储数据

0000000 9090 0090                              
0000003

它将执行 3 次nop并崩溃。

尝试使用radare2 (radare.org)。它了解可以反汇编的各种可执行格式。

可执行文件包含一个头文件,用于控制操作系统将代码加载到内存中以及从哪里开始执行。所以从文件的第一个字节开始并不是真正的程序本身。radare2 加载可执行文件并解释标头并加载实际代码以对其进行反汇编。调试代码等...

radare2 my_program.exe