【问题标题】:gdb reverse debugging avx2gdb反向调试avx2
【发布时间】:2017-09-30 17:28:03
【问题描述】:

所以我有一个支持 avx2 指令集的新奇特 cpu。 这很棒,但会破坏 gdb 反向调试。当编译时没有优化代码仍然使用共享库,例如调用 memset(),然后调用 memset 的 avx2 优化版本。这很好,但 gdb 记录不支持 avx2。

进程记录不支持地址 0x7ffff690dd80 处的指令 0xc5。

0xc5 是这里的 vex 前缀。

反向调试非常适用于不支持 avx2 的 cpu。如何让 libc 等不使用库调用的 avx2 优化版本,以便我可以使用 gdb 记录、后退等?

我试过了

LD_BIND_NOW=1
LD_HWCAP_MASK=0
compiling with -static

由于没有在旧机器上调试,我没有想法。

【问题讨论】:

标签: c gdb glibc avx2


【解决方案1】:

对于在 ubuntu 16.04 amd64 上发布的 glibc 2.23,出于同样的原因,对 my binary kludge (1 bit patch) 进行了改编。包 libc6 (2.23-0ubuntu7) 是从 https://packages.ubuntu.com/xenial/amd64/libc6 下载的,文件 ld-2.23.so 已编辑(保留原始副本,或将补丁保存到不同的路径并更改您自己的二进制文件的 INTERP 部分以使用不同的路径):

 83 3D 5B C9 20 00 06   cmpl $0x6, smth...
 7E 21                  jle  some_forward_label
 B8 07 00 00 00         mov $0x7, %eax
 31 C9                  xor %ecx,%ecx
 0F A2                  cpuid

__get_cpu_features 调用了the get_common_indeces: if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ... 的代码。 EAX=7 leaf of cpuid has all info needed to detect AVX2 support and enable it,所以我只是跳过了带有cpuid eax=0x7,ecx=0 的片段,并通过更改0x7e 0x21 into 0x7f 0x21 将其结果保存到内存的某些部分。

因此,二进制补丁就像将83 3D xx xx xx xx 06 7E xx B8 07 00 00 00 31 C9 0F A2(其中xx 可以是任何字节)替换为83 3D xx xx xx xx 06 7F xx B8 07 00 00 00 31 C9 0F A2。您可以使用任何十六进制编辑器或一些二进制差异来执行此操作。在 2.23-0ubuntu7 中,此代码位于 0x0193B0 - 0x0193B9 是 7e 要更改为 7f。

如果您的 root fs 可能使用没有 eax=7 cpuid 叶支持的 CPU(前 Intel Core CPU)或在模拟此类 pre Intel Core CPU 的虚拟机中启动,则该补丁将变得愚蠢并且不要全局使用补丁文件(@987654326 @)。

您可以将修补文件放在与/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 的原始路径(符号链接到/lib/x86_64-linux-gnu/ld-2.23.so 文件)的长度相等或更短的路径中。例如/lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2。然后使用相同的十六进制编辑器将您的程序可执行文件(ELF)的字符串“/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2”替换为“/lib_x86_64-linux-gnu_ld-linux-noAVX2。 so.2",或者使用 patchelf 工具from the patchelf package:

cp /lib/x86_64-linux-gnu/ld-2.23.so /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2

bless  /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2
# or any other hex editor

patchelf --set-interpreter /lib_x86_64-linux-gnu_ld-linux-no-AVX2.so.2 ./my_program

【讨论】:

  • 如果我可以对答案授予追溯性赏金,这将是合格的。精彩的内容,写得很好,解决方案检查并成功使用。干杯。
  • @Hal,问题下方应该有“开始赏金”按钮,原因是“奖励现有答案 - 一个或多个答案具有示范性,值得额外赏金”。答案应检查/更新到 18.04 LTS;并且在一些链接的问题中有脚本二进制补丁(没有手动二进制编辑),可能在stackoverflow.com/questions/42451492re.sub 的python 中。另一种解决方案:查看 Mozilla 的 Firefox 的github.com/mozilla/rrRR 反向调试工具(感谢stackoverflow.com/questions/42451492#comment79266853_42451492)。
  • 由于某种原因,截至今天(25/04/19),这种方法在 Ubuntu 16.04 上对我不起作用。但是这个答案中的 Python 脚本修补了一些稍微不同的东西并且确实有效:stackoverflow.com/questions/42451492/…
猜你喜欢
  • 2010-12-05
  • 2010-12-07
  • 1970-01-01
  • 2012-02-20
  • 2012-01-03
  • 2011-09-11
  • 1970-01-01
  • 2011-03-20
  • 2014-11-14
相关资源
最近更新 更多