首页 > 解决方案 > 如何反编译 64 位二进制文​​件以检索内容?

问题描述

二进制文件可以在这里找到:BinaryFile

我正在尝试将汇编代码反编译为 C/ASM 以使用逆向工程查找隐藏的内容。但是鉴于二进制文件非常复杂,或者我可能无法在这里找到调整。

文件信息:

ELF 64 位 LSB 可执行文件,x86-64,版本 1 (GNU/Linux) 静态链接,用于未剥离的 GNU/Linux 2.6.32

我为代码的主要逻辑组装了伪代码,但由于我是这种语法的新手,所以无法从那里遵循控制流。

 function _start {
     libc_start_main(0x400aee, stack[0], &stack[0], 0x401890, 
                     0x401920, rdx);
     asm { hlt };
     rax = loc_4009fb();
     return rax;
 }

以下是上述伪代码中所有程序的汇编代码。

_start:
       xor        ebp, ebp                                    
       mov        r9, rdx                                     
       pop        rsi                                         
       mov        rdx, rsp                                    
       and        rsp, 0xfffffffffffffff0
       push       rax
       push       rsp
       mov        r8, __libc_csu_fini                         
       mov        rcx, __libc_csu_init                        
       mov        rdi, main                                           
       call       __libc_start_main                           
       hlt
       ; endp
       align      512  


libc_start_main:
       push       r12                                         
       push       rbp
       xor        eax, eax
       push       rbx
       mov        rbp, rdx
       mov        r12, rcx
       cpuid
       sub        rsp, 0x20
       cmp        ebx, 0x756e6547
       mov        r11d, esi
       sete       sil
       cmp        ecx, 0x6c65746e
       mov        dword [dword_6ce684], eax           ; dword_6ce684
       sete       al
       mov        r10, rdi
       mov        dword [rsp+0x38+var_28], 0x0
       test       sil, al
       mov        dword [rsp+0x38+var_24], 0x0
       mov        dword [rsp+0x38+var_20], 0x0
       je         loc_40110a   

如果我objdump -M intel -D在文件上运行,则main函数显示为:

0000000000400aee <main>:
  400aee:       55                      push   rbp
  400aef:       48 89 e5                mov    rbp,rsp
  400af2:       53                      push   rbx
  400af3:       48 83 ec 38             sub    rsp,0x38
  400af7:       64 48 8b 04 25 28 00    mov    rax,QWORD PTR fs:0x28
  400afe:       00 00
  400b00:       48 89 45 e8             mov    QWORD PTR [rbp-0x18],rax
  400b04:       31 c0                   xor    eax,eax
  400b06:       48 89 e0                mov    rax,rsp
  400b09:       48 89 c3                mov    rbx,rax
  400b0c:       c7 45 cc 15 00 00 00    mov    DWORD PTR [rbp-0x34],0x15
  400b13:       8b 45 cc                mov    eax,DWORD PTR [rbp-0x34]
  400b16:       48 63 d0                movsxd rdx,eax
  400b19:       48 83 ea 01             sub    rdx,0x1
  400b1d:       48 89 55 d0             mov    QWORD PTR [rbp-0x30],rdx
  400b21:       48 63 d0                movsxd rdx,eax
  400b24:       49 89 d0                mov    r8,rdx
  400b27:       41 b9 00 00 00 00       mov    r9d,0x0
  400b2d:       48 63 d0                movsxd rdx,eax
  400b30:       48 89 d6                mov    rsi,rdx
  400b33:       bf 00 00 00 00          mov    edi,0x0
  400b38:       48 98                   cdqe
  400b3a:       48 c1 e0 02             shl    rax,0x2
  400b3e:       48 8d 50 03             lea    rdx,[rax+0x3]
  400b42:       b8 10 00 00 00          mov    eax,0x10
  400b47:       48 83 e8 01             sub    rax,0x1
  400b4b:       48 01 d0                add    rax,rdx
  400b4e:       b9 10 00 00 00          mov    ecx,0x10
  400b53:       ba 00 00 00 00          mov    edx,0x0
  400b58:       48 f7 f1                div    rcx
  400b5b:       48 6b c0 10             imul   rax,rax,0x10
  400b5f:       48 29 c4                sub    rsp,rax
  400b62:       48 89 e0                mov    rax,rsp
  400b65:       48 83 c0 03             add    rax,0x3
  400b69:       48 c1 e8 02             shr    rax,0x2
  400b6d:       48 c1 e0 02             shl    rax,0x2
  400b71:       48 89 45 d8             mov    QWORD PTR [rbp-0x28],rax
  400b75:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400b79:       c7 00 91 23 00 00       mov    DWORD PTR [rax],0x2391
  400b7f:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400b83:       c7 40 04 9d 23 00 00    mov    DWORD PTR [rax+0x4],0x239d
  400b8a:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400b8e:       c7 40 08 9d 23 00 00    mov    DWORD PTR [rax+0x8],0x239d
  400b95:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400b99:       c7 40 0c 99 23 00 00    mov    DWORD PTR [rax+0xc],0x2399
  400ba0:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400ba4:       c7 40 10 9c 23 00 00    mov    DWORD PTR [rax+0x10],0x239c
  400bab:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400baf:       c7 40 14 63 23 00 00    mov    DWORD PTR [rax+0x14],0x2363
  400bb6:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bba:       c7 40 18 58 23 00 00    mov    DWORD PTR [rax+0x18],0x2358
  400bc1:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bc5:       c7 40 1c 58 23 00 00    mov    DWORD PTR [rax+0x1c],0x2358
  400bcc:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bd0:       c7 40 20 90 23 00 00    mov    DWORD PTR [rax+0x20],0x2390
  400bd7:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bdb:       c7 40 24 98 23 00 00    mov    DWORD PTR [rax+0x24],0x2398
  400be2:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400be6:       c7 40 28 98 23 00 00    mov    DWORD PTR [rax+0x28],0x2398
  400bed:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bf1:       c7 40 2c 57 23 00 00    mov    DWORD PTR [rax+0x2c],0x2357
  400bf8:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400bfc:       c7 40 30 90 23 00 00    mov    DWORD PTR [rax+0x30],0x2390
  400c03:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c07:       c7 40 34 95 23 00 00    mov    DWORD PTR [rax+0x34],0x2395
  400c0e:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c12:       c7 40 38 58 23 00 00    mov    DWORD PTR [rax+0x38],0x2358
  400c19:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c1d:       c7 40 3c 77 23 00 00    mov    DWORD PTR [rax+0x3c],0x2377
  400c24:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c28:       c7 40 40 5e 23 00 00    mov    DWORD PTR [rax+0x40],0x235e
  400c2f:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c33:       c7 40 44 80 23 00 00    mov    DWORD PTR [rax+0x44],0x2380
  400c3a:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c3e:       c7 40 48 7a 23 00 00    mov    DWORD PTR [rax+0x48],0x237a
  400c45:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c49:       c7 40 4c 81 23 00 00    mov    DWORD PTR [rax+0x4c],0x2381
  400c50:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c54:       c7 40 50 a3 23 00 00    mov    DWORD PTR [rax+0x50],0x23a3
  400c5b:       8b 45 cc                mov    eax,DWORD PTR [rbp-0x34]
  400c5e:       48 98                   cdqe
  400c60:       48 89 c7                mov    rdi,rax
  400c63:       e8 98 e4 01 00          call   41f100 <__libc_malloc>
  400c68:       48 83 c0 01             add    rax,0x1
  400c6c:       48 89 45 e0             mov    QWORD PTR [rbp-0x20],rax
  400c70:       c7 45 c8 00 00 00 00    mov    DWORD PTR [rbp-0x38],0x0
  400c77:       eb 24                   jmp    400c9d <main+0x1af>
  400c79:       8b 45 c8                mov    eax,DWORD PTR [rbp-0x38]
  400c7c:       48 63 d0                movsxd rdx,eax
  400c7f:       48 8b 45 e0             mov    rax,QWORD PTR [rbp-0x20]
  400c83:       48 8d 0c 02             lea    rcx,[rdx+rax*1]
  400c87:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  400c8b:       8b 55 c8                mov    edx,DWORD PTR [rbp-0x38]
  400c8e:       48 63 d2                movsxd rdx,edx
  400c91:       8b 04 90                mov    eax,DWORD PTR [rax+rdx*4]
  400c94:       83 e8 29                sub    eax,0x29
  400c97:       88 01                   mov    BYTE PTR [rcx],al
  400c99:       83 45 c8 01             add    DWORD PTR [rbp-0x38],0x1
  400c9d:       8b 45 c8                mov    eax,DWORD PTR [rbp-0x38]
  400ca0:       3b 45 cc                cmp    eax,DWORD PTR [rbp-0x34]
  400ca3:       7c d4                   jl     400c79 <main+0x18b>
  400ca5:       8b 45 c8                mov    eax,DWORD PTR [rbp-0x38]
  400ca8:       48 63 d0                movsxd rdx,eax
  400cab:       48 8b 45 e0             mov    rax,QWORD PTR [rbp-0x20]
  400caf:       48 01 d0                add    rax,rdx
  400cb2:       c6 00 00                mov    BYTE PTR [rax],0x0
  400cb5:       b8 29 23 00 00          mov    eax,0x2329
  400cba:       48 89 dc                mov    rsp,rbx
  400cbd:       48 8b 7d e8             mov    rdi,QWORD PTR [rbp-0x18]
  400cc1:       64 48 33 3c 25 28 00    xor    rdi,QWORD PTR fs:0x28
  400cc8:       00 00
  400cca:       74 05                   je     400cd1 <main+0x1e3>
  400ccc:       e8 cf 2b 04 00          call   4438a0 <__stack_chk_fail>
  400cd1:       48 8b 5d f8             mov    rbx,QWORD PTR [rbp-0x8]
  400cd5:       c9                      leave
  400cd6:       c3                      ret
  400cd7:       66 0f 1f 84 00 00 00    nop    WORD PTR [rax+rax*1+0x0]
  400cde:       00 00          

我正在尝试查找在程序的主要功能中编码的隐藏信息。我也知道该程序具有基于存储在数组中的值的条件,并且从中调用另一个函数或返回值但无法破解它..

标签: assemblyx86-64reverse-engineeringelfdecompiling

解决方案


main我使用以下命令向您的问题添加了函数的反汇编:

objdump -D -M intel addbin.64 

addbin.64是您在问题中链接到的二进制文件的名称。您可以开始分析,main因为其他一切都是C运行时设置程序。

我对其中代码的第一印象main是有很多 MOV 可以在堆栈上构建数据。我没有试图弄清楚所有代码做了什么,而是继续扫描代码,直到我看到:

  400c60:       48 89 c7                mov    rdi,rax
  400c63:       e8 98 e4 01 00          call   41f100 <__libc_malloc>
  400c68:       48 83 c0 01             add    rax,0x1
  400c6c:       48 89 45 e0             mov    QWORD PTR [rbp-0x20],rax

我的直觉告诉我,如果我要隐藏某些东西,它可能会在 malloc'ed 缓冲区内。快速浏览一下下面的代码,malloc建议使用一种算法(某种形式的解密)将放置在堆栈上的数据转换为 malloc'ed 缓冲区中的某种数据。我决定使用 GDB 调试器告诉我malloc返回的地址加 1,而不是试图找出算法。返回值(地址)malloc将在RAX中。他们在其中添加了 1,所以我认为这是他们将生成的数据的开始。然后我决定找到main返回的地址:

  400cd5:       c9                      leave
  400cd6:       c3                      ret

我运行 GDB 1并在0x400c6c(就在 之后add rax,0x1)设置断点,400cd6ret. 我的希望是,当main完成时,在堆上分配的内存中会有某种秘密数据。

我的 GDB 会话如下:

gdb ./addbin.64
GNU gdb (GDB) 8.1.0.20180206-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./addbin.64...(no debugging symbols found)...done.
(gdb) b *0x400cd6
Breakpoint 1 at 0x400cd6
(gdb) b *0x400c6c
Breakpoint 2 at 0x400c6c
(gdb) run
Starting program: ./addbin.64

Breakpoint 2, 0x0000000000400c6c in main ()
(gdb) p/x $rax
$1 = 0x6d2bf1
(gdb) c
Continuing.

Breakpoint 1, 0x0000000000400cd6 in main ()
(gdb) x/s 0x6d2bf1
0x6d2bf1:       "https://gooY.gl/N5WQXz"
(gdb)

如前所述,我设置了两个断点。我打印了RAX,其中包含 malloc'ed 内存 (+1) 的地址,它是0x6d2bf1. 然后,当函数退出时,我使用continue 命令运行到第二个断点。0x6d2bf1然后我将内存的内容打印为以x/s命令开头的字符串。结果是:

0x6d2bf1:       "https://gooY.gl/N5WQXz"

删除YURL 中的 。我不得不插入它,因为 Stackoverflow 不允许goo.gl作为 URL 缩短器并且拒绝接受答案。

当我转到 URL 时,我得到了这个网页:

在此处输入图像描述

可能还有更多挑战,或者我忽略了代码中的某些内容。我没有时间进一步调查,但这可能是您找到自己答案的起点。


脚注

  • 1我选择 GDB 作为调试器,但您可以使用任何可用的调试器来运行 x86-64 Linux 程序。大多数调试器允许设置断点并查看寄存器和内存的内容。

推荐阅读