Вызов Printf () редактирование исполняемого
-
09-10-2019 - |
Вопрос
Я пытаюсь «взломать» консольную программу, заставляя ее отображать что-то. Проблема в том, что я не могу распечатать новую строку (\r\n
). С дезинсублером я нашел место и отредактировал бинарный:
push 4ad0eb46 ; the string (let's pretend "Hi guys")
push 4ad0eb80 ; and the format ("%s")
call near ds:[<&msvcrt.printf>] ; call printf
jmp 4ad0eb4f ; skip data
; now here I coded the strings
mov ds:[4ad289ec],eax ; and here the program resumes
Как я уже сказал, я не могу распечатать новую линию. Я пробовал кодировать "\r\n"
в строке формата (так что это становится "%s\r\n"
, как я бы сделал в с) и напечатал "Hi guys\r\n"
, и кодируйте его в сам строку (делая его "Hi guys\x13\x10"
) и получить "Hi guys"
И два странных персонажа, вероятно, представление ASCII 0x13 и 0x10.
Решение
Ваша вторая попытка, с встраиванием персонажей непосредственно в строку, был правильным подходом. Однако вы использовали неправильные номера персонажей. Числа для возврата / строки в ASCII находятся 13 и 10 (десятичные), что составляет 0x0d и 0x0a (Hex). Вы использовали 0x13 и 0x10, что разные символы.
Посмотреть на стол Код Page 437. для номеров символов. Персонажи 19 и 16 (десятичные) действительно являются правильным указывающим треугольником и двойной восклицательным знаком.
Другие советы
Новая линия (в Windows) \r\n
.