Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Раскрутка стека
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
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.160
Статус: Участник
dotnet

Создано: 19 декабря 2007 11:26 · Поправил: Nimnul
· Личное сообщение · #2

так я об этом же написал выше . Я сейчас тестирую возможность скормить дизассемблеру длинн -30 байт, от обратного адреса, и посмотреть будет ли он выравниваться если это будет неправильное начало.

-----
have a nice day





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 декабря 2007 11:30
· Личное сообщение · #3

dermatolog ну а выход какой?

-----
invoke OpenFire





Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 19 декабря 2007 11:38
· Личное сообщение · #4

Ice-T пишет:
ну а выход какой?

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

Nimnul
Попробуй к своему алгоритму приделать загрузку релоков и уже с их помощью можно будет отличать команды с настраиваемыми операндами и тогда можно четко определять границы этих команд и уже начинать дизасм с границы релока.




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 19 декабря 2007 12:01
· Личное сообщение · #5

Nimnul пишет:
скормить дизассемблеру длинн -30 байт

Нету смысла, это не решение, интел не гарантирует, что в этом случае дизасм начнёт хоть когда-нибудь дизасмить правильные команды, хотя на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
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.050
Статус: Участник

Создано: 19 декабря 2007 12:40
· Личное сообщение · #7

Nimnul пишет:
для этих команд релоки не пишутся.

Я говорю не про эти команды, а про те, которые ты начинаешь дизасмить с адреса -30ю

P.S. call [12345678] тоже будет иметь релок на аргумент.




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 декабря 2007 12:46 · Поправил: Ice-T
· Личное сообщение · #8

адрес можно проверить, чтобы он лежал в пределах имэджа и чтобы там было push EBP хотябы, а есле больше, то mov EDI,EDI.. но это не гарантия опять же.. хотя если адрес больше имеджа и там mov edi,edi, то пожалуй можно цтопудово считать апёй =)

later:
еще можно проверить аттрибуты страницы, куда указывает адрес возможного call'а ;)

-----
invoke OpenFire





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
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.230
Статус: Участник

Создано: 19 декабря 2007 14:36
· Личное сообщение · #10

Nimnul пишет:
Но как видно дизасм стабильно на последних четырех командах выдает правильный результат.

Bit-hack пишет:
на практике рано или поздно дизасм попадает в правильную команду и всё идёт как по маслу.


-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 19 декабря 2007 14:38
· Личное сообщение · #11

как завещал галилей опыт решает все

-----
have a nice day





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 декабря 2007 14:41
· Личное сообщение · #12

круто =)

-----
invoke OpenFire





Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 19 декабря 2007 15:30
· Личное сообщение · #13

Nimnul пишет:
как завещал галилей опыт решает все

Теперь осталось придумать что делать если -30 это уже другая процедура со своим RET и далее идут данные для этой процедуры (как например любит делать дельфя).




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 декабря 2007 16:26
· Личное сообщение · #14

если данные перед call'ом, то палево конечно

var db 0E8h,0E8h
call some


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

-----
invoke OpenFire




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2007 17:28
· Личное сообщение · #15

Это NP-полная задача, есть ли смысл решать её путем более быстрым, чем полный перебор?




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 19 декабря 2007 20:20
· Личное сообщение · #16

Готово, кому не лень попрошу потестить.

a903_19.12.2007_CRACKLAB.rU.tgz - stack.cpp

-----
have a nice day





Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 19 декабря 2007 20:32
· Личное сообщение · #17

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




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 19 декабря 2007 20:58 · Поправил: Nimnul
· Личное сообщение · #18

Врятли вероятность того, что будет неоднозначное определение call очень мала сама по себе, раздели на вероятность того что не правильно сработает дизасм. Я тестировал еще дизасм, обычно он выравнивается за две три команды.

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 20 декабря 2007 09:38
· Личное сообщение · #19

Bit-hackа

если тебе нужна 100% гарантия дизасма, можно дизасмить пять раз, изменяя указатель на 1, и сравнивать результаты.

-----
have a nice day



<< . 1 . 2 .
 eXeL@B —› Программирование —› Раскрутка стека
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати