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

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

有人建议我一些建议吗?。

评论

您有这些指令的操作码字节吗?什么是EIP?是在wget二进制文件本身中还是在共享对象之一中?

谢谢,但是EIP似乎很正常。我已编辑问题以添加EIP值。这些指令位于二进制文件本身中。

看来您跳入了一条指令之间。意味着您的反汇编程序将操作码解释为完全错误的。例如,当您通过模糊检查覆盖寄信人地址时,就会发生这种情况。

谢谢,我怀疑这是问题所在。因为在发生这种情况之前,我看到了一个间接跳转:“ jmp qword ptr [rip + 0x21388a]”,在经过几条指令后,它们都变得混乱了。

不幸的是,通过记录其静态跟踪,即在模糊之前,我发现这些指令存在。如果您想看一眼,请在此处提供此跟踪信息

#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字节编码的地址)。

评论


非常感谢Igor Skochinsky,您真的过得很愉快。我以前从未听说过vDSO。

– Ta Thanh Dinh
13年11月21日在8:44