0x56M Posted December 19, 2024 Posted December 19, 2024 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 Quote
Administrators Fernando Mercês Posted December 19, 2024 Administrators Posted December 19, 2024 Opa, no hello.asm você inclui dois arquivos que definem as macros, mas você não as utiliza. É preciso usá-las digitando seu nome. 😉 Falta também um : depois de MSG_SIZE. Abraço! Quote
0x56M Posted December 20, 2024 Author Posted December 20, 2024 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? Quote
Administrators Fernando Mercês Posted December 20, 2024 Administrators Posted December 20, 2024 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! Quote
fredericopissarra Posted December 20, 2024 Posted December 20, 2024 (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 December 20, 2024 by fredericopissarra Quote
0x56M Posted December 20, 2024 Author Posted December 20, 2024 Muito obrigado mesmo, Fer e Frederico! Deu muito certo!!! Agradeço demais pela ajuda e pelas dicas!!! Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.