【问题标题】:assembly, how to use mprotect?组装,如何使用mprotect?
【发布时间】:2020-09-13 18:46:33
【问题描述】:

我正在尝试在 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】:

    strace 下运行您的程序,如strace ./a.out 以解码系统调用参数并返回值。

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

    或者不用自己调用 mprotect,您可以将您的程序与 ld --omagic 链接,以使文本段读+写+执行。

    【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2012-03-05
    • 2016-03-12
    • 2010-10-25
    • 2020-06-24
    • 2014-07-17
    • 2013-12-14
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多