| Посл.ответ |
Сообщение |
|
Создано: 18 декабря 2007 13:38:13 · Поправил: 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
|
|
|
Создано: 19 декабря 2007 11:26:14 · Поправил: Nimnul Личное сообщение #2
так я об этом же написал выше  . Я сейчас тестирую возможность скормить дизассемблеру длинн -30 байт, от обратного адреса, и посмотреть будет ли он выравниваться если это будет неправильное начало.
----- have a nice day |
|
Создано: 19 декабря 2007 11:30:31 Личное сообщение #3
dermatolog ну а выход какой?
----- invoke OpenFire
|
|
Создано: 19 декабря 2007 11:38:14 Личное сообщение #4
Ice-T пишет:
ну а выход какой?
Видимо полный реверсинг имейджа как это делает IDA - больше вариантов я не вижу.
Nimnul
Попробуй к своему алгоритму приделать загрузку релоков и уже с их помощью можно будет отличать команды с настраиваемыми операндами и тогда можно четко определять границы этих команд и уже начинать дизасм с границы релока.
|
|
Создано: 19 декабря 2007 12:01:47 Личное сообщение #5
Nimnul пишет:
скормить дизассемблеру длинн -30 байт
Нету смысла, это не решение, интел не гарантирует, что в этом случае дизасм начнёт хоть когда-нибудь дизасмить правильные команды, хотя на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.
----- "_<center><b>Sql Injection test</b></center>_"
|
|
Создано: 19 декабря 2007 12:25:24 · Поправил: 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
|
|
Создано: 19 декабря 2007 12:40:32 Личное сообщение #7
Nimnul пишет:
для этих команд релоки не пишутся.
Я говорю не про эти команды, а про те, которые ты начинаешь дизасмить с адреса -30ю
P.S. call [12345678] тоже будет иметь релок на аргумент.
|
|
Создано: 19 декабря 2007 12:46:00 · Поправил: Ice-T Личное сообщение #8
адрес можно проверить, чтобы он лежал в пределах имэджа и чтобы там было push EBP хотябы, а есле больше, то mov EDI,EDI.. но это не гарантия опять же.. хотя если адрес больше имеджа и там mov edi,edi, то пожалуй можно цтопудово считать апёй =)
later:
еще можно проверить аттрибуты страницы, куда указывает адрес возможного call'а ;)
----- invoke OpenFire
|
|
Создано: 19 декабря 2007 14:23:05 · Поправил: 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
|
|
Создано: 19 декабря 2007 14:36:02 Личное сообщение #10
Nimnul пишет:
Но как видно дизасм стабильно на последних четырех командах выдает правильный результат.
Bit-hack пишет:
на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.
----- © Не каждый программист - крэкер, но каждый крэкер - программист ;)
|
|
Создано: 19 декабря 2007 14:38:18 Личное сообщение #11
как завещал галилей опыт решает все
----- have a nice day |
|
Создано: 19 декабря 2007 14:41:11 Личное сообщение #12
круто =)
----- invoke OpenFire
|
|
Создано: 19 декабря 2007 15:30:08 Личное сообщение #13
Nimnul пишет:
как завещал галилей опыт решает все
Теперь осталось придумать что делать если -30 это уже другая процедура со своим RET и далее идут данные для этой процедуры (как например любит делать дельфя).
|
|
Создано: 19 декабря 2007 16:26:07 Личное сообщение #14
если данные перед call'ом, то палево конечно
var db 0E8h,0E8h
call some
а есле морф, то вообще все лесом идет.. имхо логику надо подключить к алго.. то есть отличать фэйк от нужного не тока дизасмом, но и проверять адреса
----- invoke OpenFire
|
|
Создано: 19 декабря 2007 17:28:39 Личное сообщение #15
Это NP-полная задача, есть ли смысл решать её путем более быстрым, чем полный перебор?
|
|
Создано: 19 декабря 2007 20:20:54 Личное сообщение #16 |
|
Создано: 19 декабря 2007 20:32:40 Личное сообщение #17
Nimnul
Даже если работает, будут попадаться участки кода, где он будет промахиваться, гарантирую.
----- "_<center><b>Sql Injection test</b></center>_"
|
|
Создано: 19 декабря 2007 20:58:30 · Поправил: Nimnul Личное сообщение #18
Врятли вероятность того, что будет неоднозначное определение call очень мала сама по себе, раздели на вероятность того что не правильно сработает дизасм. Я тестировал еще дизасм, обычно он выравнивается за две три команды.
----- have a nice day
|
|
Создано: 20 декабря 2007 09:38:34 Личное сообщение #19
Bit-hackа
если тебе нужна 100% гарантия дизасма, можно дизасмить пять раз, изменяя указатель на 1, и сравнивать результаты.
----- have a nice day
|