程序集,如何使用mprotect?

问题描述 投票:0回答:1

我正在尝试在Linux中进行自我修改的代码。我以为可以,但是没有。

section .data
section .text
global _start

_start:
    mov eax, 125 ;mprotect syscall number
    mov ebx, _start ; *addr
    mov ecx, 0x10000 ;page interval.
    mov edx, 7 ; rwx permission
    int 0x80
    jmp modify
target:
    mov eax, edx        
halt:
    mov ebx, 1
    mov eax, 1
    int 0x80
modify:
    mov ebx, [new]      
    mov [target], ebx   
    jmp target          
new:
    mov ebx, 0          

我在ubuntu 18.04上使用了nasm。

INT 0x80返回值为-22 0xffffffea

我不知道怎么了。

linux assembly x86 system-calls mprotect
1个回答
0
投票

strace下运行程序,就像strace ./a.out来解码系统调用参数并返回值。

[您的基本地址可能没有页面对齐,或者该范围包含一些未映射的页面。您可以使用and ebx, -4096向下舍入到页面边界,也可以通过在_start之前放置align 4096来对齐。

或者,您也可以将程序与ld --omagic链接,以使文本段为read + write + exec。

© www.soinside.com 2019 - 2024. All rights reserved.