Невозможно получить доступ к $ eip независимо от размера буфера - gdb - PullRequest
1 голос
/ 11 марта 2020

У меня есть следующий файл C, vuln. c, и я пытаюсь продолжить атаку переполнения буфера. Моя цель - установить $eip на адрес функции read_secret.

#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("Provide your name\n");
        return 0;
    }

    vuln(argv[1]);
    return 0;
}

До сих пор, используя gdb, я могу получить ошибку сегментации, когда у меня pu sh размер входа в 1026 То есть run $(python -c "print('A'*1026)").

Однако, сколько бы я ни увеличивал 1026, $eip всегда равен 0x8049323. Я долго и упорно онлайн для любой подобной проблемы, но мне не удалось найти.

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

РЕДАКТИРОВАТЬ: Для справки, да, x41 действительно достигают, они просто никогда не делают это весь путь до $ eip.

enter image description here

Кроме того, это информационные регистры до и после ввода ввода.

До : enter image description here

После enter image description here

А адрес переменной buf равен 0xffffd230 до и после. И адрес read_secret () - 0x80491c2.

1 Ответ

1 голос
/ 12 марта 2020

Проблема заключалась в том, что внутри программы наступает момент, когда программа пытается напечатать f [i]. Они перезаписываются буфером на недопустимые адреса (т. Е. 0x41414141).

Вместо этого я выбрал адрес из 'info reg' ($ ebp), который работал для меня, и вставлял этот адрес несколько раз, пока не нажал $ eip. По сути, вы хотите выбрать здесь ЮРИДИЧЕСКИЙ адрес.

Затем я бы уменьшил количество повторений выбранного мной адреса и вместо этого поместил бы «AAAA», чтобы увидеть, где находится $ eip. Когда я нахожу $ eip, вместо этого я помещаю адрес функции, которую хочу выполнить.

...