奇怪的指令

逆向工程 模糊测试 记忆 仪器仪表
2021-07-10 06:51:48

在模糊测试中(使用 Pintool)来检查程序的执行痕迹,这里是 wget。我得到了一些奇怪的指令,以下是从(很长的)跟踪中提取的一段:

RIP register   instruction

0x7fff751fed17 mov rbx, 0xffffffffffdff000
0x7fff751fed1e lsl r11d, eax
0x7fff751fed22 xor r15d, r15d
0x7fff751fed25 mov r10d, r11d
0x7fff751fed28 mov r9d, dword ptr [0xff5ff080]
0x7fff751fed30 test r9b, 0x1
0x7fff751fed34 jnz 0x7fff1fdb4fdf
0x7fff751fed3a mov rax, qword ptr [0xff5ff0a8]
0x7fff751fed42 mov r13d, dword ptr [0xff5ff088]
0x7fff751fed4a mov qword ptr [rdi], rax
0x7fff751fed4d mov edx, dword ptr [0xff5ff088]
0x7fff751fed54 mov r14, qword ptr [0xff5ff0b0]

对我来说,他们很奇怪。首先,它们中的一些直接访问内存,这意味着一些地址,例如0xff5ff0800xff5ff0a8已被硬编码到程序中。其次,我在加载的库和 wget 本身中找不到它们。第三,更奇怪的是,通过传递参数(IARG_MEMORYREAD_EA)来获取访问内存的虚拟地址。我得到了地址,例如0xffffffffff5ff080,,0xffffffffff5ff0a8等等,而且它们都不属于程序的内存空间。

有人能给我一些建议吗?

1个回答

这是来自vDSO 的代码,由内核映射到每个进程,而不是来自 wget 二进制文件。您可能可以通过检查/proc/<pid>/maps文件来弄清楚

这是我在 IDA 中gettimeofday的内容:

.text:FFFFFFFFFF700D17   mov     rbx, 0FFFFFFFFFFDFF000h
.text:FFFFFFFFFF700D1E   lsl     r11d, eax
.text:FFFFFFFFFF700D22   xor     r15d, r15d
.text:FFFFFFFFFF700D25   mov     r10d, r11d
.text:FFFFFFFFFF700D28   mov     r9d, ds:0FFFFFFFFFF5FF080h
.text:FFFFFFFFFF700D30   test    r9b, 1
.text:FFFFFFFFFF700D34   jnz     loc_FFFFFFFFFF700FDF
.text:FFFFFFFFFF700D3A   mov     rax, ds:0FFFFFFFFFF5FF0A8h
.text:FFFFFFFFFF700D42   mov     r13d, ds:0FFFFFFFFFF5FF088h
.text:FFFFFFFFFF700D4A   mov     [rdi], rax
.text:FFFFFFFFFF700D4D   mov     edx, ds:0FFFFFFFFFF5FF088h
.text:FFFFFFFFFF700D54   mov     r14, ds:0FFFFFFFFFF5FF0B0h

因此,PIN 的反汇编程序似乎选择不对地址进行符号扩展(在操作码中以 4 个字节编码)。