Eliminar null en un hola mundo en nasm

Iniciado por proxy_lainux, Febrero 26, 2018, 12:34:02 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 26, 2018, 12:34:02 AM Ultima modificación: Febrero 27, 2018, 11:57:43 PM por proxy_lainux
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

Código: asm
    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
---------------------


Código: php
|
|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

Código: php
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

Código: php
|
|rsp + 8
|------------
|rsp + 4
|-----------
|rbp
|------
|ret
|-------
|rbp + 8
--------------

---------------------------------
Código: php
|
|rsp + 8
|------------
|rsp + 4
|-----------
|ret
--------------


Febrero 27, 2018, 03:14:09 AM #1 Ultima modificación: Febrero 27, 2018, 03:18:17 AM por .:UND3R:.
Código: asm
movabs rsi,0x6000dc


Modifiquemos un poco este valor: 0x006000dc

Código: php
0x006000dc + 0x11111111 = 0x117111ED


Podrías hacer esto:
Código: asm
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.