Hola
Estoy aprendiendo a eliminar los nulls en ensamblador, lo estoy intentando con algo simple como un hola mundo en nasm, la manera en que lo hice fue haciendo un call y con xor en los demas registros para que pasara algo asi
global _start
section .data
section .text
_start:
jmp mess
proc:
xor rax, rax
mov al, 1
xor rdi, rdi
mov dil, 1
pop rsi
xor rdx, rdx
mov dl, 0x12
syscall
;exit
xor rax, rax
mov al, 60
xor rdi, rdi
mov dl, 11
syscall
mess:
call proc
MSG db 'Hola mundo x64',0x0A
/code]
Así call mete en la pila MSG y luego lo retoma RSI con un pop, solo que no recuerdo si lo retoma en esp o en esp+4, lo analice en GDB pero no estoy seguro si es rsp o rsp + 4
(gdb) x/s $rsi
0x4000a8 <MSG>: "Hola mundo x64"
¿Alguien me podría decir cual de las dos formas sería la correcta?
[code]|------------
|rsp ---- MSG
---------------------
|
|rsp + 4 ---- MSG
/code]
Pero también quisiera saber si hay otra forma de lograr eliminar los null sin tener que hacer el call
así lo había dejado pero me encontré con el problema de no saber como eliminar el null de rsi
[code=asm]global _start
section .data
MSG: db 'Hola mundo x64'
length: equ $-MSG
section .text
_start:
xor rax, rax
mov al, 1
xor rdx, rdx
mov bl, 1
xor rsi, rsi
mov rsi, MSG
xor rdx, rdx
mov dl, length
syscall
;exit
xor rax, rax
mov al, 60
xor rdi, rdi
mov dl, 11
syscall
Si ven, el único que me faltaría es RSI que analizandolo con objdump se vería de ésta forma
00000000004000b0 <_start>:
4000b0: 48 31 c0 xor rax,rax
4000b3: b0 01 mov al,0x1
4000b5: 48 31 d2 xor rdx,rdx
4000b8: b3 01 mov bl,0x1
4000ba: 48 31 f6 xor rsi,rsi
4000bd: 48 be dc 00 60 00 00 movabs rsi,0x6000dc
4000c4: 00 00 00
4000c7: 48 31 d2 xor rdx,rdx
4000ca: b2 0e mov dl,0xe
4000cc: 0f 05 syscall
4000ce: 48 31 c0 xor rax,rax
4000d1: b0 3c mov al,0x3c
4000d3: 48 31 ff xor rdi,rdi
4000d6: b2 0b mov dl,0xb
4000d8: 0f 05 syscall
¿Pero que otra forma se les ocurre que podría eliminar esos null's?
Y ya de paso otra pregunta más, RET solo se utiliza en EBP o también en ESP, me explico
|
|rsp + 8
|------------
|rsp + 4
|-----------
|rbp
|------
|ret
|-------
|rbp + 8
--------------
---------------------------------
|
|rsp + 8
|------------
|rsp + 4
|-----------
|ret
--------------
movabs rsi,0x6000dc
Modifiquemos un poco este valor: 0x006000dc
0x006000dc + 0x11111111 = 0x117111ED
Podrías hacer esto:
mov rsi, 0x117111ED
sub rsi, 0x11111111
Saludos
EDIT: Con respecto a eso de "usar" no te entendí muy bien pero en realidad tanto RBP como RSP su usan.
RSP siempre apunta a la cima del stack, mientras que RBP es utilizado como Frame Pointer (epílogo y prólogo):
Claro, no lo había pensado en sub
Muchas gracias.
Lo del ret solo es una duda sobre la posición del stack, pero no importa mucho.