Обратная разработка/Введение

Материал из CyberSchool Wiki
Перейти к навигации Перейти к поиску

Ассемблер

Указание размера при работе с памятью

В инструкции mov [...], eax ассемблеру понятно, что в память нужно записать 4 байта. Возьмём, например, инструкцию mov [...], 123. Так как в таком случае непонятно, какой именно размер у числа 123, то перед [...] выражением следует явно добавить его тип — указатель на какой-то тип числа. Записывается это как <TYPE> ptr [...], где вместо TYPE мы подставляем требуемый нам тип. Например, в нашем примере 123 мы хотим сохранить как DWORD, в таком случае инструкция примет вид mov dword ptr [...], 123

Метки

В программе можно какому-то месту задать название, написав метку и написав после неё знак двоеточия:

loop_forever:
nop
jmp loop_forever

Такими метками можно обозначать как места в коде, так и давать названия данным.

Метка, с которой начинается выполнение программы, обычно называется _start.

Данные

В программу можно вставить свои данные с помощью ключевых слов db, dw, dd и аналогичных. Например, nop и db 0x90 будут давать один и тот же машинный код инструкции NOP x86.

Если нужно только выделить место, а значение нам не важно, то можно использовать ключевые слова resb и аналогичные. Они принимают аргументом, сколько именно указанных типов данных нужно выделить. Например, resd 0x20 выделит 20 DWORD'ов, или 80 байт.

Пример использования:

_start:
mov eax, 0xDEADCOFE
mov [_buffer], eax
hlt

_flag: db "FLAG{EXAMPLE}"
_buffer: resb 64

Документация по инструкциям x86

Прочее