如何反编译 64 位二进制文​​件以检索内容?

How to decompile 64-bit binary to retrieve content?

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

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

文件信息:

ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux) statically linked, for GNU/Linux 2.6.32 not stripped

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

 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          

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

我在你的问题中添加了函数 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 缓冲区内。快速浏览 malloc 下方的代码表明正在使用一种算法(某种形式的解密)将放置在堆栈上的数据转换为 malloc 缓冲区中的某种数据。我没有试图找出算法,而是决定使用 GDB 调试器告诉我 malloc returned 加 1 的地址。return 值(地址)malloc 将在 RAX 中。他们给它加了 1,所以我认为这是他们将生成的数据的开始。然后我决定找到 main returns:

的地址
  400cd5:       c9                      leave
  400cd6:       c3                      ret

I 运行 GDB1 并在 0x400c6c 处设置断点(就在 add rax,0x1 之后)和 [=25= 处设置断点] 在 ret。我希望当 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
 = 0x6d2bf1
(gdb) c
Continuing.

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

我设置了前面讨论的两个断点。我打印了 RAX ,其中包含 malloc 内存 (+1) 的地址 0x6d2bf1 。然后我使用 continue 命令 运行 直到函数退出时的第二个断点。然后,我使用 x/s 命令将内存内容打印为从 0x6d2bf1 开始的字符串。结果是:

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

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

当我去 URL 我得到这个网页:

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


脚注

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