написал небольшой кодик асм:
section .text
global _start
_start:
xor eax, eax
mov al, 0x71
xor ebx, ebx
xor ecx, ecx
xor esi, esi
xor edi, edi
syscall
mov al, 0x3c
syscall
который дропает ошибку:
$sudo nasm -static -f elf64 exit.asm && sudo ld exit.o -o exit && sudo ./exit; strace ./exit
[sudo] пароль для belmondo:
execve("./exit", ["./exit"], [/* 61 vars */]) = 0
setreuid(0, 0) = -1 EPERM (Operation not permitted)
strace: [ Process PID=7703 runs in x32 mode. ]
syscall_18446744072635809596(0, 0, 0, 0, 0, 0) = -1 (errno 38)
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xffffffffffffffda} ---
+++ killed by SIGSEGV (core dumped) +++
Ошибка сегментирования (сделан дамп памяти)
Но код с такой же сутью на плюсах ее не дропает:
#include <unistd.h>
#include <iostream>
using namespace std;int main() {
cout << setreuid(0,0) << endl;
return 0;
}
$ g++ -o check check.cpp && sudo ./check
0
В чем может быть проблема?
> В чем может быть проблема?от юзера пустил.
> ...; strace ./exit.
> Но код с такой же сутью на плюсах ее не дропает:ессесенно
> sudo ./check
.
$ su -c 'strace ./exit'
Пароль:
execve("./srs", ["./srs"], [/* 49 vars */]) = 0
setreuid(0, 0) = 0
_exit(0) = ?
+++ exited with 0 +++
> +++ killed by SIGSEGV (core dumped) +++
> Ошибка сегментирования (сделан дамп памяти)
> Но код с такой же сутью на плюсах ее не дропает:Ты тут два вопроса задал. Про привилегии вопрос странный - обычному юзеру не положено ставить setreuid=0.
Про SIGSEGV - залёт по EPERM прислал тебе в ответку rax = -1.
Ты подправил только al и сделал следующий syscall к функции №18446744072635809596 из 32-разрядного ABI. О*евшее ядро послало тебя курить дамп.
"Код с такой же сутью на плюсах" не ленится заполнять все регистры, потому и не слетает.
А так даже вернёт код ошибки:
section .text
global _start
_start:
xor eax, eax
mov al, 0x71
xor ebx, ebx
xor ecx, ecx
xor esi, esi
xor edi, edi
syscall
xchg eax, edi
mov al, 0x3c
syscall$ strace ./exit
execve("./exit", ["./exit"], [/* 53 vars */]) = 0
setreuid(0, 0) = -1 EPERM (Operation not permitted)
_exit(4294967295) = ?
+++ exited with 255 +++
Читал - знакомых букав не встретил?> Ты подправил только al и сделал следующий syscall к функции №18446744072635809596
До этого было "xor eax, eax", так шта AH = 0x00
> из 32-разрядного ABI. О*евшее ядро послало тебя курить дамп.
Process PID=7703 runs in x32 mode.
Изучай про Long Mode и в нём Compatibility Mode
https://www.codeproject.com/Articles/45788/The-Real-Protecte...
> Читал - знакомых букав не встретил?
>> Ты подправил только al и сделал следующий syscall к функции №18446744072635809596
> До этого было "xor eax, eax", так шта AH = 0x00Щаз. Там теперь 0xFF от кода возврата = -1.
>> Читал - знакомых букав не встретил?
>>> Ты подправил только al и сделал следующий syscall к функции №18446744072635809596
>> До этого было "xor eax, eax", так шта AH = 0x00
> Щаз. Там теперь 0xFF от кода возврата = -1.Когда теперь? Причем теперь? Я про стостояние после [mov al, 0x71]
У тя было написано: "Ты подправил только al..."
xor eax, eax
mov al, 0x71это одножуйственно с (кроме дрочения запиську и дерганья стека и флагов)
xor eax, eax
mov al, 0x71
mov ah,0x00
> Когда теперь? Причем теперь? Я про стостояние после [mov al, 0x71]
> У тя было написано: "Ты подправил только al..."Хорошо, я расскажу медленно. О mov al,0x3c перед syscall с SIGSEGV. Он подправил только al, не учитывая, что в rax не 0, как было сразу после xor, а -1 после предыдущего syscall с залётом.