CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


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

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

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


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

Создано: 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
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

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

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

-----
have a nice day
Ice-T


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

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

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

-----
invoke OpenFire
dermatolog

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

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

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

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

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


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

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

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

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

-----
"_<center><b>Sql Injection test</b></center>_"
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

Создано: 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
dermatolog

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

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

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

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

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


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

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

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

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

-----
invoke OpenFire
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

Создано: 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
Smon


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

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

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

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


-----
© Не каждый программист - крэкер, но каждый крэкер - программист ;)
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

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

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

-----
have a nice day
Ice-T


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

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

круто =)

-----
invoke OpenFire
dermatolog

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

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

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

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


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

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

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

var db 0E8h,0E8h
call some


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

-----
invoke OpenFire
S_T_A_S_

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

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

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


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

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

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

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

-----
have a nice day
Bit-hack


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

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

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

-----
"_<center><b>Sql Injection test</b></center>_"
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

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

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

-----
have a nice day
Nimnul


Ранг: 173.3 (ветеран)
Статус: Участник
dotnet

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

Bit-hackа

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

-----
have a nice day
<< . 1 . 2 .
 CRACKL@B —› Программирование —› Раскрутка стека
    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS