eXeL@B —› Основной форум —› Шифр перестановкой |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 26 июля 2012 20:46 · Поправил: OnLyOnE · Личное сообщение · #1 Пытаюсь разобрать алго преобразования большого числа. Необходимо его реверснуть. Как понял (на сколько мозгов хватило ) в него заложен принцип шифрования перестановкой... только все происходит на уровне бит. Т.е. поэтапно ... Этап "расшифровки" числа, в результате которого число [ 10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8 ] преобразуется в [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ] Шаги "расшифровки": 1. создается буфер размером в 120 байт (78h) и число [ 10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8 ] раскладывается в буфер на биты т.е. двоичная система исчисления Code:
В данном случае вместо единичек ставиться 80h. Затем создается на основе вышеуказанного массива "словарь" для "расшифровки" числа, причем "словарь" имеет такой вид Code:
и на основе этого "словаря" бинарный вид расшифровываемого числа превращается вот в такой вид Code:
Т.е. после преобразования двоичных данных в хекс получаем [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ] Вот цикл преобразования Code:
Вроде просто на первый взгляд... но никогда не сталкивался с данным принципом. Может кто уже сталкивался с аналогичным? Подскажите как реверснуть? И на каком этапе? Может надо обращать цикл создания "словаря"? В общем ... вот так Заранее благодарен за помощь! ----- aLL rIGHTS rEVERSED! |
|
Создано: 26 июля 2012 21:10 · Поправил: m0bscene · Личное сообщение · #2 OnLyOnE пишет: Если б Кусок в глаза бросился, ляпнул с ходу, на код не смотрел..) Code:
|
|
Создано: 26 июля 2012 22:38 · Личное сообщение · #3 |
|
Создано: 26 июля 2012 23:04 · Личное сообщение · #4 |
|
Создано: 26 июля 2012 23:21 · Поправил: -=AkaBOSS=- · Личное сообщение · #5 |
|
Создано: 26 июля 2012 23:30 · Поправил: OnLyOnE · Личное сообщение · #6 |
|
Создано: 26 июля 2012 23:43 · Поправил: OKOB · Личное сообщение · #7 |
|
Создано: 26 июля 2012 23:47 · Поправил: OnLyOnE · Личное сообщение · #8 OKOB пишет: В код не попала инициализация ebp. Code:
Пардон ----- aLL rIGHTS rEVERSED! |
|
Создано: 26 июля 2012 23:50 · Поправил: -=AkaBOSS=- · Личное сообщение · #9 OnLyOnE пишет: Откуда -> куда.. там все видно.. оно-то видно, но непонятно, где именно переколбашивается собственно словарь с данными, на которые указывает eax данные просто грузятся в dl, после чего выгружаются в выходной буфер. и всё попробовал перевести этот код на более высокий уровень: Code:
/ADD OKOB пишет: Внутрений цикл неверен. и то правда увлёкся оптимизацией, забыл про цикл |
|
Создано: 26 июля 2012 23:56 · Поправил: OKOB · Личное сообщение · #10 -=AkaBOSS=- Внутрений цикл неверен. DWORD Dictionary_esi[]; BYTE inBuf_eax[]; BYTE outBuf_edi[]; ecx=0; do { if(Dictionary_esi[ecx] >= 0) { ebx=ecx; do { outBuf_edi[ebp--] = inBuf[ebx]; ebx1 = Dictionary_esi[ebx]; Dictionary_esi[ebx] = -1; ebx = ebx1; }while(Dictionary_esi[ebx] >= 0) } // L012: ecx++; }while(ebp >= 0); ----- 127.0.0.1, sweet 127.0.0.1 | Сообщение посчитали полезным: -=AkaBOSS=- |
|
Создано: 27 июля 2012 00:15 · Личное сообщение · #11 Так.. вот скомпиленный кусок кода для Olly.. без дебагера естественно "упадет". Там весь алго... 45a3_26.07.2012_EXELAB.rU.tgz - test.exe ----- aLL rIGHTS rEVERSED! |
|
Создано: 27 июля 2012 01:01 · Поправил: -=AkaBOSS=- · Личное сообщение · #12 ну, я понял только то, что словарь генерируется на основе количества установленных/сброшенных бит ключа и их расположении в ключе процедура генерации словаря выглядит примерно так: Code:
НО. В выложенном примере опять-таки отсутствует сама процедура совмещения алфавита с ключом. Более того - на последнем этапе словарь затирается! Неясно, как с помощью этих данных преобразовать это: 10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8 в это: 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 OnlyOne, рекомендую проверить рип кода из программы. Мне кажется, что-то важное было пропущено. К тому же, могу предположить, что полноценно обратить алгоритм не удастся, так как словарь вычисляется на основе шифруемого бинарного массива. Поэтому нужно вырипать алго полностью, и налабать брутфорсер. |
|
Создано: 27 июля 2012 09:42 · Личное сообщение · #13 Вобще-то это ооочень похоже на хаффмана... сначала идет подсчет всех символов... но в данном случае мы имеем только 0x00 и 0x80... Code:
| Сообщение посчитали полезным: OnLyOnE |
|
Создано: 27 июля 2012 19:05 · Поправил: OnLyOnE · Личное сообщение · #14 -=AkaBOSS=- В общем выдрал полностью всю функцию... там весь код с начала до конца.. в функцию передается два параметра 1. 16 байт [10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8] 2. Буфер-приемник, в который куда кладутся байты [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ] Прикрепляю файл с функцией. Задача - обратить функцию, т.е. чтобы на вход подавалось [ 18 06 28 E5 79 F2 F9 96 62 02 B3 03 00 00 08 ] а на выходе [10 00 A2 00 63 0E CA 45 01 AA F7 F0 00 A6 F8] P.S. Есть любители крякмисов вот вам реальный крякмис.. по крайней мере задача не тривиальная.. 5eac_27.07.2012_EXELAB.rU.tgz - test2.exe ----- aLL rIGHTS rEVERSED! |
|
Создано: 27 июля 2012 19:21 · Поправил: reversecode · Личное сообщение · #15 |
|
Создано: 27 июля 2012 19:36 · Личное сообщение · #16 |
|
Создано: 27 июля 2012 19:40 · Поправил: reversecode · Личное сообщение · #17 |
|
Создано: 27 июля 2012 21:41 · Поправил: OnLyOnE · Личное сообщение · #18 UniSoft Скинь пожалуйста код Encrypt-а... reversecode Да это оно Точнее похоже... НО по алго Хоффмана вместе с кодированными байтами должна передаваться таблица частот (словарь).. здесь же словарь формируется на основе входящих байт разложенных на биты.. т.е. шифрование или расшифровка односторонняя ... вот и вопрос как обратить? ----- aLL rIGHTS rEVERSED! |
|
Создано: 28 июля 2012 01:16 · Поправил: mak · Личное сообщение · #19 Можно посмотреть доки по ручной сборке SBox, не смотря на хафмана, судя по этапам описанным тобой, то шифр подстановки используется как Сбокс и Пермутэйшн бокс, в свою очередь в теории пермутационные блоки обращаются не все и могут выглядеть разным образом. Подробнее можно нагуглить. Обратный ход будет такой - определение ключей или тот словарь в твоей терминологии и далее расшифровщик секретного сообщения которое идет ранее словаря. Тебе нужно писать Солвер таких решений, а для этого тебе нужно хорошенько проанализировать код, без этого никак, имхо это чисто мат задача. П.С. Код не смотрел и за хафмана не цеплялся, принял как модификацию, если так, то подробные шаги уже описал, как бы делал я сам. В целом Хафман уже инфо и анализ, далее уже проще написать солвер. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 28 июля 2012 02:42 · Личное сообщение · #20 Какой Хаффман? У нас всего два символа 00 и 80. Подсчет частоты как в Хаффмане, тут лишь определение границ счетчика при построении словаря. 0...число нулей-1 для нулей и число нулей...число бит-1 для единиц. В Хаффмане после построения дерева (словаря) кодирование переменной длины. Тут такого и в помине нет. ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 28 июля 2012 02:45 · Поправил: OnLyOnE · Личное сообщение · #21 Охохо Как у нас все любят давать ЦУ но реальной помощи хрен дождешься ... Конкретная помощь - это решение задачи. Если б я ее решил или знал бы как решить.. я не создал бы топ. Пока в результате своих изысканий понял, что модифицировать необходимо именно цикл создания "словаря".. ибо все перестановки идут именно по нему.. но пока не могу придумать как это сделать.. P.S. Вот интересно... у нас любят ломать всякие крякмисы написанные чисто для выпендрежа ... а решить данную задачу никого нет. Прихожу к мнению, что просто не по зубам.. ----- aLL rIGHTS rEVERSED! |
|
Создано: 29 июля 2012 10:32 · Поправил: ZaZa · Личное сообщение · #22 OnLyOnE А есть еще связки "входные-выходные данные" из оригинальной программы? Откуда берутся входные данные и куда пойдут выходные? Для чего вообще реверс алгоритма? Keygen, не? Я тут решил немного, так скажем, побрутить, присмотреться к тому, как генерируется выходные данные, так вот: Code:
Может кто увидит, чего интересного )) ----- One death is a tragedy, one million is a statistic. |
|
Создано: 29 июля 2012 11:16 · Личное сообщение · #23 Вобщем может ктото будет ковырять алго дальше, попробуйте эксперемент. подать функе массив из сплошных единиц ну или (80) в нашем случае. Получаем последовательный словарь. ИМХО тут алго построен на принципе перемешивания данных по условию входной битной последовательности. Думаю обратим ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 29 июля 2012 15:32 · Поправил: OKOB · Личное сообщение · #24 |
|
Создано: 29 июля 2012 16:23 · Поправил: ZaZa · Личное сообщение · #25 OKOB пишет: И зачем такой прямой брут, если есть исходник входного алго по которому все ясно. Согласен, но иногда можно просто увидеть перестановку, сравнив визуально... Тем более я ж не запустил брут на полную... OKOB пишет: Если и обратим, то очень не тривиально. И с этим согласен полностью... Если брать алгоритм и просто пробовать его обратить (последний важный цикл): Code:
то не хватает многих входных данных для реверса: EBX, ECX, EDX... Все они зависят от того, какие данные поданы на вход! Тем более, словарь (ESI) на выходе приобретает вид одних 0xFF, то есть затирается... Что и куда записывать при реверсе алгоритма - непонятно... В аттаче прикладываю значения регистров EBX, ECX, EDX при некоторых входных данных... Зависимость присутствует, но не могу догнать, какая... c45b_30.07.2012_EXELAB.rU.tgz - BRUT.txt ----- One death is a tragedy, one million is a statistic. |
|
Создано: 30 июля 2012 09:08 · Поправил: VodoleY · Личное сообщение · #26 OKOB пишет: Если и обратим, то очень не тривиально. От входного набора остается только общее количество нулей и единиц. я могу сказать одно. решение в однозначном виде есть. для меньшего диапазона, но оно существует. я бы сказал что в нем используеца алгоритм сартировки с кастомной функой сравнения, которая принимает решения переставлять местами числа в словоре или нет. (величина чисел при этом значения не имеет, а управление происходит входным битовым потоком) З.Ы. Обратите внимание на словарь указанный онливанычем в шапке. 2 массива стартующие с 1,2,3.. и 4D,4E,4F... идущие последовательно и вшиты один в другой согласно битовой маске. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 30 июля 2012 09:27 · Поправил: ZaZa · Личное сообщение · #27 VodoleY пишет: Обратите внимание на словарь указанный онливанычем в шапке. 2 массива стартующие с 1,2,3.. и 4D,4E,4F... идущие последовательно и вшиты один в другой согласно битовой маске. Причем, 4D - это количество "0" в битовом представлении входного массива данных, ну или разница 0x78 и количества "1"... Code:
----- One death is a tragedy, one million is a statistic. |
|
Создано: 30 июля 2012 09:51 · Личное сообщение · #28 |
|
Создано: 30 июля 2012 11:57 · Поправил: Veliant · Личное сообщение · #29 OKOB пишет: Словарь - это пронумерованные во входном потоки биты, сначала нумеруются нули 00h (0...4С), а потом единицы 80h (4D..77). Ну на глаз это хорошо видно, однако обратной операции в лоб не найдешь. Может через некоторое число перестановок оно снова вернется к исходному виду? Только даже если так и случится, количество итераций цикла будет зависеть от кол-ва единиц |
|
Создано: 30 июля 2012 20:53 · Поправил: ZaZa · Личное сообщение · #30 Таак... А если отойти немного от реверса алгоритма и ударить, так сказать, в лоб! Я имею ввиду брут... Нам известны выходные данные. При переводе его в бинарный вид, мы получим количество единиц (0x80). То есть нам останется сбрутить входные данные именно с тем количеством единиц (0x80), которые есть на выходе, так как это шифр перестановки - количество единиц (0x80) не меняется! Не буду пока пытаться найти способ сократить брут, но займусь подсчетом вариаций (поправьте, если я не прав). Подсчет ведется по выходным данным, предоставившим OnLyOnE: Code:
имеется: 120 бит, из них 43 - это единицы (0x80), тогда формула будет такой: С = 120! / (43!*(120-43)!) = 762660291046620048412114231770960 Мда... дофигища вышло... Тогда все-таки придется искать, как сократить брут... Есть идеи? И вообще, есть ли смысл так извращаться? Просто я ничего другого тут не вижу, кроме как брутить, ведь неизвестно абсолютно, на каких местах располагаются единички (0x80) во входных данных (да и получить эти позиции нереально)... ----- One death is a tragedy, one million is a statistic. |
. 1 . 2 . >> |
eXeL@B —› Основной форум —› Шифр перестановкой |