linux c 自修改代码,使用自修改代码观察在x86上获取过时的指令

这篇博客详细介绍了如何通过简单的asm代码测试Intel Sandybridge及以上家族处理器对物理地址的敏感性,并演示了如何使用mmap实现映射同一物理页面的不同内存映射。作者分享了测试工具的实现步骤和在Linux环境下观察到的结果。
摘要由CSDN通过智能技术生成

bb0776377d1ee4e96f57312bf0e91ad8.png

qq_笑_17

Sandybridge家族(至少是Skylake)仍然有相同的行为,显然是在窥探物理地址。不过,你的测试有点过于复杂。我没有看到跳远的重点,如果你将SMC函数组装(并在必要时链接)为平面二进制文件,你可以打开+ mmap两次。make a1和a2函数指针,然后main可以return a1(a2)在映射之后。这是一个简单的测试工具,以防有人想要尝试自己的机器 :(从问题复制open / assert / mmap块,感谢起点。)(在下面,你必须每次重建SMC平面二进制文件,因为映射它MAP_SHARED实际上会修改它 .IDK如何获得不会修改底层文件的同一物理页面的两个映射;写入MAP_PRIVATE会将它转换为一个不同的物理页面。所以将机器代码写入文件并将它们映射成现在我意识到这一点是有意义的。但我的asm仍然更简单。)// smc-stale.c#include #include #include #include #include typedef int (*intfunc_t)(void *);   // __attribute__((sysv_abi))  // in case you're on Windows.int main() {

    int fd = open("smc-func", O_RDWR);

    assert(fd>=0);

    intfunc_t a1 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,

                MAP_FILE | MAP_SHARED, fd, 0);

    intfunc_t a2 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,

                MAP_FILE | MAP_SHARED, fd, 0);

    assert(a1 != a2);

    return a1(a2);}测试功能的NASM源:(请参阅如何使用GNU GAS汇编程序生成像nasm -f bin这样的纯二进制文件?用于as+ ld替代nasm -f);;build with nasm smc-func.asm     -fbin is the default.bits 64entry:   ; rdi = another mapping of the same page that's executing

    mov  byte [rdi+dummy-entry], 0xcc       ; trigger any copy-on-write page fault now

    mov  r8, rbx    ; CPUID steps on call-preserved RBX

    cpuid               ; serialize for good measure

    mov  rbx, r8;    mfence;    lfence

    mov   dword [rdi + retmov+1 - entry],  0       ; return 0 for snooping

retmov:

    mov   eax, 1      ; opcode + imm32             ; return 1 for stale

    ret

dummy:  dd 0xcccccccc在运行Linux 4.20.3-arch1-1-ARCH的i7-6700k上,我们不会观察到过时的代码获取。在执行之前修改了该指令mov,覆盖了立即数。10peter@volta:~/src/experiments$ gcc -Og -g smc-stale.c

peter@volta:~/src/experiments$ nasm smc-func.asm && ./a.out; echo $?0# remember to rebuild smc-func every time, because MAP_SHARED modifies it

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值