bom galera para usar a api write no nasm com linux, basta usar a interrupçao 0x80, atribuir o valor 0x4 para o registrador eax isso diz para o processador q tamos usando o write, 0x1 para o registrador ebx isso seria o stdout, no registrador ecx seria a variavel com a string, e por fim o registrador edx q seria a quantidade de caracter da string, tambem usei o _exit no exemplo abaixo
para usar o read usamos a interrupçao 0x80 denovo, no eax usamos o valor 0x3 q seria o read, no registrador ebx usamos o valor 0x0 q seria o stdin, no ecx a variavel, e no edx o tamanho
by hfts315
- Código:
section .text
global _start
_start:
mov eax,0x4 ;syscall write
mov ebx,0x1 ;stdout
mov ecx,fts ;variavel fts
mov edx,tam ;tamanho
int 0x80 ;interrupçao para kernell linux
mov eax,0x1 ;syscall _exit
mov ebx,0x0 ;argumento
int 0x80 ;interrupçao para kernell linux
section .data
fts db 'by hfts315' ;a string para ser mostrada
tam equ 0xa ;0xa e igual ao valor 10 em decimal
para melhorar o codigo no tamanho podemos definir $ - nome da variavel assim conseguindo o tamanho exato da varaivelfts315@skynet:~/Desktop$ nasm -f elf32 fts.asm
fts315@skynet:~/Desktop$ ld fts.o -o hack
fts315@skynet:~/Desktop$ ./hack
by hfts315
- Código:
section .text
global _start
_start:
mov eax,0x4 ;syscall write
mov ebx,0x1 ;stdout
mov ecx,fts ;variavel fts
mov edx,tam ;tamanho
int 0x80 ;interrupçao para kernell linux
mov eax,0x1 ;syscall _exit
mov ebx,0x0 ;argumento
int 0x80 ;interrupçao para kernell linux
section .data
fts db 'by hfts315' ;a string para ser mostrada
tam equ $ - fts ;seria equivalente ao strlen
- Código:
#include <unistd.h>
#include <string.h>
int main(void)
{
char fts[] = "by hfts315";
int tam = strlen(fts);
write(0x1,fts,tam);
_exit(0);
}
para usar o read usamos a interrupçao 0x80 denovo, no eax usamos o valor 0x3 q seria o read, no registrador ebx usamos o valor 0x0 q seria o stdin, no ecx a variavel, e no edx o tamanho
- Código:
section .text
global _start
_start:
mov eax,0x3 ;syscall read
mov ebx,0x0 ;stdin
mov ecx,fts ;variavel fts
mov edx,0xff ;0xff e equivalente a 255
int 0x80 ;interrupçao para kernell linux
mov eax,0x1 ;syscall _exit
mov ebx,0x0 ;argumento
int 0x80 ;interrupçao para kernell linux
section .bss
fts resb 0xff ;a variavel
- Código:
section .text
global _start
_start:
mov eax,0x4 ;syscall write
mov ebx,0x1 ;stdout
mov ecx,hack ;variavel hack
mov edx,tamhack ;tamanho da string
int 0x80 ;interrupçao para kernell linux
mov eax,0x3 ;syscall read
mov ebx,0x0 ;stdin
mov ecx,fts ;variavel fts
mov edx,0xff ;0xff e equivalente a 255
int 0x80 ;interrupçao para kernell linux
mov eax,0x4 ;syscall write
mov ebx,0x1 ;stdout
mov ecx,fts ;variavel hack
mov edx,0xff ;tamanho da string
int 0x80 ;interrupçao para kernell linux
mov eax,0x1 ;syscall _exit
mov ebx,0x0 ;argumento
int 0x80 ;interrupçao para kernell linux
section .bss
fts resb 0xff ;a variavel
section .data
hack db "digite seu nome: "
tamhack equ $ - hack
- Código:
#include <unistd.h>
#include <string.h>
int main(void)
{
char fts[0xff];
char hack[] = "digite seu nome: ";
int tamhack = strlen(hack);
int tamfts;
write(0x1,hack,tamhack);
read(0x0,fts,0xff);
tamfts = strlen(fts);
write(0x1,fts,tamfts);
_exit(0);
}
by hfts315