汇编,如何使用mprotect?
assembly, how to use mprotect?
我正在尝试在 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 return 值为 -22 0xffffffea
不知道怎么回事
运行 您的程序在 strace
下,例如 strace ./a.out
解码系统调用参数和 return 值。
可能您的基地址没有页面对齐,或者该范围包含一些未映射的页面。您可以使用 and ebx, -4096
向下舍入到页面边界,或者您可以通过在 align 4096
前面放置 _start
来对齐 _start
。
或者不用自己调用 mprotect,您可以 link 您的程序 ld --omagic
使文本段读+写+执行。
我正在尝试在 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 return 值为 -22 0xffffffea
不知道怎么回事
运行 您的程序在 strace
下,例如 strace ./a.out
解码系统调用参数和 return 值。
可能您的基地址没有页面对齐,或者该范围包含一些未映射的页面。您可以使用 and ebx, -4096
向下舍入到页面边界,或者您可以通过在 align 4096
前面放置 _start
来对齐 _start
。
或者不用自己调用 mprotect,您可以 link 您的程序 ld --omagic
使文本段读+写+执行。