首页 > 解决方案 > 如何使用 shellcode 读取文件而不明确提及禁用写权限的系统调用(0x0f05)?

问题描述

我正在处理类似 ctf 的挑战,它正在过滤我的 shellcode 以确保我没有 syscall、sysenter 和 int 指令分别为 0x0f05 0x0f34 和 0x80cd 的十六进制值编码。它还禁用了写权限。我有一个 shellcode 可以打开一个使用 sendfile 系统调用的文件,但它包含 syscall 指令。之前的挑战是相同的,但启用了写入权限。我在那个挑战中成功地使用了一个自我修改的 shellcode 来获得标志。

这是我用来读取文件“flag”(GAS intel 语法)的汇编代码(带有系统调用):

    .globl _start

_start:
    .intel_syntax noprefix
    mov     rbx, 0x67616c66
    push    rbx
    mov     rax, 2
    mov     rdi, rsp
    mov     rsi, 0
    syscall

    mov     rdi, 1
    mov     rsi, rax
    mov     rdx, 0
    mov     r10, 1000
    mov     rax, 40
    syscall

    mov     rax, 60
    syscall

过去一天,我一直在寻找在 Linux 中进行系统调用的替代方法,但这似乎是不可能的(我是汇编新手)。

我读到了通过Call Gates方法进行系统调用的另一种方法,但它似乎依赖于全局描述符表,我认为由于 ASLR 的原因我无法访问它(如果我错了,请纠正我)。

我不一定要寻找确切的答案,而只是寻求一些帮助来理解在这种情况下可以进行系统调用的方法。

标签: linuxassemblyx86-64system-callsshellcode

解决方案


推荐阅读