Атака переполнения буфера, выполнение не вызванной функции - PullRequest
0 голосов
/ 20 марта 2019

Итак, я пытаюсь использовать эту программу, которая имеет уязвимость переполнения буфера, чтобы получить / вернуть секрет за заблокированным .txt (read_secret ()).

уязвимый.c // здесь не редактируется

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

void read_secret() {
    FILE *fptr = fopen("/task2/secret.txt", "r");
    char secret[1024];
    fscanf(fptr, "%512s", secret);
    printf("Well done!\nThere you go, a wee reward: %s\n", secret);
    exit(0);
}

int fib(int n)
{
   if ( n == 0 )
      return 0;
   else if ( n == 1 )
      return 1;
   else
      return ( fib(n-1) + fib(n-2) );
} 

void vuln(char *name)
{
    int n = 20;
    char buf[1024];
    int f[n];
    int i;
    for (i=0; i<n; i++) {
      f[i] = fib(i);
    }
    strcpy(buf, name);
    printf("Welcome %s!\n", buf);
    for (i=0; i<20; i++) {
      printf("By the way, the %dth Fibonacci number might be %d\n", i, f[i]);
    } 
}


int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("Tell me your names, tricksy hobbitses!\n");
        return 0;
    }

    // printf("main function at %p\n", main);
    // printf("read_secret function at %p\n", read_secret);
    vuln(argv[1]);
    return 0;
}

attack.c // подлежит редактированию

#!/usr/bin/env bash
/task2/vuln "$(python -c "print 'a' * 1026")"

Я знаю, что при печати я могу вызвать ошибку сегментадостаточно большая строка, но это никуда меня не приведет.Я пытаюсь заставить программу выполнить read_secret, перезаписав адрес возврата в стеке, и возвращает функцию read_secret вместо возврата к основному.

Но я застрял здесь.Я знаю, что должен был бы использовать GDB, чтобы получить адрес функции read_secret, но я немного запутался.Я знаю, что мне придется заменить адрес main () на адрес функции read_secret, но я не уверен, как это сделать.

Спасибо

...