У меня есть следующий файл 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.
Кроме того, это информационные регистры до и после ввода ввода.
До :
После
А адрес переменной buf равен 0xffffd230 до и после. И адрес read_secret () - 0x80491c2.