我正在尝试在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
我不知道怎么了。
在strace
下运行程序,就像strace ./a.out
来解码系统调用参数并返回值。
[您的基本地址可能没有页面对齐,或者该范围包含一些未映射的页面。您可以使用and ebx, -4096
向下舍入到页面边界,也可以通过在_start
之前放置align 4096
来对齐。
或者,您也可以将程序与ld --omagic
链接,以使文本段为read + write + exec。