我正在尝试在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 0xffffea
我不知道哪里出了问题。
发布于 2020-05-27 04:45:41
在strace下运行您的程序,如strace ./a.out,以解码系统调用参数并返回值。
可能您的基址不是页面对齐的,或者范围包括一些未映射的页面。您可以使用and ebx, -4096向下舍入到页面边界,也可以通过将align 4096放在_start之前来对齐它。
或者,您可以将您的程序与ld --omagic链接起来,使文本段成为read+write+exec,而不是调用mprotect。
https://stackoverflow.com/questions/62031056
复制相似问题