assembly - 如何反编译 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
我正在尝试查找在程序的主要功能中编码的隐藏信息。我也知道该程序具有基于存储在数组中的值的条件,并且从中调用另一个函数或返回值但无法破解它..
解决方案
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
)设置断点,400cd6
在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
$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
. 然后,当函数退出时,我使用c
ontinue 命令运行到第二个断点。0x6d2bf1
然后我将内存的内容打印为以x/s
命令开头的字符串。结果是:
0x6d2bf1: "https://gooY.gl/N5WQXz"
删除Y
URL 中的 。我不得不插入它,因为 Stackoverflow 不允许goo.gl
作为 URL 缩短器并且拒绝接受答案。
当我转到 URL 时,我得到了这个网页:
可能还有更多挑战,或者我忽略了代码中的某些内容。我没有时间进一步调查,但这可能是您找到自己答案的起点。
脚注
- 1我选择 GDB 作为调试器,但您可以使用任何可用的调试器来运行 x86-64 Linux 程序。大多数调试器允许设置断点并查看寄存器和内存的内容。
推荐阅读
- android - 如何在 android studio 中使用 filepicker 库?
- scala - 无法加载 play.http.errorHandler
- python - 根据 DateField 范围允许字段有效或无效
- javascript - 使用 React State 对象作为另一个值的键
- windows - 从任务计划程序运行时 MSI 安装程序不工作
- python - 如何从标签中获取 src="PATH" 中的路径
- python - for in 循环相同,但结果不同
- assembly - 如何在程序集中更新字符串的字符?
- javascript - react-map-gl - 印度地理位置显示不正确
- angular - ngFor 不显示推送到源数组的新数据的问题