Jump to content

Recommended Posts

Posted

Pessoal, estou tentando rodar um hello world no nasm, porém ao rodar o executável ./hello ele dá "Falha de segmentação". Criei dois macros para as syscalls e tô tentando chamar eles pelo %include, mas alguma coisa está barrando. Se alguém puder dar um help, eu agradeço demais, e de qualquer forma, vou continuar fazendo os testes aqui. Segue:

Código fonte:

bits 64

section .rodata
    msg: db `Hello, World\n`
    MSG_SIZE equ $ - msg
    
section .text

global _start

_start:

    %include "macro_syscall_w.asm"
    
    %include "macro_syscall_exit.asm"

 

Primeiro macro (macro_syscall_w.asm)

bits 64

    %macro syscall_w 0
        mov rax, 1
        mov rdi, 1
        mov rsi, msg
        mov rdx, MSG_SIZE
        syscall
    %endmacro

 

Segundo macro (macro_syscall_exit.asm)

bits 64

    %macro syscall_exit 0
        mov rax, 60
        xor rdi, rdi
        syscall
    %endmacro

 

 

Captura de tela de 2024-12-18 23-07-31.png

Captura de tela de 2024-12-18 23-08-10.png

Captura de tela de 2024-12-18 23-08-24.png

Captura de tela de 2024-12-18 23-08-26.png

Posted

Fer, no caso do %include,  não seria passado o "nome do arquivo.asm" que contém a macro ao invés do nome do macro? Fiz o teste dos dois jeitos e não vai por nada. Fiz várias alterações mas ainda continua dando erro.  Também adicionei o : depois do MSG_SIZE e não foi. Será que essa falha de segmentação tem algo a ver com buffer overflow?

  • Administrators
Posted

Opa, o include com nome do arquivo  é necessário sim. Mas depois disso você tem que utilizar a macro, ou seja, “chamá-la”. Em outras palavras, digitar o nome dela. 🙂

O SEGFAULT é porque o programa não chamou a SYS_exit(), mas quando você usar as macros vai parar. 😉

Abraço!

Posted (edited)

Mais algumas considerações:

Sempre que possível use os aliases E?? para registradores R??.
Use a diretiva default rel no seu arquivo .asm para garantir que referências à memória que usam apenas o offset sejam sempre RIP relative (o default no modo x86-64).

Seus macros poderiam ser:

; sysmacros.inc
%ifndef SYSMACROS_INC_
%define SYSMACROS_INC_

%macro sys_write 0
  mov eax,1
  mov edi,eax
  lea rsi,[msg]
  mov edx,MSGLEN
  syscall
%endmacro

%macro sys_exit 0
  mov eax,60
  xor edi,edi
  syscall
%endmacro

%endif

Seu código principal:

  bits 64
  default rel    ; Certifica-se que RIP relative addressing vai ser usado para offsets.

  %include "sysmacros.inc"

  section .rodata

msg:
  db `Hello\n`
MSGLEN equ $ - msg

  section .text

  global _start
_start:
  sys_write
  sys_exit

Você poderia criar macros ainda mais espertos:

%macro write_str 1-2
  %ifstr %1
    section .rodata

    %%msg: db %1
    %%msglen equ $ - %%msg

    section .text

    lea rsi,[%%msg]
    mov edx,%%msglen
  %else
    %ifnidni %1,rsi
      lea rsi,[%1]    ; assume que é um label, se não for RSI.
    %endif
    mov edx,%2
  %endif
  mov  eax,1
  mov  edi,eax
  syscall
%endmacro

%macro exit 1
  %ifnum %1
    %if %1 == 0
      xor edi,edi
    %else
      mov edi,%1
  %endif
  mov eax,60
  syscall
$endmacro

E usá-los como:

  bits 64
  default rel

  %include "sysmacros.inc"

  section .text

  global _start
_start:
  write_str `Hello\n`
  exit 0

[]s
Fred

Edited by fredericopissarra

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...