mprotect 系统调用不起作用

逆向工程 linux 外壳代码 系统调用
2021-07-09 23:45:16

我想使用 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 段仍然没有显示可写标志。

2个回答

您的参数mprotect不正确。这是正确的顺序

start: rdi
len:   rsi
prot:  rdx

有效的shellcode是

push 0xA
pop rax
push 0x7
pop rdx
call x
x:pop rdi
and rdi, 0xfffffffffffff000
mov rsi, 0x1000
syscall

call x x: pop rdi用于获取当前rip假设代码在.text这应该工作。有关系统调用x86 x64 的参考链接

IDA 不会在每一步之后更新内存映射,因为它可能需要很长时间。您可以尝试使用“运行到”(F4) 代替步进或通过调用refresh_debugger_memory()IDC 函数强制刷新