Сейчас на форуме: 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





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

Создано: 18 декабря 2007 13:46
· Личное сообщение · #2

использовать диасм длин мс-рема =)

-----
invoke OpenFire





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

Создано: 18 декабря 2007 13:51
· Личное сообщение · #3

дизасм длин не работает в обратную строну

-----
have a nice day




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 18 декабря 2007 13:56
· Личное сообщение · #4

В Win32 значимость маш. кодов первых 5 байт ф-ций одинакова.

-----
продавец резиновых утёнков





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

Создано: 18 декабря 2007 13:58
· Личное сообщение · #5

как-то надо определить начало команд... хз даже каг.. парсить назад, до хидера, а потом дизасмить вниз %))) извратно конечно.

-----
invoke OpenFire





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

Создано: 18 декабря 2007 13:59
· Личное сообщение · #6

HiEndsoft

отжиг великого реверсера?

-----
have a nice day





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

Создано: 18 декабря 2007 14:00
· Личное сообщение · #7

Ice-T

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

-----
have a nice day





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

Создано: 18 декабря 2007 14:01
· Личное сообщение · #8

HiEndsoft это ты про 8B FF 55 8B EC если да, то это же только в виндовых длл и то не во всех функциях.. или я не понял о чем ты

-----
invoke OpenFire




Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 18 декабря 2007 14:44 · Поправил: bad_boy
· Личное сообщение · #9

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




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

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

1. что значит парсить вверх?
2. что по твоему может быть "идентификатор начала функции"

-----
have a nice day




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 18 декабря 2007 14:55 · Поправил: HiEndsoft
· Личное сообщение · #11

Ice-T да только для Win32 dll, и для слинкованых мелкософтовским линкером. Понял- не втему.
Может сплейсингом проверять гипотезу о начале ф-ции в смысле подменой кода)?

-----
продавец резиновых утёнков




Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 18 декабря 2007 15:00
· Личное сообщение · #12

Nimnul
1. Просматривай байты выше
2. думаю что
ret
push ebp
mov ebp,esp
можно считать идентификатором начала




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

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

1. Просматривать байты это не парсить
2. между ret и push ebp бывают еще 0xCC как правило. Кроме того push ebp это далеко не всегда бывает первой командой.

-----
have a nice day





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

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

bad_boy это не надежно, особенно если там буит морф =)

HiEndsoft че про сплайсинг? кто сказал, что раскурчивать надо вызовы только виндовых функций или вообще функций из каких-то длл?

-----
invoke OpenFire




Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

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

Nimnul
Не так выразился
Ice-T
Ну тогда только с начала файла причётся работать



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

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

Ice-T И что? Если не получается наблюдением, можно вмешательством.

-----
продавец резиновых утёнков





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

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

HiEndsoft объясни подробнее задумку, я лично нифига не понял, как ты буишь сплайсить все функции или че ты вообще хочешь?

-----
invoke OpenFire




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

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

Я так понял все это надо для самодельного отладчика и вопрос в том что бы определять по данным в стеке, являются ли эти данные адресом об вызова ф-ции или нет. Если так, то что нам мешает подменять в предполагаемом адресе родной код на jmp, int3 или еще чего с учетом обработки exception.

-----
продавец резиновых утёнков





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

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

Nimnul, в виндах есть ф-кция которая даст тебе весть стек для потока. Если есть символы, то получишь ещё и имена с аргументами.




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

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

Может ты еще знаешь название? . в принципе та функция что я написал делает правильное определение вызовов, единственно иногда неправильно определяется команда.

-----
have a nice day





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 декабря 2007 22:18
· Личное сообщение · #21

s0larian
Насколько я знаю, стандартные виндовые функи раскручивают только по фреймам. Если фрейма нет или хитрожопо как-то сделано, функа не покатит.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 18 декабря 2007 23:05
· Личное сообщение · #22

StackWalk64



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

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

Попробуй парсить обе ветки, неоднозначность разрешится дальше.




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

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

ИМХО идея с "обратным" дизасмом - полный бред. Пример:
jmp @1
...
ДАННЫЕ
...
@1:
call xxxx


Да и на нормальном коде обратный дизасм нормально не сделать - придется методом перебора выбирать подходящие команды и в результате может получиться множество неправильных вариантов.



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

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

Единственное что на мой взгляд реально - это дизасмить вперед до ret (ret xx) с заходом в call'ы. Кроме того, конструкции типа push addr/ret будут пролетать - ибо адреса возврата и соответствующих вызовам процедур опкодов мы там не увидим.

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





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

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

Nimnul
можно кстати еще проверять назначение call'ов - указывают ли они в пределы секции кода (или в пределах между imagebase и imagebase+imagesize) - это снизит вероятность ошибок имхо...

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





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

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

Smon пишет:
можно кстати еще проверять назначение call'ов - указывают ли они в пределы секции кода (или в пределах между imagebase и imagebase+imagesize)

тогда вызовы стистемных DLL-ок не найдутся...



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

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

системные дллки обычно вызываются через call [addr], их можно не трогать

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





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

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

Nimnul пишет:
FF 3b и FF 2b не конфликтуют (т.е. нет вариантов неоднозначной трактовки.)
FF 6b и E8 не конфликтуют


Вот тебе первый пример:
E8XXXXFFD0
Ну вот попробуй определи - либо тут CALL XXXXXXXX либо CALL EAX

Второй пример:
E8XXFF50XX
Либо тут CALL XXXXXXXX либо CALL [EAX+XX]

Продолжать можно долго )


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


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