У меня есть этот код, в котором есть какая-то уязвимость, но я не могу его использовать.
Пока что вот что я заметил:
1) если argv [1] = 3 и argc = 3, то он переполняется и записывает argv [2] в память массива [3] в функции "place_int_array".
2) если argv [1] <0 и argc = 3, то argv [2] переопределяет память в массиве [argv [1]]. </p>
3) мы пишем argv [0] в функции printf, которую можно каким-то образом использовать (вообще не удалось ее использовать).
Вот код.
Я положил некоторые комментарии, надеюсь, что это читабельно.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int secretCode = 123;
void print_secret_code(){
//TODO - call this from somewhere...
printf("You get better at this stuff, ah?! Go get your treasure, the code is %d\n", secretCode);
}
// array, 3
void fill_array(int array[], size_t len){
unsigned int i;
for (i = 0; i < len; i++){
array[i] = i * 10;
printf("array[i]: %d, i: %d\n", array[i], i);
}
}
void place_int_array(int slot,int value){
//buffer size = 3*4=12 bytes?
int array[3];
//sizeof(array)=4*SAFES ( = 12 here), sizeof(array[0]) = 4 ==> fill_array(array, 12/4=3)
fill_array(array, sizeof(array)/sizeof(array[0]));
//vuln - when slot = 3.
if(slot>3) //we stop bad guys here
printf("safe number is greater than 3, out of bounds.\n");
else{
//vuln?
array[slot]=value;
printf("filled safe %d with %d.\n",slot,value);
}
return;
}
int main(int argc,char **argv){
if(argc!=3){
printf("Welcome to Alladin's magic cave!\n");
printf("Enter the secret number into the right safe and get the treasure cave entrance code!\n");
printf("syntax: %s [SAFE NUMBER] [SECRET NUMBER]\n",argv[0]);
//TEMP TEMP - for debugging only
printf("print_secret_code function = %p\n", print_secret_code);
}
else
//atoi("14s56")=>14, atoi("a14s56")=>0
place_int_array(atoi(argv[1]), atoi(argv[2]));
exit(0);
}
Я ожидаю, что каким-то образом удастся управлять потоком программы для выполнения "print_secret_code". Я знаю, как найти его адрес, но не могу найти способ использовать программу так, чтобы она попала в эту память.
ПРИМЕЧАНИЕ: я знаю, как отладить и заставить его печатать значение переменной. Я спрашиваю, как я могу использовать сам код для перехода в эту функцию.