我想使用 shellcode 将 .text 段的保护修改为 RWX。在 shellcode 中,我可以为 mprotect 发出系统调用,但是它不起作用。
根据 sys_mprotect 定义,它采用如下所示的参数:
rdi -> start_address
rsi -> length
rdx -> protection
注意:我已经更正了上面的参数。该问题与参数序列无关。
所以,我发出如下所示的系统调用:
push 0xA
pop rax
push 0x7
pop rdx
mov rdi, start_address
mov rsi, 0x1000
syscall
在系统调用时,我验证了寄存器设置正确。
start_address 指向我要修改的 .text 部分中的 main() 子例程。
但是,系统调用在执行后不会修改对 RWX 的保护。我通过在 IDA Pro 中查看段来验证保护。
根据 syscall_mprotect 定义,不必为此系统调用专门配置其他寄存器。所以,我不确定为什么这个系统调用不起作用?
更新:我修改了 start_address 以使其页面对齐。
start_address = start_address - (start_address % 4096)
现在, syscall_mprotect 不会返回负值。它返回 0。但是,.text 段仍然没有显示可写标志。