我正在研究十六进制字符串,我发现这是一个二进制文件。从十六进制分解为汇编后,我希望获得一些下一步的指示。我只是假设该体系结构可能是x86,并使用onlinedisassembler.com转换为汇编代码。

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

反汇编的代码看起来像这样(不共享全部内容,仅前两行):

                       .data:00000000 77 90                            ja     0xffffff92
                       .data:00000002 97                               xchg   edi,eax


评论

您能再分享几行吗?尽管前两个指令作为shellcode的开头并没有多大意义,但可以将77 90(十进制)转换为0x4d 0x5a(十六进制),这是PE文件的著名“ MZ”(ASCII)标头。 />

#1 楼

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

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

#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并崩溃。

评论


感谢您的指导,现在我将找出下一步。

– Gremlin0x00
18年2月16日在22:57

#2 楼

尝试使用radare2(radare.org)。它了解各种可以分解的可执行文件格式。可执行文件包含标头,用于控制操作系统将代码加载到内存中以及在何处开始执行。因此,从文件的第一个字节开始并不是程序本身。 Radee2加载可执行文件并解释标头并加载实际代码以将其反汇编。调试代码等...

radare2 my_program.exe