首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向马赫-O 64位x86装配分析

反向马赫-O 64位x86装配分析
EN

Stack Overflow用户
提问于 2017-05-20 13:31:20
回答 1查看 1.6K关注 0票数 0

这个问题是由英特尔x86组装专家回答的。谢谢你的努力,提前!

问题规格

我正在分析一个二进制文件,它与Mach-O 64位x86程序集匹配.我目前正在使用MacOS 64操作系统。程序集来自objdump

问题是,当我学习程序集时,我可以看到变量名"$xxx",我可以看到ascii中的字符串值,也可以看到被调用的名称,比如“调用_printf”。

但在这个集会上,我无法得到上面的任何东西:

  1. 没有主要职能: 拆卸截面__TEXT,__text:__text: 55.P100000c91:4889 e5 movq %rsp,%rbp 100000c94: 4883 ec 10 subq $16,%rsp 100000c98: 48 8d 3d bf 02 00 leaq 703(%rip),%rdi 100000c9f: b0 00 movb $0,%al100000ca1: e8 6802 00 callq 616100000ca6:89Fc movl %eax,-4( %rbp ) 100000ca9: 4883 c4 10 addq $16,%rsp100000cad: 5d popq %rbp100000cae: c3 retq100000caf:90NOP100000cb0: 55推克%rbp。 上面的is代码帧将被执行,但我不知道它在哪里执行。

我也是AT&T装配公司的新手。因此,你能否告诉我,指导的含义是什么?

代码语言:javascript
复制
    0000000100000c90    pushq   %rbp
    0000000100000c98    leaq    0x2bf(%rip), %rdi       ## literal pool for: "xxxx\n"
    ...
    0000000100000cd0    callq   0x100000c90

这是一个循环吗?我不确定,但似乎是这样。以及为什么我们使用%rip和%rdi注册。在英特尔x86中,我知道EIP代表当前的呼叫者地址,但我不明白这里的含义。

  1. 调用整数:无论他们使用什么调用约定,我从未见过像“调用616”这样的代码模式: "100000cd0: e8 bb callq -69 <__mh_execute_header+C90>“
  2. 在intel x86中Ret后,意味着删除堆栈帧并将控制流返回给调用方。它应该是一个独立的功能。然而,在此之后,我们可以看到类似的代码 c3 retq 100000caf: 90 nop /*新函数调用*/ 100000cb0: 55推q %rbp . 太荒谬了!
  3. ASCII字符串丢失:我已经以十六进制格式查看了二进制文件,并在将其反转到asm文件之前识别了一些ascii字符串。

但是,在这个文件中没有出现ascii字符串!

  1. 总体架构审查: 拆卸__TEXT,__text:__text:从地址10000c90到100000ef6的145行__TEXT片段的拆卸,__stubs:__stubs:地址100000efc至100000f14,地址: 100000efc: ff 251601 00JMP qword ptr rip + 278 100000f02: ff 25 1801 00 jmp jmp单词ptr rip +FF251a 01 00 jmp qword ptr rip +FF251c 01 00 jmp qword ptr rip ++ 284 100000f14: ff 25 1c 01 00 jmp qword ptr rip ++284 100000f14: ff 25 1e01 00 jmp qword ptr rip+ 286节__TEXT反汇编,__stub_helper:__stub_helper:拆卸节__TEXT,__cstring:__cstring:.拆卸节__TEXT,__unwind_info:__unwind_info:.拆卸节__DATA,__nl_symbol_ptr:__nl_symbol_ptr:.拆卸节__DATA,__got:__got:.拆卸节__DATA,__la_symbol_ptr:__la_symbol_ptr:.拆卸节__DATA,__data:__data:.

因为它可能是病毒,我不能执行它。我该怎么分析呢?

5月21日最新情况

我已经确定了输出在哪里,如果我完全理解这个方案中所代表的数据流管道,我可能会找到可能的解决方案。

如果有人能给我详细的解释,我将不胜感激。谢谢!

5月22日最新情况

我在MacOS中安装了一个VirtualBox,在chmod特权之后,我执行了这个程序,但是除了两行输出之外,没有什么特别之处。结果隐藏在二进制文件中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-20 15:51:48

  1. 如果不使用C,则不需要main。二进制头包含入口点地址。
  2. call 616没有什么特别之处,只是你没有(所有)符号。有些奇怪的是,objdump没有为您计算地址,但应该是0x100000ca6+616
  3. 不知道你觉得那里有什么可笑的。一个函数结束,另一个函数启动。
  4. 这不是个问题。是的,您可以在运行时创建字符串,这样就不会让它们出现在映像中。可能是加密的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44086488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档