我正在处理一个类似 ctf 的挑战,它正在过滤我的 shellcode,以确保我没有分别具有 syscall、sysenter 和 int 指令 0x0f05 0x0f34 和 0x80cd 的十六进制值编码。基本上我有一个可以打开文件的 shellcode,但它包含系统调用指令。任何有助于理解如何操作它的帮助,这样我仍然可以进行系统调用,而无需显式地将序列 0x0f05 放入我的 shellcode 中。
lea rdi, _string[rip]
xor rsi, rsi
xor rax, rax
mov al, 2
syscall
我不一定要寻找确切的答案,而只是寻求一些帮助来理解一些可能的方法来操纵程序在运行时进行系统调用。
由于您已经可以注入代码,因此您可能将代码放在具有 write+exec 权限的页面中,这样您就可以使其自我修改,并存储字节syscall
一次一条指令(因此它们不会作为 imm16 的一部分被过滤)。
或者更简单,从0e 05 ...
在内存中,并使用inc byte ptr syscall_location[rip]
将其修改为0f 05 ...
。 RIP 相对寻址模式意味着您不需要知道要修改的字节的地址,只需知道相对距离(汇编器将为您计算)。您可能需要向前跳跃,以便rel32
是负数并且没有任何零字节。或者把syscall
先跳回指令。
正如 Sinkmanu 指出的那样,您可能会发现syscall
进程内存映射中某处的指令,在这种情况下,您使用的 ret2reg 之类的技术可能会起作用。
但是共享库代码相对于可执行文件往往会被 ASLRed,除非有一个 PLT 存根sendfile
在主可执行文件中,您不会得到动态链接器的帮助来找到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)