• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Асемблерная вставка в С-коде

  • Автор темы Breen
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Breen

Такая функция см. ниже, компилятор С Minus 32 2.2.2, этот код тестит ОЗУ методом "бегущий ноль", вопрос такой: как связаны переменные объявленные в Си, с ассемблерныым кодом и что такое ebp-4 b ebp-12?
Копирайт : © 2001 by Stepan Karpenko


Тест Walking 0's
*/
long walking0()
{ /* Ни вкоем случае не менять положение переменных !!! */
/* Новые добавляются с конца !!! */
unsigned long i;
unsigned long lastbyte;
long res;

res=0;
lastbyte=_AllMemSize*0x100000;

for(i=0x100000; i<lastbyte;i++)
{
#asm
mov ebx, dword ptr [ebp-4]
mov ah, byte ptr fs:[ebx] ; Back up old byte
mov byte ptr fs:[ebx], 0
mov al, byte ptr fs:[ebx]
cmp al, 0
je Next_Walking_0
inc dword ptr [ebp-12]
Next_Walking_0:
mov byte ptr fs:[ebx], ah ; Restore old byte
#endasm
}
return res;
}
 
O

Over

1. Переменные, которые объявляются в функции, доступны всё время, пока эта функция выполняется. Не имеет значения, на каком языке написана вставка. Её можно было бы и на бейсиеке написать, если бы возможность была. Главное, что переменные одинаково доступны из любых таких вставок. Это просто как продолжение той же самой функции, но только на другом языке программирования.
2. EBP ( от англ. base pointer -- указатель основания, или базы) - это регистр для работы со стэком. Этот регистр служит своего рода реперной точкой, относительно которой вычисляются адреса локальных переменных, размещенных на стеке.
Теперь рассмотрим программу. Вот эти строки.
Код:
unsigned long i; 
unsigned long lastbyte;
long res;
В камментах написано, что нельза менять порядок переменных. Почему? Всё потому, что при объявлении они все помещаются в стек и именно в том порядке, в котором объявлены. Сначала в стек ляжет res, затем lastbyte, и последней ляжет переменная i. Смотрим её тип - unsigned long. Размер в байтах этого типа - 4 байта.
Теперь посмотрим этот код
Код:
mov ebx, dword ptr [ebp-4]
На момент выполнения этой строки в регистре ebp находится адрес байта, следующего за переменной i. А в самой строке выполняется занесение в регистр ebx значения, на 4 байта меньше, чем значение ebp, т.е. указатель на переменную i. Переменная i содержит как значения адреса памяти. В следующей строке содержимое ячейки по адресу из i заносится в регистр AH, чтобы его сохранить. В следующей строке по этому адресу прописывается 0. В следующей строке этот ноль из ячейки копируется в регистр AL. В следующей строке сравниваются значения из ячейки и регистра, если ячейка плохая, то значения не будут равны. Тогда командой inc произойдёт увеличение значения переменной по адресу ebp-12, т.е. переменной res. Она тут выполняет роль индикатора исправности памяти: если всё будет исправно, то она будет = 0, и возвратится в конце программы.
В последней АСМ-овой строке из регистра AH копируется обратно в ячейку сохранённый байт.
 
B

Breen

Спасибо за развернутый ответ, прям как учебник читаешь!
Если не сложно, объясните что есть ptr [] и ptr fs:[], в чем разница?
 
O

Over

"fs:" Это название сегмента. Если просто ptr[], то тут берётся абсолютный адрес, смещение которого относительно текущего сегмента(сегмента кода) указано в квадратных скобках, а если ptr fs:[], то берётся абслютный адрес, смещение которого указано в скобках, и вычисляться будет относительно начала сегмента fs:
Советую вам, ув. Breen, обратиться к учебнику по Ассемблеру. Там всё толково написано. В инете их полно везде.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!