Посл.ответ |
Сообщение |
Ранг: 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 | Сообщение посчитали полезным: |
|
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 11:26 · Поправил: Nimnul · Личное сообщение · #2
так я об этом же написал выше . Я сейчас тестирую возможность скормить дизассемблеру длинн -30 байт, от обратного адреса, и посмотреть будет ли он выравниваться если это будет неправильное начало.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 19 декабря 2007 11:30 · Личное сообщение · #3
dermatolog ну а выход какой?
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 декабря 2007 11:38 · Личное сообщение · #4
Ice-T пишет:
ну а выход какой?
Видимо полный реверсинг имейджа как это делает IDA - больше вариантов я не вижу.
Nimnul
Попробуй к своему алгоритму приделать загрузку релоков и уже с их помощью можно будет отличать команды с настраиваемыми операндами и тогда можно четко определять границы этих команд и уже начинать дизасм с границы релока.
| Сообщение посчитали полезным: |
Ранг: 303.7 (мудрец), 4thx Активность: 0.19↘0 Статус: Участник tPORt Manager
|
Создано: 19 декабря 2007 12:01 · Личное сообщение · #5
Nimnul пишет:
скормить дизассемблеру длинн -30 байт
Нету смысла, это не решение, интел не гарантирует, что в этом случае дизасм начнёт хоть когда-нибудь дизасмить правильные команды, хотя на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 12:25 · Поправил: Nimnul · Личное сообщение · #6
dermatolog
для этих команд релоки не пишутся.
Для FF 15 xx xx xx xx адрес известен.
Для yy yy yy yy: E8 xx xx xx xx адрес вычисляется yy yy yy yy + xx xx xx xx + 5
Зато FF 9x xx xx xx xx регистр + смещение, адрес не вычислишь.
можно проверять валидность вызываемого адреса, вычитая из адреса придыдущего call и смотреть реальна ли разница
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 декабря 2007 12:40 · Личное сообщение · #7
Nimnul пишет:
для этих команд релоки не пишутся.
Я говорю не про эти команды, а про те, которые ты начинаешь дизасмить с адреса -30ю
P.S. call [12345678] тоже будет иметь релок на аргумент.
| Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 19 декабря 2007 12:46 · Поправил: Ice-T · Личное сообщение · #8
адрес можно проверить, чтобы он лежал в пределах имэджа и чтобы там было push EBP хотябы, а есле больше, то mov EDI,EDI.. но это не гарантия опять же.. хотя если адрес больше имеджа и там mov edi,edi, то пожалуй можно цтопудово считать апёй =)
later:
еще можно проверить аттрибуты страницы, куда указывает адрес возможного call'а ;)
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 14:23 · Поправил: Nimnul · Личное сообщение · #9
Вобщем проверил дизасм длинн на таком коде:
B8 00 01 00 00 mov eax,100h
74 F9 je m1 (10001BD9h)
89 45 FC mov dword ptr [ebp-4],eax
28 06 sub byte ptr [esi],al
33 C0 xor eax,eax
83 7D 01 00 cmp dword ptr [ebp+1],0
E8 63 FF 51 00 call 10521B53
в результате получилась такая табличка:
0: 5, 2, 3, 2, 2, 4, 5
1: 2, 2, 2, 3, 2, 2, 4, 5
2: 2, 4, 1, 1, 2, 2, 4, 5
3: 2, 2, 3, 2, 2, 4, 5
4: 4, 1, 1, 2, 2, 4, 5
5: 2, 3, 2, 2, 4, 5
6: 1, 3, 2, 2, 4, 5
7: 3, 2, 2, 4, 5
под 0 правильный дизасм, через запятую перечислены длины команд, которые определил дизасм.
я каждый раз прибавлял 1 к указателю, тем самым нарушая правильное начало для дизасма. Но как видно дизасм стабильно на последних четырех командах выдает правильный результат.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 500.5 (!), 8thx Активность: 0.23↘0 Статус: Участник
|
Создано: 19 декабря 2007 14:36 · Личное сообщение · #10
Nimnul пишет:
Но как видно дизасм стабильно на последних четырех командах выдает правильный результат.
Bit-hack пишет:
на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.
----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 14:38 · Личное сообщение · #11
как завещал галилей опыт решает все
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 19 декабря 2007 14:41 · Личное сообщение · #12
круто =)
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 декабря 2007 15:30 · Личное сообщение · #13
Nimnul пишет:
как завещал галилей опыт решает все
Теперь осталось придумать что делать если -30 это уже другая процедура со своим RET и далее идут данные для этой процедуры (как например любит делать дельфя).
| Сообщение посчитали полезным: |
Ранг: 126.7 (ветеран) Активность: 0.14↘0 Статус: Участник #CCh
|
Создано: 19 декабря 2007 16:26 · Личное сообщение · #14
если данные перед call'ом, то палево конечно
var db 0E8h,0E8h
call some
а есле морф, то вообще все лесом идет.. имхо логику надо подключить к алго.. то есть отличать фэйк от нужного не тока дизасмом, но и проверять адреса
----- invoke OpenFire | Сообщение посчитали полезным: |
Ранг: 163.7 (ветеран) Активность: 0.07↘0 Статус: Участник
|
Создано: 19 декабря 2007 17:28 · Личное сообщение · #15
Это NP-полная задача, есть ли смысл решать её путем более быстрым, чем полный перебор?
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 20:20 · Личное сообщение · #16 |
Ранг: 303.7 (мудрец), 4thx Активность: 0.19↘0 Статус: Участник tPORt Manager
|
Создано: 19 декабря 2007 20:32 · Личное сообщение · #17
Nimnul
Даже если работает, будут попадаться участки кода, где он будет промахиваться, гарантирую.
| Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 19 декабря 2007 20:58 · Поправил: Nimnul · Личное сообщение · #18
Врятли вероятность того, что будет неоднозначное определение call очень мала сама по себе, раздели на вероятность того что не правильно сработает дизасм. Я тестировал еще дизасм, обычно он выравнивается за две три команды.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 20 декабря 2007 09:38 · Личное сообщение · #19
Bit-hackа
если тебе нужна 100% гарантия дизасма, можно дизасмить пять раз, изменяя указатель на 1, и сравнивать результаты.
----- have a nice day | Сообщение посчитали полезным: |