сборка, как пользоваться mprotect? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать самомодифицирующийся код в 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          

Я использовал nasm на ubuntu 18.04.

INT 0x80 возвращаемое значение -22 0xffffffea

Я не знаю, что не так.

1 Ответ

0 голосов
/ 26 мая 2020

Запустите вашу программу под strace, например strace ./a.out, чтобы декодировать аргументы системного вызова и возвращаемые значения.

Вероятно, ваш базовый адрес не выровнен по страницам или диапазон включает некоторые несопоставленные страницы. Вы можете округлить до границы страницы с помощью and ebx, -4096 или выровнять _start, поставив перед ним align 4096.

Или вместо того, чтобы вызывать mprotect самостоятельно, вы можете связать свою программу с ld --omagic сделать текстовый сегмент read + write + exe c.

...