如何反编译 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
。然后我使用 c
ontinue 命令 运行 直到函数退出时的第二个断点。然后,我使用 x/s
命令将内存内容打印为从 0x6d2bf1
开始的字符串。结果是:
0x6d2bf1: "https://gooY.gl/N5WQXz"
删除 URL 中的 Y
。我不得不插入它,因为 Whosebug 不允许 goo.gl
作为 URL 缩短器并拒绝接受答案。
当我去 URL 我得到这个网页:
挑战可能更多,或者我忽略了代码中的某些内容。我没有时间进一步调查,但这可能是您找到自己答案的起点。
脚注
- 1我选择 GDB 作为调试器,但您可以使用任何可用于 运行 x86-64 Linux 程序的调试器.大多数调试器允许设置断点并查看寄存器和内存的内容。
二进制文件可以在这里找到: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
。然后我使用 c
ontinue 命令 运行 直到函数退出时的第二个断点。然后,我使用 x/s
命令将内存内容打印为从 0x6d2bf1
开始的字符串。结果是:
0x6d2bf1: "https://gooY.gl/N5WQXz"
删除 URL 中的 Y
。我不得不插入它,因为 Whosebug 不允许 goo.gl
作为 URL 缩短器并拒绝接受答案。
当我去 URL 我得到这个网页:
挑战可能更多,或者我忽略了代码中的某些内容。我没有时间进一步调查,但这可能是您找到自己答案的起点。
脚注
- 1我选择 GDB 作为调试器,但您可以使用任何可用于 运行 x86-64 Linux 程序的调试器.大多数调试器允许设置断点并查看寄存器和内存的内容。