La llamada al sistema exceve no está funcionando a través de la carga útil.
Estoy escribiendo una carga útil básica para la llamada al sistema execve. En nasm, la carga útil es:
global _start
section .text
_start:
call payload
db '/bin/sh', 0, 'aaaaaaaa', 0
payload:
mov rax,rsp
mov rax, [rax]
;mov BYTE [rax + 0x9], 0x0
mov QWORD [rax + 0x0a], rax
;mov BYTE [rax + 0x12], 0x0
;mov QWORD [rax + 0x13], 0x0
mov rdi, rax
lea rsi, [rax + 0x0a]
mov rdx, 0x0
mov rax, 0x0b
int 0x80
mov rax, 0x01
mov rbx, 0x21
int 0x80
El archivo C es:
char payload[] = "\xe8\x11\x00\x00\x00"
"\x2f\x62\x69\x6e\x2f\x73\x68\x00"
"\x61\x61\x61\x61\x61\x61\x61\x61\x00"
"\x48\x89\xe0"
"\x48\x8b\x00"
"\x48\x89\x40\x0a"
"\x48\x89\xc7"
"\x48\x8d\x70\x0a"
"\xba\x00\x00\x00\x00"
"\xb8\xcb\x00\x00\x00"
"\xcd\x80"
"\xb8\x01\x00\x00\x00"
"\xbb\x21\x00\x00\x00"
"\xcd\x80";
void main() {
long *pointer;
pointer = (long *)&pointer + 2;
*pointer = (long)payload;
}
Hay 2 llamadas al sistema, la primera es execve y la segunda es exit. La primera no se está ejecutando pero la segunda sí está funcionando. Este archivo se cierra con el código de estado 33.
Depuré este código en r2. Coloqué un punto de depuración en la primera instrucción int 0x80
. Los valores en los registros rdi, rsi y rdx parecen correctos, déjame pegar los valores exactos:
rdi = 0x5580de416045
:> ps @ rdi
/bin/sh
rsi = 0x5580de41604f
px @ rsi
0x5580de41604f 4560 41de 8055 0000
rdx = 0x00000000
Entonces rdi contiene la dirección de /bin/sh
, rsi contiene una dirección en la que la primera dirección es la dirección de /bin/sh
, y rdx es nulo. Pero no creo que esté funcionando, incluso usando strace no veo esta llamada al sistema.
davy.ai
Como modelo de lenguaje de IA, no puedo verificar la afirmación hecha en la última frase. Sin embargo, según el código proporcionado, parece que la primera llamada al sistema para execve no está funcionando correctamente mientras que la segunda llamada al sistema para exit está funcionando bien. La información de depuración muestra que los valores en los registros rdi, rsi y rdx son correctos para la llamada al sistema execve, pero no se está ejecutando. Es posible que se requiera una depuración adicional para identificar el problema.