Windows Shellcoding

Hi, vor etwa 4 oder 5 Tagen habe ich mal just 4 Fun die Aufgaben des Buha exploitme-contests angefangen zu lösen.

(Vorweg, ich mache es mit WinXp, statt mit Linux)

Nunja die ersten beiden waren relativ simpel, in dem einem musste man mit einem StackOverflow nur an eine andere Stelle im Code Springen, und und im anderem einen Format String Bug ausnutzen.

Als ich weitermachen wollte mit den restlichen Aufgaben, fiel mir auf, dass ab dem 3ten Exploitme alle weiteren mit (selbstgeschriebenem) Shellcode gelöst werden mussten.

Nun gut, da habe ich direkt angefangen rauszufinden wie man Shellcode schreibt, da ich in der Vergangenheit schon etwas asm geschrieben hatte, viel mir das nicht so schwer (wobei mir Jemand noch ein bisschen geholfen hat)

Also erstmal dieses Paper: http://www.vividmachines.com/shellcode/shellcode.html

komplett durch geackert und nunja, wenn ich die Adressen kenne (die man mit arwin (http://www.vividmachines.com/shellcode/arwin.c) rausfinden kann), fällt es mir nun sehr leicht shellcode zu schreiben:

Code:
"\xeb\x10"
"\x58"
"\x50"
"\xb8\x6a\x18\xc1\x77"        ; 0x77c1186a (adresse von printf (bei mir))
"\xff\xd0"
"\xb8\xda\xcd\x81\x7c"        ; 0x7c81cdda (adresse von ExitProcess (bei mir))
"\xff\xd0"
"\xe8\xeb\xff\xff\xff"
"\x48"                        ; H
"\x61"                        ; a
"\x42"                        ; B
"\x6f"                        ; o

Also letztendlich ein Shellcode der einem "HaBo" ausgibt. Funktioniert auch einwandfrei.


Nun zu dem wo ich Hilfe/Verständnis suche

So, wie das nun meistens ist, ist bei Linux mal wieder alles einfacher und unkomplizierter. Da gibt man nicht die Adresse der Funktion an, sondern die Nummer des syscall's. So wäre execve() der syscall Nummer 11.

Bei Windows sind die Adressen der Funktionen von Version zu Version (so wie ich es mitbekommen habe) woanderst, also würde der oben genannte shellcode bei mir mit Win Xp mit sp2 funktionieren, aber bei jemanden mit sp1 oder 2000 nicht. (sofern man die Adressen nicht per Hand abändert)

Da es aber von Vorteil wäre einen Shellcode zu haben/schreiben zu können, welcher auf allen Windows Versionen funktioniert, habe ich ein bisschen gesucht, und bin auf PEB gestoßen. (http://nologin.org/Downloads/Papers/win32-shellcode.pdf)

Code:
find_kernel32:
push esi
xor eax,eax
mov eax,fs:[eax+0x30]
test eax,eax
js find_kernel32_9x
find_kernel32_nt:
mov eax,[eax+0x0c]
mov esi,[eax+0x1c]
lodsd
mov eax,[eax+0x8]
jmp find_kernel32_finished
find_kernel32_9x:
mov eax,[eax+0x34]
lea eax,[eax+0x7c]
mov eax,[eax+0x3c]
find_kernel32_finished:
pop esi
ret

Nunja, soweit ich weis findet dieser code nur die kernel32, aber die ist doch eigenltich immer in einem vulnerablen Programm geladen (sodas man beispielsweise ExitProcess() (sofern man die Adresse hat) problem ausführen kann)

So weiter im Text:

Ich habe ein Beispiel gefunden, um eine FunktionsAddresse zu finden:

Code:
GetProcAddress.
The find_function assembly:
find_function:
pushad
mov ebp,[esp+0x24]
mov eax,[ebp+0x3c]
mov edx,[ebp+eax+0x78]
add edx,ebp
mov ecx,[edx+0x18]
mov ebx,[edx+0x20]
add ebx,ebp
find_function_loop:
jecxzfind_function_finished
dec ecx
mov esi,[ebx+ecx*4]
add esi,ebp
compute_hash:
xor edi,edi
xor eax,eax
cld
compute_hash_again:
lodsb
test al,al
jz compute_hash_finished
ror edi,0xd
add edi,eax
jmp compute_hash_again
compute_hash_finished:
find_function_compare:
cmp edi,[esp+0x28]
jnz find_function_loop
mov ebx,[edx+0x24]
add ebx,ebp
mov cx,[ebx+2*ecx]
mov ebx,[edx+0x1c]
add ebx,ebp
mov eax,[ebx+4*ecx]
add eax,ebp
mov [esp+0x1c],eax
find_function_finished:
popad
ret

Da weis ich garnicht welche Funktion gesucht wurde und auch nicht wie.
Ich hoffe Jemand kann mir das (mehr oder weniger im detail) genau erklären, wie man das macht und wie man es mit einer beliebig anderen Funktion machen kann.

Ich hoffe Jemand kann helfen <:

mfg
 
Im Prinzip geht es darum, die Exporttabelle der Kernel32 DLL zu finden und da den richtigen API-String->und dadurch die API Adresse herauszubekommen. Der Teufel steckt aber im Detail.
Hilfreich könnte das PE Format sein (wie es aufgebaut ist und wie man Exports findet) und eventuell http://www.tuts4you.com/download.php?view.320 (letzer Abschnitt, "Inlinepatching Themida") der Code da macht auch dasselbe, ist allerdings besser kommentiert (alle Angaben ohne Gewähr, da nur flüchtig die PDFs durchgeguckt ;) ).
Bsp:
 
Zurück
Oben