2016-12-23 4 views
2

Это мой первый пост, и я новичок в сборке и отладке, поэтому несите меня, пожалуйста.Адреса в OllyDbg Изменение на перезагрузке программы

Я пытался ввести некоторый код (маленький вызов MessageBoxA) в исполняемый файл Windows 7 Notepad. Однако я столкнулся с проблемой адресов. Сначала я открыл exe в OllyDbg, затем я пошел в строку, содержащую текст ASCII «notepad.pdb». Затем я поместил строку ASCII ниже (например, «INJECTED NOTEPAD»). Далее, ниже, я вошел в этот ассемблерный код:

PUSH 0 
PUSH address_of_ASCII_string ; In this case, 00A6B668C 
PUSH address_of_ASCII_string ; In this case, 00A6B668C 
PUSH 0 
CALL MessageBoxA 

Затем я пошел в первой строке кода в программе (просто щелкнув правой кнопкой мыши и нажатие Перейти к Origin (или просто нажмите * на цифровой клавиатуре)) Затем я заменил первую строку инструкцией JMP на адрес первого PUSH 0 в моем введенном коде. Затем я поместил инструкцию, которую я заменил в конце введенного кода. После этого я поместил JMP-инструкцию в строку кода после того, как моя команда JMP перескакивает на мой код (да, я просто описал кодек или вид). Все работает нормально, когда я запускаю его. Однако, когда я сохраняю измененный код в новом исполняемом файле и снова запускаю его с помощью OllyDbg, он не работает. Когда я пытаюсь ссылаться на строку ASCII, которую я вставляю, адрес полностью ошибочен. Пример в изображениях ниже:

Как вы можете видеть, я нажимаю строку в стек, но когда я снова перезагрузить измененную программу в отладчик, адрес строки изменений, но мой код этого не делает. Поэтому, когда я вызываю функцию MessageBoxA, она ошибочно, потому что я загрузил неправильный адрес для аргументов Text и Caption. Как это исправить?

+1

Ну да, вы пытаетесь использовать абсолютные адреса, когда должны использоваться относительные адреса. Базовый адрес исполняемого файла является случайным образом при каждом запуске процесса, поэтому фиксированный адрес недействителен для нескольких вызовов. (Также: добро пожаловать в Stack Overflow! Спасибо за хорошо спрошенный и хорошо представленный вопрос.) –

+0

Спасибо. Как я буду использовать относительный адрес? – DD314

+0

Я бы сказал, что вы не пытаетесь ввести код, но патч exe. вам, конечно, нужно использовать не относительные, а абсолютные адреса, но все абсолютные адреса должны быть описаны в разделе '.relocs'. в одном случае ваш патч работает - отключить релокс на exe. для этого вам нужно установить флаг 'IMAGE_FILE_RELOCS_STRIPPED' в' IMAGE_FILE_HEADER.Characteristics' - после этого exe всегда будет загружен на постоянный адрес и возможные абсолютные адреса жесткого кода – RbMm

ответ

4

Вы столкнулись с последствиями ASLR. Короче говоря, это означает, что исполняемый файл, выполняющийся в ОС (в этом примере Windows), не будет иметь один и тот же базовый адрес для нескольких исполнений.

Итак, есть несколько способов вставить код в другой двоичный файл, я адресую 2 здесь, и я также угадаю (после прочтения комментариев), что вы пытаетесь исправить двоичный файл, который находится на диске.

  1. Заделка двоичный файл на диске:

    а. Первый способ сделать это - удалить таблицу переезда с PE. Я бы определенно не рекомендовал этот способ, так как он может привести к сбою исполняемого файла в будущем, если он не будет загружен в его предпочтительный базовый адрес (OptionalHeader.ImageBase), который по умолчанию является обязательным для всех команд, требующих перемещения, в качестве базы для добавления смещения к.

    Допустим, у вас есть строка со смещением 0x600 из базы изображений, в случае, если исполняемый файл отображается в предпочитаемого базового адреса (обычно 0x00400000) строка будет проходить по адресу 0x00400000. Способ, которым ваш компилятор свяжет файл, будет с адресом 0x00400000 + 0x600, поэтому 0x00400600. Тогда что происходит, когда исполняемый файл загружается в другой базовый адрес? В этом случае исполняемый загрузчик Windows добавит смещение базового адреса (фактически, одного сопоставленного за вычетом предпочтительного базового адреса) к каждой записи перемещения (пример должен быть один). Поэтому, если исполняемый файл будет загружен в 0x00500000, загрузчик добавит 0x00100000 к этой записи перемещения, ведущей к абсолютному адресу 0x00500600.

    b.Второй способ - добавить запись перемещения в двоичный файл. Таким образом, в отличие от способа, описанного в (a), вы не повредите двоичный файл и добавите только запись перемещения, которая после загрузки исполняемого файла загрузчик изменит адрес на правильный (если вы добавили правильный запись).

    c. Запишите независимый код позиции и исправьте двоичный код с помощью этого кода. Пример:

    sub  esp, 10*4 
    mov  byte [esp], 0x68 ; 'h' 
    mov  byte [esp + 1], 0x69 ; 'i' 
    mov  byte [esp + 2], 0x00 ; null byte 
    mov  byte [esp + 3], 0x79 ; 'y' 
    mov  byte [esp + 4], 0x6f ; 'o' 
    mov  byte [esp + 5], 0x75 ; 'u' 
    mov  byte [esp + 6], 0x00 ; null byte 
    mov  eax, esp 
    push 0 
    push eax 
    add  eax, 3 
    push eax 
    push 0 
    call [MessageBoxA] 
    

    Этот код будет записывать 2 необходимые строки в стек и нажмите указатели на строки в стеке, таким образом, код не нуждается в переселении, поскольку его кусок poisiton независимого кода.

  2. Заделка двоичный файл в памяти:

    с. Независимый от положения код (см. Выше)

    b. Используйте VirtualAllocEx, этот API, после его вызова, вернет адрес, на который вы можете написать, таким образом вы просто имеете отображаемый адрес в памяти и знаете где и как вводить код.

+0

Спасибо за ваш очень хороший ответ. Я либо собираюсь использовать опцию C или B. Однако как бы добавить запись перемещения в двоичный файл? Я не знаю, как это сделать. – DD314

+0

Я бы не рекомендовал это, так как это не самый тривиальный способ. Короче говоря, вы найдете каталог перемещения. В каталоге перемещений вы найдете таблицы перемещения для каждого раздела/1kb в исполняемом файле, вы найдете таблицу, заполненную записями, каждая запись сообщит вам о смещении от начала определенного раздела/1kb-фрагмента и типа перемещения. Здесь вы можете найти специфические черты: https://msdn.microsoft.com/en-us/library/ms809762.aspx – papadp