Посл.ответ |
Сообщение |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 13:38 · Поправил: Nimnul · Личное сообщение · #1
У меня появилась необходимость в написании алго раскрутки стека, только на основе анализа call команд по обратному адресу. Алгоритм такой сканирую стек, предполагая что данная запись есть обратный адрес, проверяю сигнатуры опкода call команды.
Проблема в том, что я не знаю как отличить например эти две последовательности, которы можно трактовать как два разных типа вызова либо FF либо E8. Несмотря на то что такое совпадение может произойти редко, все же оно происходит.
Это можно трактовать как FF 55 F8 или E8 63 FF 55 F8
00: B8 E8 E8 E8 63 mov eax,0E8E8E863
05: FF 55 F8 call dword ptr [ebp-8]
08:;обратный адрес
Здесь E8 63 FF FF 1E или FF 1E
00: 83 C0 01 add eax,1
03: E8 63 FF FF 1E call 79EF0295
08:
----- have a nice day | Сообщение посчитали полезным: |
|
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 18 декабря 2007 13:46 · Личное сообщение · #2
использовать диасм длин мс-рема =)
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 13:51 · Личное сообщение · #3
дизасм длин не работает в обратную строну
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 237.0 (наставник), 20thx Активность: 0.13↘0 Статус: Участник sysenter
|
Создано: 18 декабря 2007 13:56 · Личное сообщение · #4
В Win32 значимость маш. кодов первых 5 байт ф-ций одинакова.
----- продавец резиновых утёнков | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 18 декабря 2007 13:58 · Личное сообщение · #5
как-то надо определить начало команд... хз даже каг.. парсить назад, до хидера, а потом дизасмить вниз %))) извратно конечно.
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 13:59 · Личное сообщение · #6
HiEndsoft
отжиг великого реверсера?
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 14:00 · Личное сообщение · #7
Ice-T
мысль, но я боюсь что если дизасму длинн скормить не правильное начало, тогда он может дальше выдать мусор.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 18 декабря 2007 14:01 · Личное сообщение · #8
HiEndsoft это ты про 8B FF 55 8B EC если да, то это же только в виндовых длл и то не во всех функциях.. или я не понял о чем ты
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 38.6 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 18 декабря 2007 14:44 · Поправил: bad_boy · Личное сообщение · #9
Nimnul
Парсить от предположительного адреса вверх до идентификатора начала функции или до конца вышестоящей функции, а потом скармливать дизасму.
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 14:51 · Личное сообщение · #10
1. что значит парсить вверх?
2. что по твоему может быть "идентификатор начала функции"
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 237.0 (наставник), 20thx Активность: 0.13↘0 Статус: Участник sysenter
|
Создано: 18 декабря 2007 14:55 · Поправил: HiEndsoft · Личное сообщение · #11
Ice-T да только для Win32 dll, и для слинкованых мелкософтовским линкером. Понял- не втему.
Может сплейсингом проверять гипотезу о начале ф-ции в смысле подменой кода)?
----- продавец резиновых утёнков | Сообщение посчитали полезным: |
Ранг: 38.6 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 18 декабря 2007 15:00 · Личное сообщение · #12
Nimnul
1. Просматривай байты выше
2. думаю что
ret
push ebp
mov ebp,esp
можно считать идентификатором начала
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 15:27 · Личное сообщение · #13
1. Просматривать байты это не парсить
2. между ret и push ebp бывают еще 0xCC как правило. Кроме того push ebp это далеко не всегда бывает первой командой.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 18 декабря 2007 15:36 · Личное сообщение · #14
bad_boy это не надежно, особенно если там буит морф =)
HiEndsoft че про сплайсинг? кто сказал, что раскурчивать надо вызовы только виндовых функций или вообще функций из каких-то длл?
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 38.6 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 18 декабря 2007 15:41 · Личное сообщение · #15
Nimnul
Не так выразился
Ice-T
Ну тогда только с начала файла причётся работать
| Сообщение посчитали полезным: |
Ранг: 237.0 (наставник), 20thx Активность: 0.13↘0 Статус: Участник sysenter
|
Создано: 18 декабря 2007 16:20 · Личное сообщение · #16
Ice-T И что? Если не получается наблюдением, можно вмешательством.
----- продавец резиновых утёнков | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 18 декабря 2007 17:43 · Личное сообщение · #17
HiEndsoft объясни подробнее задумку, я лично нифига не понял, как ты буишь сплайсить все функции или че ты вообще хочешь?
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 237.0 (наставник), 20thx Активность: 0.13↘0 Статус: Участник sysenter
|
Создано: 18 декабря 2007 18:05 · Поправил: HiEndsoft · Личное сообщение · #18
Я так понял все это надо для самодельного отладчика и вопрос в том что бы определять по данным в стеке, являются ли эти данные адресом об вызова ф-ции или нет. Если так, то что нам мешает подменять в предполагаемом адресе родной код на jmp, int3 или еще чего с учетом обработки exception.
----- продавец резиновых утёнков | Сообщение посчитали полезным: |
Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 18 декабря 2007 21:18 · Личное сообщение · #19
Nimnul, в виндах есть ф-кция которая даст тебе весть стек для потока. Если есть символы, то получишь ещё и имена с аргументами.
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 18 декабря 2007 21:48 · Личное сообщение · #20
Может ты еще знаешь название? . в принципе та функция что я написал делает правильное определение вызовов, единственно иногда неправильно определяется команда.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 18 декабря 2007 22:18 · Личное сообщение · #21
s0larian
Насколько я знаю, стандартные виндовые функи раскручивают только по фреймам. Если фрейма нет или хитрожопо как-то сделано, функа не покатит.
| Сообщение посчитали полезным: |
Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 18 декабря 2007 23:05 · Личное сообщение · #22
StackWalk64
| Сообщение посчитали полезным: |
Ранг: 163.7 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 19 декабря 2007 05:17 · Личное сообщение · #23
Попробуй парсить обе ветки, неоднозначность разрешится дальше.
| Сообщение посчитали полезным: |
Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 декабря 2007 05:33 · Личное сообщение · #24
ИМХО идея с "обратным" дизасмом - полный бред. Пример:
jmp @1
...
ДАННЫЕ
...
@1:
call xxxx
Да и на нормальном коде обратный дизасм нормально не сделать - придется методом перебора выбирать подходящие команды и в результате может получиться множество неправильных вариантов.
| Сообщение посчитали полезным: |
Ранг: 500.5 (!), 8thx Активность: 0.23↘0 Статус: Участник
|
Создано: 19 декабря 2007 08:13 · Личное сообщение · #25
Единственное что на мой взгляд реально - это дизасмить вперед до ret (ret xx) с заходом в call'ы. Кроме того, конструкции типа push addr/ret будут пролетать - ибо адреса возврата и соответствующих вызовам процедур опкодов мы там не увидим.
----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 09:05 · Поправил: Nimnul · Личное сообщение · #26
dermatolog
FF 3b и FF 2b не конфликтуют (т.е. нет вариантов неоднозначной трактовки.)
FF 6b и E8 не конфликтуют
Примеры конфликтов
E8 63 FF 5X 00 // E8 и FF 3b
E8 63 63 FF 1X // E8 и FF 2b
FF 9X 63 FF 5x 00 // FF 6b и FF 3b
FF 9X 63 63 FF 1X // FF 6b и FF 2b
для FF 1X кроме FF 15
не так уж и плохо. Достаточно проверить валидность адреса в E8 или в FF 9x и все.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 500.5 (!), 8thx Активность: 0.23↘0 Статус: Участник
|
Создано: 19 декабря 2007 09:38 · Личное сообщение · #27
Nimnul
можно кстати еще проверять назначение call'ов - указывают ли они в пределы секции кода (или в пределах между imagebase и imagebase+imagesize) - это снизит вероятность ошибок имхо...
----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels | Сообщение посчитали полезным: |
Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик
|
Создано: 19 декабря 2007 09:46 · Личное сообщение · #28
Smon пишет:
можно кстати еще проверять назначение call'ов - указывают ли они в пределы секции кода (или в пределах между imagebase и imagebase+imagesize)
тогда вызовы стистемных DLL-ок не найдутся...
| Сообщение посчитали полезным: |
Ранг: 500.5 (!), 8thx Активность: 0.23↘0 Статус: Участник
|
Создано: 19 декабря 2007 09:53 · Личное сообщение · #29
системные дллки обычно вызываются через call [addr], их можно не трогать
----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels | Сообщение посчитали полезным: |
Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 декабря 2007 10:07 · Личное сообщение · #30
Nimnul пишет:
FF 3b и FF 2b не конфликтуют (т.е. нет вариантов неоднозначной трактовки.)
FF 6b и E8 не конфликтуют
Вот тебе первый пример:
E8XXXXFFD0
Ну вот попробуй определи - либо тут CALL XXXXXXXX либо CALL EAX
Второй пример:
E8XXFF50XX
Либо тут CALL XXXXXXXX либо CALL [EAX+XX]
Продолжать можно долго )
| Сообщение посчитали полезным: |