01.01.2013 Views

Liber 000 - Astrum Argentum

Liber 000 - Astrum Argentum

Liber 000 - Astrum Argentum

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

* Compilação: # gcc -o asmwrite asmwrite.c<br />

*/<br />

#include <br />

main()<br />

{<br />

__asm__(<br />

"mov $0x1, %ebx \n" /* STDOUT da função write().<br />

*/<br />

"push $0x0A \n" /* Aqui temos... (\n).<br />

*/<br />

"push $0x7362614C \n" /* ...nossa string... (sbaL).<br />

*/<br />

"push $0x44544F4D \n" /* ...ao contrário. (DTOM).<br />

*/<br />

"mov %esp, %ecx \n" /* Como toda nossa string se localiza no Stack,<br />

vamos jogá-la para o contador. */<br />

"mov $0xa, %edx \n" /* Aqui está o tamanho da string: 0xa=10.<br />

Jogamos para o registradador de dados. */<br />

"mov $0x4, %eax \n" /* Nossa querida system call de write().<br />

*/<br />

"int $0x80 \n" /* A melhor hora! Cai pro modo kernel e executa<br />

tudo acima! */<br />

"mov $0x0, %ebx \n" /* Jogamos 0(EXIT_SUCCESS) em %ebx.<br />

*/<br />

"mov $0x1, %eax \n" /* Outra querida system call, da função exit()<br />

dessa vez. */<br />

"int $0x80 \n" /* Finalmente! Tudo é executado!<br />

*/<br />

);<br />

}<br />

shellcode/asmwrite.c<br />

O que acharam? Simples não? Bom, pra alguns sim, pra outros não. Se<br />

você não entendeu, estude mais assembly, pegue os links no final<br />

desse artigo e se debulhe!!! Mas mesmo assim irei explicar o que se<br />

passa. Uma dúvida que geralmente trava os inciantes na linguagem<br />

assembly, é a passagem dos argumentos das funções aos registradore,<br />

muitos ficam perdidos sem saber pra qual passar aí vai uma grande<br />

ajudar que me abriu muito a mente.<br />

Os problemas acabaram quando achei o "Linux System Call Table" em um<br />

site que mostrava toda a system call table que nós conhecemos em:<br />

root@motdlabs:/# cat /usr/include/asm/unistd.h<br />

E também para qual registrador cada argumento vai, veja o exemplo<br />

da função exit() e write():<br />

%eax Nome Fonte %ebx %ecx %edx %esx %edi<br />

64<br />

1 sys_exit kernel/exit.c int<br />

4 sys_write arch/i386/kernel/process.c unsigned<br />

int<br />

char * size_t

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!