Обратная разработка/Введение
Содержание
Ассемблер
Указание размера при работе с памятью
В инструкции 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
- http://looch-disasm.narod.ru/refe01.htm (ru)
- https://software.intel.com/en-us/articles/intel-sdm (en)
Прочее
- Онлайн ассемблер/дизассемблер https://defuse.ca/online-x86-assembler.htm
- Книга Юричева https://beginners.re
- Задачи Юричева https://challenges.re