• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Пишем билдер.

KraZz

(L3) cache
Пользователь
Регистрация
18.06.2009
Сообщения
196
Реакции
7
О грустном
Мне сейчас DL напоминает котенка, которого сбила машина и вот он лежит на асфальте весь в крови, мозг вытекает на асфальт, судорожно вздрагивает - вроде умер, а вроде и нет.
Смотрю в VIPах новые сайты появились, решил там посмотреть что да как..
Увидел тему одну «Интересно ли? Криптоанализ.»
Lozzie пишет:
Не так давно на форуме появилось сообщение, часть которого посвящалась тому, что форум является "однотипным". Поэтому появилась идея написать статью, которая бы имела мало отношения к ботнетам, связкам и т.п. ПО. Первое, что пришло в голову, - криптография. Например, еще не встречал на подобных форумах статей, посвященных настоящему криптоанализу.
Сейчас есть идея статьи-введения в частотный и синтаксический анализ, который позволяет достаточно быстро восстанавливать сообщения, обработанные простыми алгоритмами замены, не зная ключ. Начинающим пользователям материал может оказаться полезным, но меня смущает слово "может".
Назревает вопрос, интересно ли это пользователям и стоит ли тратить на это время? Если хотя бы несколько пользователей выскажутся "за", то сделаю, а также буду готов ответить на все последующие вопросы.
Чел вроде как "клялся" и "божился" статью написать.. все дружно в топе покричали ура (и даже Ar3s :)), покурили, флаги побросали и с концами...
Ну а мне тема понравилась, и я решил чего-нибудь написать на эту тему
Сразу скажу, что я нуб в криптографии, впрочем, как и во всем остальном :)
Да и вообще о криптографии написано очень много, а я решил все-таки описать сам процесс, ну вернее...
Если вам понравится все что ниже написано, и вы посчитаете этот материал интересным/полезным, разместите у себя на сайте
=============================================================================================

Пишем билдер. Часть первая. Анализ.
Реклама: http://xss.pro/index.php?topic=21847 - Получи исходничег!
Идем и качаем тестовый сэмпл
http://exelab.ru/f/files/d02b_05.06.2011_EXELAB.rU.tgz
и читаем пару постов о боте
http://exelab.ru/f/index.php?action=vthrea...=15227&page=6#3
"распаковываем" сами или качаем из поста GMax уже "распакованный" файл
Ищем строчку:
Код:
ADDRESS: 00404E94
NxVF+j/F385U6sVXA/tdQPPRjdi621/NcSudDng637htLdtvYxoz7SoH75D71R2r6PFN/ds1gdPBa8iQOtdeT1ULaij3MO2+rRK8YvcS3EGEj8XMcg/JfNn58mNuS29xMBGl+/che9Y4rWMxKRoL+VCrHZb/zD/2tUGRc65m0AmhhlMg3qNZA6bU82mrupHltACH0g==
Ищем ссылки на нее
И попадаем на адрес 00411F92
Код:
00411F92    A1 48424100     MOV EAX,DWORD PTR DS:[414248]
00411F97    8B00            MOV EAX,DWORD PTR DS:[EAX]
00411F99    E8 16FFFFFF     CALL 00411EB4
Нас интересует функция CALL 00411EB4, заходим в нее и видим такой код:
Код:
00411EDA    8D55 F8         LEA EDX,DWORD PTR SS:[EBP-8]
00411EDD    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00411EE0    E8 5B59FFFF     CALL 00407840
00411EE5    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
00411EE8    8BD3            MOV EDX,EBX
00411EEA    E8 5D5AFFFF     CALL 0040794C
CALL 00407840 – это base64 decode
А вот CALL 0040794C нас как раз и интересует, заходим в нее и видим такой код:
Код:
00407975    E8 B2FFFFFF     CALL 0040792C
0040797A    8BC7            MOV EAX,EDI
0040797C    E8 83C6FFFF     CALL 00404004
00407981    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00407984    E8 BFC8FFFF     CALL 00404248
00407989    8BF0            MOV ESI,EAX
0040798B    85F6            TEST ESI,ESI
0040798D    7E 4C           JLE SHORT 004079DB
0040798F    BB 01000000     MOV EBX,1
00407994    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
00407997    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
0040799A    8A541A FF       MOV DL,BYTE PTR DS:[EDX+EBX-1]
0040799E    8B0D 842F4300   MOV ECX,DWORD PTR DS:[432F84]
004079A4    C1E9 08         SHR ECX,8
004079A7    32D1            XOR DL,CL
004079A9    E8 22C8FFFF     CALL 004041D0
004079AE    8B55 F8         MOV EDX,DWORD PTR SS:[EBP-8]
004079B1    8BC7            MOV EAX,EDI
004079B3    E8 98C8FFFF     CALL 00404250
004079B8    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004079BB    0FB64418 FF     MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
004079C0    0305 842F4300   ADD EAX,DWORD PTR DS:[432F84]
004079C6    F72D 882F4300   IMUL DWORD PTR DS:[432F88]
004079CC    0305 8C2F4300   ADD EAX,DWORD PTR DS:[432F8C]
004079D2    A3 842F4300     MOV DWORD PTR DS:[432F84],EAX
004079D7    43              INC EBX
004079D8    4E              DEC ESI
004079D9    75 B9           JNZ SHORT 00407994
Это и есть тот код, который декодирует данные, в том числе и ссылку к админке
Первое что нам нужно сделать, так это оптимизировать код
Код:
00407997    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
0040799A    8A541A FF       MOV DL,BYTE PTR DS:[EDX+EBX-1]

0040799E    8B0D 842F4300   MOV ECX,DWORD PTR DS:[432F84]
004079A4    C1E9 08         SHR ECX,8
004079A7    32D1            XOR DL,CL

004079B8    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004079BB    0FB64418 FF     MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]

004079C0    0305 842F4300   ADD EAX,DWORD PTR DS:[432F84]
004079C6    F72D 882F4300   IMUL DWORD PTR DS:[432F88]
004079CC    0305 8C2F4300   ADD EAX,DWORD PTR DS:[432F8C]

004079D2    A3 842F4300     MOV DWORD PTR DS:[432F84],EAX
Из кода можно увидеть, что по адресам 432F84, 432F88, 432F8C находятся какие-то значения, с помощью которых происходит декодирование
Они инициализируются немного выше в функции CALL 0040792C
T (432F84) = 0x624 (624h)
A (432F88) = 0x86E (86Eh)
C (432F8C) = 0x9139 (9139h)
Важно: Писать мы будем билдер на питоне, не потому что я умею на нем кодить, нет, а потому что я считаю что питон самый лучший ЯП и обладает безграничными возможностями в плане десктопа

И так давайте почитаем, что нам пишет "элитО"
Одним из хоpоших конгpуэнтных генеpатоpов является линейный конгpуэнтный датчик ПСЧ. Он выpабатывает последовательности псевдослучайных чисел T(i), описываемые соотношением
T(i+1) = (A*T(i)+C) mod m,
где А и С - константы, Т(0) - исходная величина, выбpанная в качестве поpождающего числа. Очевидно, что эти тpи величины и обpазуют ключ.
Такой датчик ПСЧ генеpиpует псевдослучайные числа с опpеделенным пеpиодом повтоpения, зависящим от выбpанных значений А и С. Значение m обычно устанавливается pавным 2n , где n - длина машинного слова в битах. Датчик имеет максимальный пеpиод М до того, как генеpиpуемая последовательность начнет повтоpяться. По пpичине, отмеченной pанее, необходимо выбиpать числа А и С такие, чтобы пеpиод М был максимальным. Как показано Д. Кнутом, линейный конгpуэнтный датчик ПСЧ имеет максимальную длину М тогда и только тогда, когда С - нечетное, и А mod 4 = 1.
Вы что-нибудь поняли? Не огорчайтесь, я тоже ничего понял %)))
Дадим адресам 432F84, 432F88, 432F8C символьные имена T, A, C
где А и С - константы, Т - "исходная величина"
теперь мы переведем ASM код в питон
Код:
;ASM
MOV DL,BYTE PTR DS:[EDX+EBX-1]
Код:
#Python
ord(c)
Код:
;ASM
MOV ECX,DWORD PTR DS:[432F84]
SHR ECX,8
Код:
#Python
Т>>8
Код:
;ASM
XOR DL,CL
Код:
#Python
^
Теперь все вместе
Код:
;ASM
MOV EDX,DWORD PTR SS:[EBP-4]
MOV DL,BYTE PTR DS:[EDX+EBX-1]
MOV ECX,DWORD PTR DS:[432F84]
SHR ECX,8
XOR DL,CL
Код:
#Python
ord(c) ^ (Т>>8)
Код:
;ASM
MOV EAX,DWORD PTR SS:[EBP-4]
MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
ADD EAX,DWORD PTR DS:[432F84]
IMUL DWORD PTR DS:[432F88]
ADD EAX,DWORD PTR DS:[432F8C]
MOV DWORD PTR DS:[432F84],EAX
Код:
#Python
Т = ((ord(c)+Т)*A)+C
Если внимательно посмотреть на код, то можно увидеть что это простое симметричное шифрование строк
Код:
ord(c) ^ (Т>>8)
Т = ((ord(c)+Т)*A)+C
Мы знаем что бот написан на Delphi, а стало быть погуглим (гы-гы) и вот оно
Код:
{Предназначена для расшифровки строки, ранее зашифрованной фукцией UBPFD.Encrypt

Зависимости: UBPFD.Encrypt
Автор:       Anatoly Podgoretsky, anatoly@podgoretsky.com, Johvi
Copyright:   (c) Anatoly Podgoretsky, 1996
Дата:        26 апреля 2002 г.
***************************************************** }

const
  StartKey = 471; // Start default key
  MultKey = 62142; // Mult default key
  AddKey = 11719; // Add default key
  // обязательно смените ключи до использования

{$R-}
{$Q-}

function Decrypt(const InString: string; StartKey, MultKey, AddKey: Integer):
  string;
var
  I: Byte;
  // Если поменять тип переменной I на Integer, то будет возможно
  // шифрование текста длиной более 255 символом - VID.
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
    StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
  end;
end;
{$R+}
{$Q+}
а стало быть, обратный алгоритм будет такой
Код:
{Предназначена для простого шифрование строк и паролей, ключ 96 бит, шифрование
симметричное.

Зависимости: UBPFD.decrypt
Автор:       Anatoly Podgoretsky, anatoly@podgoretsky.com, Johvi
Copyright:   (c) Anatoly Podgoretsky, 1996
Дата:        26 апреля 2002 г.
***************************************************** }

const
  StartKey = 471; // Start default key
  MultKey = 62142; // Mult default key
  AddKey = 11719; // Add default key
  // обязательно смените ключи до использования

function Encrypt(const InString: string; StartKey, MultKey, AddKey: Integer):
  string;
var
  I: Byte;
  // Если поменять тип переменной I на Integer, то будет возможно
  // шифрование текста длиной более 255 символом - VID.
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
    StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
  end;
end;
Наш анализ закончен, писать билдер на питоне будем во второй части :)
Хотя насчет второй части не обещаю, все зависит от наличия свободного времени…
 
ЛОЛ
А я уж грешным делом подумал, что когда нажимал дрожащими руками кнопку «создать тему», случайно сделал тройной клик %)))
А когда увидел 0_o
Ar3s пишет:
Часть2
Часть3
ЗЫ: Хех, не дали мне попиарицца и насладицца славой %)))

Apocalypse, ты абсолютно правильно увидел, куда ветер дул. Чисто хакерский поступок. Молодец, это наш уровень! ;)
Теперь будем ждать от автора новой "мега-защиты" :), а стало быть вторую часть я все-таки "потом напишу" %)))

Chococream пишет:
Не хватает ссылок на стоющие, обучающие статьи(по криптографии).
А их и не должно быть, я вообще НЕ советовал бы эту порно-литературу читать!

Chococream пишет:
У нас три ключа, т.е общая сумма 96 бит.
нам пишет "элитО":
где А и С - константы, Т(0) - исходная величина, выбpанная в качестве поpождающего числа.
Chococream пишет:
Стало быть в каждый ключ можно запихнуть не более 4-х байт информации.
нам пишет "элитО":
Очевидно, что эти тpи величины и обpазуют ключ.
Это один ключ (96 бит)

P. S.
"Атака" на криптоалгоритм должна была быть описана во второй части, но так как 2 и 3 части есть, особого смысла писать что-то еще не вижу
Пожалуй, добавлю только вот этот код:
Код:
#-*- coding: windows-1251 -*-
import base64
"""""""""  C O N F I G  """""""""
T = 0x624;
A = 0x86E;
C = 0x9139;
data = "NxVF+j/F385U6sVXA/tdQPPRjdi621/NcSudDng637htLdtvYxoz7SoH75D71R2r6PFN/ds1gdPBa8iQOtdeT1ULaij3MO2+rRK8YvcS3EGEj8XMcg/JfNn58mNuS29xMBGl+/che9Y4rWMxKRoL+VCrHZb/zD/2tUGRc65m0AmhhlMg3qNZA6bU82mrupHltACH0g=="
""""""""""""""""""""""""""""""""""""

data = base64.b64decode(data)

def decode(data):
   global T
   hash = T
   result = ""
   for c in data:
      result += chr(ord(c) ^ ((hash>>8)&0xFF));
      hash = ((ord(c)+hash)*A)+C # calc hash
      #hash &= 0xFFFFFFFF
      #print ("%X") % (hash)
   return ''.join(reversed(result)) # reverse string

data = decode(data)
print data
Если снять комментарий в коде с этой строки
Код:
print ("%X") % (hash)
То можно увидеть "потерю данных", ну и еще попытаться сравнить с другими ЯП; какой из ЯП сможет осилить показывать такие большие числа итд.
 
Чел вроде как "клялся" и "божился" статью написать.. все дружно в топе покричали ура (и даже Ar3s ), покурили, флаги побросали и с концами...
Уж не мог не прокомментировать. В первую очередь, не соглашусь с формулировкой, но в целом правильно: действительно, сделал небольшой опрос, а статью так и не опубликовал, хотя она уже на тот момент была практически закончена и до сих пор хранится где-то во временных документах. Во-вторых, если уж и пошло на то, то ваша статья не имеет никакого отношения к частотному криптоанализу моноалфавитных шифров, о котором и шла речь в моем сообщении, но в тоже время ваш материал куда более интересен для пользователей.
 
Lоzzie пишет:
Уж не мог не прокомментировать.
Да я так всегда вызывающе пишу в надежде, что автор не удержится и оставит комментарий
Искренне не хотел как-то обидеть или разозлить :(
Единственный мой минус – я не люблю регаться на форумах и я не любитель общаться в жабе, аське.. :)
Поэтому приходится вот так изощрено писать :(
Да и тема там была вроде как закрыта.
Lоzzie пишет:
ваша статья не имеет никакого отношения к частотному криптоанализу моноалфавитных шифров
Если честно хотелось бы сразу перейти на ТЫ, не люблю эти галстуки, прилизанные волосы.. ;)
Ну я же сразу написал что нуб в криптографии :(
Lоzzie пишет:
о котором и шла речь в моем сообщении, но в тоже время ваш материал куда более интересен для пользователей.
Не-не ты здесь не прав – ИМХО
Каждая статья ищет и находит своего читателя!, хотелось бы увидеть твою статью и если скила хватит, обсудить положительные и отрицательные стороны
Да и вообще хотелось бы чтобы мы чаще обменивались статьями и мнениями о написанном и даже если статья не очень, то бурное обсуждение по теме - это тоже бывает полезно для всех!

ph0enix.re пишет:
ваша статья интересней
ПрИдатИль ;) %)))
 
Хех, видимо обещанного три года ждут.
Судя по количеству просмотров, тема действительно многим интересна...
Для начала "нужно" прочитать вот это (немного теории)
http://demonteam.narod.ru/download/crypto.chm

Ну а далее.. санта-барбара
accelerator пишет:
Тема на exelab более недоступна
Она доступна, просто там надо зарегистрироваться
Раз там еще не регался то, стало быть не видел этой темы
На первый взгляд может показаться, что тема не причем, но на самом деле тема имеет полное дополнение к нашему сабжу
Там идет "атака" на "крипто-примитив" с помощью "брута" при этом нам известны только некоторые параметры ключа :)
Там полностью расписан весь процесс и выложены нужные файлы..
 
Она доступна, просто там надо зарегистрироваться
Раз там еще не регался то, стало быть не видел этой темы

Зарегестрирован, но не логинился, залогинился и действительно отображается. Вот уж не знал что на краклаб если не зареганным ходить по ссылкам выдает "тема была удалена администратором либо НИКОГДА не существовала"

Добавлено в [time]1312066284[/time]
Upd: завтра посмотрю ветку на краклабе. А ты там забанен чтоле? :blink:
 
accelerator пишет:
А ты там забанен чтоле?
Да нет, у меня там с админом нормальные отношения были
Там просто с баном лольная история получилась
Там школьник один был, постоянно "религию" .net прославлял и "Троелсена богом называл"
Ну, вот как-то один раз этот проповедник меня достал (а мне поглумицца над тро-ло-ло всегда в радость)
Арчи там только модератором стал и меня в бан отправил из-за этого оленя, ну стало быть тоже под замес попал
И вот как только они в тему .net залазили, я им начинал указывать на их ошибки по теме, ну какбе всем стало понятно, что бан был не обоснованный
Этот школьник сразу потерялся, а Арчеру деваться-то некуда :)
Ну, вот я взял Ару и попросил там написать «забанен» чтобы, когда Арчи видел мои посты, вспоминал об этом бане %)))
А ушел я оттуда по нескольким причинам:
Первое – это новых интересных защит очень мало стало, а проты либо вымерли, либо выпускают новые версии как перчатки, а внутри ничего интересного, ну а мне постоянно нужен приток новых знаний, ну типа как алкоголику водка
Второе – это я заметил, что начал медленно превращаться в "синдром клерка", скорее всего это пагубно на меня начал влиять васм; нужно было срочно что-то менять, я где-то читал, что после 25 лет если не изменишься, то таким и останешься, а мне такая болезнь и нах не нужна, тем более что мы все видим какое отношение к подобным вещам у народа
Третье – я органически не переваривал KK (kaspersky), сейчас он встал на путь истЕны (и видно, что растет после ухода из журнала), а тогда когда был в журнале – это был просто непробиваемый ппц.. (любитель раритета 90-х Perl, hiew32 итд..)
Но вот он на васме всем заявил, что уходит из журнала, и переходит на сторону аверов
Я посчитал, что это для меня свисток изменить обстановку, начал искать куда переехать
Было три варианта zloy, damagelab и exploit
На exploit (после ознакомления с сайтом) мне стало понятно, что не вариант даже регаца
Трафа много - толку ноль, все сруцца, минусуют итд.. короче "синдром клерка" мне был бы обеспечен
Zloy мне нравится, там и атмосфера хорошая и народ классный и набор модераторов отличный, но много кидал и высокомерных личностей написавших пару строк кода и думающих что теперь все знают
Остался damagelab - в правилах было написано: "бан за высокомерие", и я сразу подумал вот это то, что мне нужно "синдром клерка" во мне умер сразу, тема хакерства мне интересна, короче так я тут и остался :)
 
http://exelab.ru/f/index.php?action=vthrea...m=1&topic=19161 - Как обратить хэш функцию?
мельком посмотрел, реально к нашем сабжу относится косвенно, даже метод атаки косвенно похож (скажем так: - реально дополняет то, что я выше писал)
единственное отличие в том, что я атаку на первом этапе делаю на основе больших чисел и оцениваю обратимость алго, если обратимо без потери данных - создаю функцию и не парюсь, если же есть потеря - тогда дополнительный криптоанализ на наличие паблик алгоритмов (там константы, сопоставление кода и т.д.), здесь очень большой шанс найти что нужно ну или хотя бы понять что это мод...
короче, решил запостить может, кому интересно будет прочитать, обсудить или даже про свой метод атаки рассказать...
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх