You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Vamos analisar o que fizemos e comparar com nossa pequena tabela.<br />
Vamos ver a função write() e exit() novamente:<br />
ssize_t write(int fd, const void *buf, size_t count);<br />
[%ebx], [ %ecx ] [ %edx ]<br />
void exit(int status);<br />
[ %ebx ]<br />
Quais conclusões que chegamos? Vimos que o número da system call<br />
sempre deverá ser passada para %eax. No caso de write(), o inteiro<br />
sempre deve ser passado para %ebx, a string para %ecx e o tamanho<br />
para %edx!!! Em exit() o mesmo raciocínio: System call em %eax, e o<br />
int para %ebx. Compare tudo isso no código novamente. Você verá que<br />
agora ele faz bem mais sentido. :)<br />
Com isso dá pra se chegar a conclusão que toda system call sempre irá<br />
para %eax; argumento 1 para %ebx; argumento 2 para %ecx; argumento<br />
3 para %edx; e assim vai... Mas de qualquer colarei a tabela para<br />
acompanharmos com clareza. Bem, agora que terminamos nosso<br />
protótipo em C e em ASM. Vamos logo pegar todos os opcodes<br />
(instruções válidas) em hexadecimal e finalizar nosso shellcode.<br />
Compile o asmwrite.c normalmente, execute-o para ter certeza de que<br />
funciona e vamos pegar os códigos hexadecimais no GDB.<br />
root@motdlabs:~/IP_FIX/shellcode# gcc -o asmwrite asmwrite.c<br />
root@motdlabs:~/IP_FIX/shellcode# ./asmwrite<br />
MOTDLabs<br />
root@motdlabs:~/IP_FIX/shellcode#<br />
Funciona perfeitamente.<br />
Agora precisamos debugá-lo para pegarmos os códigos em<br />
hexadecimal.<br />
root@motdlabs:~/IP_FIX/shellcode# gdb asmwrite<br />
GNU gdb 5.3<br />
Copyright 2002 Free Software Foundation, Inc.<br />
GDB is free software, covered by the GNU General Public License, and<br />
you are welcome to change it and/or distribute copies of it under<br />
certain conditions.<br />
Type "show copying" to see the conditions.<br />
There is absolutely no warranty for GDB. Type "show warranty" for<br />
details.<br />
This GDB was configured as "i386-slackware-linux"...<br />
(gdb)<br />
O gdb pra quem não conhece, é um GNU Debugger. Um excelente<br />
debugador livre muito completo. Não explicarei todos os comando que<br />
ele possui, mas explanarei os quais iremos usar. Voltando ao asmwrite<br />
vamos "disassembliar" o objeto e conferir seu código:<br />
65