[tutorial] int 0x80 - write e read (nasm)

postagem de conteudo sobre programação para arquitetura x86 e x64
Post Reply
User avatar
Kodo no Kami
Admin
Admin
Posts: 688
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

[tutorial] int 0x80 - write e read (nasm)

Post by Kodo no Kami » Sun Mar 15, 2015 12:20 am

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

Code: Select all

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 compilar
fts315@skynet:~/Desktop$ nasm -f elf32 fts.asm
fts315@skynet:~/Desktop$ ld fts.o -o hack
fts315@skynet:~/Desktop$ ./hack
by hfts315
para melhorar o codigo no tamanho podemos definir $ - nome da variavel assim conseguindo o tamanho exato da varaivel

Code: Select all

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
o mesmo programa usando as mesmas api com a linguagem c

Code: Select all

#include <unistd.h>
#include <string.h>

int main(void)
{
 char fts[] = "by hfts315";
 int tam = strlen(fts); 

write(0x1,fts,tam);
 _exit(0);
}
embora foi o uso da mesma api o executavel com assembly fico 600bits equanto o executavel da linguagem c fico quase 10x maior '-'

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

Code: Select all

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
para melhorar o codigo vamos usar o write antes do read exibindo uma string e depois exibindo oq agente escreveu

Code: Select all

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
o mesmo programa em c

Code: Select all

#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);
}
bom galera e isso ^^

by kõdo no kami
Image

que desagradavel ~ mirai kuriyama

User avatar
51M0N
Admin
Admin
Posts: 869
Joined: Fri Jan 02, 2015 2:06 pm

[tutorial] int 0x80 - write e read (nasm)

Post by 51M0N » Mon Mar 16, 2015 10:20 am

tentei embarcar em nasm(eng reversa malware) mas n e minha praia isso e coisa de doido mano, parabens pelo tutorial, o bom que aprendi um pouco é o conhecimento aprendido foi bom para mim =)
Image
"Você, eu, nem ninguém vai bater tão duro como a vida. Mas não se trata de bater duro. Se trata de quanto você aguenta apanhar e seguir em frente (...). É assim que se consegue vencer." by Rocky Balboa

koda
Membro
Membro
Posts: 1
Joined: Sat Jan 20, 2018 1:14 pm

Re: [tutorial] int 0x80 - write e read (nasm)

Post by koda » Sat Jan 20, 2018 5:30 pm

Code: Select all

section .data
	frase	db	"Hello World",0x0a

section .text
	global	_start
	
%macro print 1
 	mov rax, %1
 	mov rbx, 0
 	%%loop:
		inc rax
		inc rbx
		mov cl, [rax]
    		cmp cl, 0x00
    		jne %%loop
    		mov rax, 1
    		mov rdi, 1
    		mov rsi, %1
    		mov rdx, rbx
    		syscall 
%endmacro

_start:
	print frase
	
	mov rax, 60
	mov rdi, 0
	syscall	
[bits64]

User avatar
Kodo no Kami
Admin
Admin
Posts: 688
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

Re: [tutorial] int 0x80 - write e read (nasm)

Post by Kodo no Kami » Sun Jan 21, 2018 12:41 pm

show mano \o
Image

que desagradavel ~ mirai kuriyama

Post Reply

Return to “x86 e x64”