【问题标题】:Is there a way to write shellcode for sendfile that does not use syscall instruction directly?有没有办法为不直接使用 syscall 指令的 sendfile 编写 shellcode?
【发布时间】:2019-03-08 07:45:51
【问题描述】:

我正在处理类似 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

我不一定要寻找确切的答案,而只是寻求一些帮助,以了解一些可能的方法来操纵程序以在运行时进行系统调用。

【问题讨论】:

    标签: x86-64 system-calls shellcode


    【解决方案1】:

    是的,如果您正在利用的程序加载了包含syscall 指令的共享库(例如libc),您可以制作一个跳转到那里的shellcode。或者甚至直接跳转到 glibc 中的 sendfile 包装函数,在寄存器中传递参数。

    另一种方式,您可以使用其他系统调用,例如 read 和 sockets 系统调用。

    【讨论】:

      【解决方案2】:

      由于您已经可以注入代码,因此您可能会将代码放在具有 write+exec 权限的页面中,这样您就可以使其自我修改,并一次存储一个 syscall 指令的字节(因此它们是'不作为 imm16 的一部分过滤)。

      或者更简单,从内存中的0e 05 ...开始,使用inc byte ptr syscall_location[rip]修改为0f 05 ...。 RIP 相对寻址模式意味着您不需要知道要修改的字节的地址,只需知道相对距离(汇编程序将为您计算)。您可能需要向前跳转,因此 rel32 为负数并且没有任何零字节。或者把syscall指令放在前面再跳回去。

      正如 Sinkmanu 指出的那样,您可能会在进程的内存映射中的某处找到 syscall 指令,在这种情况下,您用于 ret2reg 的技术可能会起作用。

      但是共享库代码相对于可执行文件往往是 ASLRed,除非在主可执行文件中存在sendfile 的 PLT 存根,否则您将无法获得动态链接器的帮助来找到它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多