Русский / Russian English / Английский

Сейчас на форуме: Bad_guy, r0lka (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Как вычислить адрес в ассемблере
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 11:50 New!
Цитата · Личное сообщение · #1

Здравствуйте уважаемые гуру .

Подскажите плиз как мне правильно вычислить адрес в ассемблере ,
с которого берется значение в rax ...
64 битная длл
перед этим шагом в rax 0000000000000037

mov rax, ds:1Eh[rax*8]

после чего в rax оказывается нужное мне значение
Вопрос : как мне правильно перевести ds:1Eh[rax*8] в адрес , с которого происходит чтение значения ?

Ранг: 244.1 (наставник)
Статус: Участник

Создано: 13 марта 2019 12:05 New!
Цитата · Личное сообщение · #2

Хз из какого дизасма ты это скопировал, но это то же самое что
mov rax, ds:[rax*8+1Eh]
Или тебе надо объяснять что такое умножить и плюс?

| Сообщение посчитали полезным: e_sergey



Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 12:12 · Поправил: f13nd New!
Цитата · Личное сообщение · #3

cppasm пишет:
Или тебе надо объяснять что такое умножить и плюс?

Смущает база 1Eh в защищенном режиме, это похоже на rip-relative addressing, такому дизасму точно надо памятник поставить. На могиле.

ЗЫ: поглядеть бы на саму инструкцию в нех, а не на то, что дизасм выдал.

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 12:22 · Поправил: e_sergey New!
Цитата · Личное сообщение · #4

Спасибо за ответы .
Вопрос глупый - но лучше объяснить как правильно слаживать [rax*8+1Eh]
и откуда считать этот адрес - как его перести правильно

памятник поставить - это IDA 7 такое пишет
поглядеть бы на - учусь только неделю - вечером как смогу отвечу со вложением

просьба не пинать сильно


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 12:36 New!
Цитата · Личное сообщение · #5

Вобщем если инструкция выглядит так: 48 8B 04 C5 1E 00 00 00
То ида 7 ее правда дизасмит как: 'mov rax, ds:1Eh[rax*8]'
И тогда значение должно находиться действительно по 0x1E+rax*8, но каким чудом это работает в длл неясно - базовый адрес ну полный инвалид.

| Сообщение посчитали полезным: e_sergey


Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 12:40 · Поправил: e_sergey New!
Цитата · Личное сообщение · #6

базовый адрес ну полный инвалид - вот и у меня такои же вопрос
но значение после этого в rax - то которое нужно

спасибо
вечером будут исходники перед глазами - отпишу с цитатой из хекса

Ранг: 44.6 (посетитель)
Статус: Участник

Создано: 13 марта 2019 14:04 · Поправил: DrVB_5_6 New!
Цитата · Личное сообщение · #7

f13nd пишет:
То ида 7 ее правда дизасмит как: 'mov rax, ds:1Eh[rax*8]'

Так это компилятор, скорей всего наваял. Можно взять и по мануалу вручную раздербанить.
У Ильфака бывает такое.
На самом деле (скорей всего) должно быть так:

mov rax, [rax*8+1Eh] - (просто "Q" в Иде на операнде)

то, что ds присутствует в команде (что Ильфака и повело), так это компилятор.
в этом режиме (64) ds всегда = 0 и никак не влияет.

Лень разбираться, но нормальный вариант команды без ds будет отличаться в хексе!!!
Но Интел хот так, хоть эдак скушает!


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 14:08 New!
Цитата · Личное сообщение · #8

DrVB_5_6 пишет:
mov rax, [rax*8+1Eh]

Это просто другой синтаксис, неважно где эта база, за скобками или внутри с плюсом. Дефолтный сегментный регистр тоже ни на что не влияет. Его на самом деле нету в инструкции, ида добавила из педантичности. Если бы пассажир не сказал, что эта инструкция корректно выполняется, это не было бы такой большой загадкой.


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 14:16 · Поправил: Boostyq New!
Цитата · Личное сообщение · #9

А в чем загадка то? Инструкция
mov rax, qword ptr ds:[rax*8+0x1E]
В rax лежит нужный адрес / 8 (как бы выровненный по 8 байт), а 0x1E это смещение до конечного адреса

Но сегмент с какого фига они берут неясно, XED и IDA его выставляют, но в modrm/sib x64 по умолчанию нет сегмента, и он может быть только переписан префиксом для 0x64(FS)/0x65(GS), остальные префиксы игнорируются, хотя здесь и их нет


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 14:20 · Поправил: f13nd New!
Цитата · Личное сообщение · #10

Boostyq пишет:
В rax лежит нужный адрес

e_sergey пишет:
перед этим шагом в rax 0000000000000037

Какой-то он не сильно нужный, если не хочется исключение словить.
Boostyq пишет:
Но сегмент с какого фига они берут неясно

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


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 14:23 New!
Цитата · Личное сообщение · #11

Вы правы, не заметила что он запостил значение

Ранг: 44.6 (посетитель)
Статус: Участник

Создано: 13 марта 2019 14:27 · Поправил: DrVB_5_6 New!
Цитата · Личное сообщение · #12

Boostyq пишет:
(как бы выровненный по 8 байт),

Откуда такое заключение про выравнивание?
f13nd пишет:
перед этим шагом в rax 0000000000000037

Ну и что?
f13nd пишет:
если не хочется исключение словить.

А с чего бы он должно-то быть?
0х37 * 8 + 0x1E


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 14:29 · Поправил: Boostyq New!
Цитата · Личное сообщение · #13

Опять же что там мы только предполагаем, пускай тс дллку кинет, иначе ерундой занимаемся пытаясь отгадать.
DrVB_5_6 пишет:
Откуда такое заключение про выравнивание?

Если бы в rax было большее значение, это бы сошло за какую нибудь обфускацию, но с таким маленьким это бред.

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 14:30 · Поправил: e_sergey New!
Цитата · Личное сообщение · #14

как получается эти 37 - тоже не поиму
на rax , если помню правильно , сначала 000000000000000A или 000000000000000B (65 или 66)
потом идет mov rax, 28h и rax 0000000000000037 становится (65 - 28 = 37 )
потом mov rax, ds:1Eh[rax*8] идет

если ничего не путаю , остальное смогу добавить только вечером ...
сеичас на работе сижу .


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 14:36 · Поправил: Boostyq New!
Цитата · Личное сообщение · #15

e_sergey пишет:
на rax , если помню правильно , сначала 000000000000000A или 000000000000000B (65 или 66)
потом идет mov rax, 28h и rax 0000000000000037 становится (65 - 28 = 37 )

Ничоси, это вы в каких системах считаете?
Сложный прекол, расходимся, это тролль.


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 14:37 New!
Цитата · Личное сообщение · #16

DrVB_5_6 пишет:
А с чего бы он должно-то быть?
0х37 * 8 + 0x1E

Потому что адреса 0-0x10000 зарезервированы, чтоб подобные ошибки ловить. Попытайся выполнить эту инструкцию.

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 14:46 New!
Цитата · Личное сообщение · #17

я не считаю ничего - я написал - как получается не понимаю


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 14:49 · Поправил: Boostyq New!
Цитата · Личное сообщение · #18

А никак, я даже не знаю смеяться или плакать
сначала 000000000000000A или 000000000000000B (65 или 66)
- почему вы думаете что 000000000000000A или 000000000000000B это 'A' и 'B' соответственно из ASCII таблицы?
mov rax, 28h и rax 0000000000000037 становится (65 - 28 = 37 )
- почему вы думаете что инструкция mov вычитает из первого операнда второй?
- почему вы смешиваете hex и dec значения?

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 14:59 New!
Цитата · Личное сообщение · #19

-почему

у меня самого их много этих почему , на ваши тоже не могу ответить
извините ...

вероятно догадки лучше оставить до вечера


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 13 марта 2019 18:07 · Поправил: difexacaw New!
Цитата · Личное сообщение · #20

f13nd

> похоже на rip-relative addressing

Нет, не похоже. Так как в RIP базы и индекса SIB нет. Это походу совсем кривой дизасм и значение 1E он взял из 32i смещения.



Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 18:19 · Поправил: f13nd New!
Цитата · Личное сообщение · #21

difexacaw пишет:
Это походу совсем кривой дизасм

Сложно иду в этом заподозрить (касательно интела). Две версии: либо все было не так, как он рассказал, либо какой-нибудь очень нужный плугин/скрипт через редактирование операнда инструкцию испортил.


Ранг: 77.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 19:06 New!
Цитата · Личное сообщение · #22

f13nd пишет:
либо все было не так, как он рассказал

Да вы посмотрите что он пишет, тут не может быть либо


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 19:12 New!
Цитата · Личное сообщение · #23

Boostyq пишет:
Да вы посмотрите что он пишет, тут не может быть либо

Память странная штука, не запомнил числа, неосознанно придумал вспоминая.


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 13 марта 2019 19:28 New!
Цитата · Личное сообщение · #24

f13nd

Вероятность второго варианта вашего астрономически мала - асинхронное изменение инструкции.

Что известно наверняка - происходит выборка, тоесть это не вычисление(lea), а чтение из памяти.

Так как сегментации в 64 нет, то конструкции без базы(только индекс без x32 смещения) - это невалид кодировка.

Варианта может быть лишь два - какой то формат, который дизасм не может обработать корректно; либо какая то инструкция, для которой происходит теневая обработка(сработала ловушка, управление вернулось и под отладчиком это не видно).


Ранг: 244.0 (наставник)
Статус: Участник

Создано: 13 марта 2019 19:44 New!
Цитата · Личное сообщение · #25

difexacaw пишет:
Вероятность второго варианта вашего астрономически мала

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


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 13 марта 2019 20:05 · Поправил: difexacaw New!
Цитата · Личное сообщение · #26

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

Ранг: 13.6 (новичок)
Статус: Участник

Создано: 13 марта 2019 20:26 · Поправил: e_sergey New!
Цитата · Личное сообщение · #27

Парни - на работе ещё
но по ходу получается

1Eh = RS
37*8 = 296 = по юникоду I римская заглавная
Итого значение берется с регистра RSI

проверить смогу позже
башку сломал уже - но на ум приходит только это , скорее все намного проще как кажется ...


Ранг: 325.1 (мудрец)
Статус: Участник

Создано: 13 марта 2019 20:35 New!
Цитата · Личное сообщение · #28

Удивительно даже, какой только бред разум может создавать используя логические цепочки..

Я думал что это норм вопрос, но увы как всегда.


Ранг: 54.5 (постоянный)
Статус: Участник

Создано: 13 марта 2019 20:48 New!
Цитата · Личное сообщение · #29

а если умножить 1 на 10 будет 11 или 10 пожскажите пожалуйста а то ни как не вкурю?

Ранг: 65.0 (постоянный)
Статус: Участник

Создано: 13 марта 2019 20:56 · Поправил: hash87szf New!
Цитата · Личное сообщение · #30

бинарь в студию, тролик хД
. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Как вычислить адрес в ассемблере
Эта тема закрыта. Ответы больше не принимаются.

Видеокурс ВЗЛОМ