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