2009-11-15 2 views
8

Я немного смущен идеей инъекции кода в C. Если кто-нибудь сможет объяснить это и показать, как это делается, я был бы признателен.Понимание и выполнение инъекции кода в C

Так что скажем, в C у вас есть массив Char размером 512, который записывается в содержимое сокета длиной 1024, и этот массив символов теперь содержит какой-то код, но только половину того, что было написано.

Каким образом вредоносный код выполняется в переполнении буфера, я думаю, что меня путают по структуре процесса (стек, куча, данные, текст).

+3

Вы можете принять ответы на некоторые из ваших предыдущих вопросов, установив флажок рядом с правильным ответом. –

+0

Спасибо, ребята, я даже не знал об этой функции. – Recursion

ответ

8

Общий трюк связан с тем, как код программы и переменные выкладываются в памяти. Например, когда функция называется программой (код, вставленный компилятором), должен хранить адрес инструкции для возврата. Так что, если это 32-битное слово как раз перед началом стека, можно сделать следующее:

void foo() 
{ 
    int array[5]; 
    int var = 0; 
    int var2 = 0; 

    // read in user input 
    printf("Enter index and value to write:"); 
    scanf("%i", var); 
    scanf("%i", var2); 

    // malicious user might set var to -1 and var2 to an address to execute 
    // if say the 32-bit value before the stack variables is the instruction to 
    // return to 
    array[var] = var2 

    // return now goes to malicious code 
} 

(. Так что ваша работа состоит в том, чтобы построить код так, что такое не возможно :))

Правила реализации вызова функции, выделенные переменные стека, переданные значения и возвращаемые значения называются calling convention. Я рекомендую прочитать прилагаемую статью для хорошего охвата конвенций C-вызова.

0

Типичный стек для каждой подпрограммы может выглядеть следующим образом:

  • параметры (значения, которые были переданы в качестве параметров этой подпрограммы)
  • обратного адреса (адрес кода, из которого вызывается эта процедура)
  • сохраненные значения регистров
  • локальные переменные

Если подпрограмма имеет локальный variabl e и как-то писать за концом локальной переменной, а затем перезаписывать значения (в стеке), такие как адрес возврата, то есть адрес кода, который будет выполняться в конце подпрограммы, когда подпрограмма выполняет «возврат ».

2

Если вы выделяете буфер в стеке и переполняется, он записывается в стек. Стек содержит указатель возврата для функции, которая выделяет буфер. Итак, если вы переполняете буфер в стеке, вы можете установить указатель возврата на что-то произвольное; тем самым давая вам контроль над потоком исполнения.

Что касается фактического ввода кода, это зависит. Стек - или, скорее, страница, содержащая его - часто устанавливается, чтобы не разрешать выполнение кода; но исторически было бы возможно хранить небольшие вредоносные программы в самом буфере в стеке. Return oriented programming - довольно новый вариант атаки return-to-libc, оба из которых работают вокруг бит NX.