2015-11-01 3 views
-2

Это только для академического использования. Курс по обеспечению безопасности. Учитель хочет, чтобы я одурачил программу, введя что-нибудь, по-моему, для ввода другой функции, чем f2 или f3. Я вижу все адреса памяти, используя GDB. Что мне следует вводить для запуска f1?Программа Fooling C, указав адрес указателя

Спасибо за помощь.

void f1 (void) {...} // f1 address 0x8048559 
void f2 (void) {...} // f2 address 0x804857e 
void f3 (void) {...} // f3 adrress 0x8048627 

fptr ptrs[2] = {NULL, f2, f3}; // ptrs adress 0x804a0d4 

int main(int argc, char *argv[]) { 
    char buf[1024] = {0}; // buf address 0xbffff130 
    int r; // r address 0xbffff530 
    fptr p1 = f1; // p1 address 0xbffff534 

    r = read(0, buf, sizeof(buf)-sizeof(char)); 

    if(r > 0) { 
     buf[r] = '\0'; 
     int s = atoi(buf); 
     fptr tmp = ptrs[s]; 
     tmp(); 
    } else { 
     break; 
    } 
} 
+2

Почему вы пытались это сделать? где проблемы? – lrleon

+0

Я не знаю, как обмануть содержимое переменной os s для запуска функции f1. Это проблема. Я попытался ввести адрес f1, но не работал. –

+0

Возможно, вам нужно использовать переполнение буфера? –

ответ

2

индекс массива оператор a[b] является эквивалентом *((a)+(b)).

Дополнение между указателем и целым числом сначала умножает целое число на размер типа, по которому указывает указатель, , затем добавляется умноженное значение и сумматор.

По этой причине, десятичное значение (0xbffff534 - 0x804a0d4)/sizeof(fptr) (771675416, если это sizeof(fptr) 4) должен работать.

Если я прав, используя это значение, адрес ptrs[s] должен быть адрес p1 и используя tmp() функцию f1 будет называться.

+0

Привет, MikeCat, это действительно сработало. Ввод 771675416 Функция p1 была выполнена на tmp(). Простите мое невежество, но я не подчиняюсь уравнению. (0xbffff534 - 0x804a0d4) = 0xB7FB5460 0xB7FB5460/4 = 0x2DFED518 = 771675416. Мой плохой. Неправильный перевод. Большое спасибо. –

+0

'0xbffff534' является адресом' f1' и '0x804a0d4' является адресом' ptrs'. Получите смещение, вычитая их и разделив результат на 'sizeof (fptr)', чтобы преобразовать смещение в индекс массива. – MikeCAT

Смежные вопросы