0

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

我不知道出了什么问题。

4

1 回答 1

1

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

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

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

于 2020-05-26T20:45:40.667 回答