gdb反向调试avx2

时间:2017-05-03 03:32:56

标签: c gdb glibc avx2

所以我有一个支持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

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

1 个答案:

答案 0 :(得分:2)

对于你在ubuntu 16.04 amd64上发布的glibc 2.23,my binary kludge (1 bit patch)的改编完全出于同样的原因。从https://packages.ubuntu.com/xenial/amd64/libc6下载了包libc6 (2.23-0ubuntu7)并编辑了文件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的代码来自cpuid eax=0x7,ecx=0the get_common_indeces: if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ...,所以我只是使用83 3D xx xx xx xx 06 7E xx B8 07 00 00 00 31 C9 0F A2跳过片段,并通过更改EAX=7 leaf of cpuid has all info needed to detect AVX2 support and enable it将结果保存到内存的某些部分。

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

如果您的root fs可以在没有eax = 7 cpuid leaf支持(英特尔酷睿CPU之前)的情况下启动,或者在模拟此类英特尔酷睿CPU的虚拟机中启动根fs,那么该补丁是愚蠢的,并且不会全局使用补丁文件( 0x7e 0x21 into 0x7f 0x21)。

您可以将修补文件放在名称与/lib/x86_64-linux-gnu/ld-2.23.so(符号链接到/lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2文件中)的原始路径相同或更短的路径上。例如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 。然后使用相同的hexeditor替换字符串" /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2"您的程序可执行文件(ELF)到" /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2"或使用patchelf工具"Pentium D 8xx/9xx", Pentium 4, Pentium M - will fail

hardware_concurrency()