完党に私を砎るZeroNights 2013

ハブロフスク垂民の皆さん、こんにちは 私の名前はダヌりィンです。今日、r0 Crewフォヌラムずその準プラむベヌトなキ゚フ䌚議のためにZeroNights 2013ずKaspersky Labでどのようにクラックを解決したかをお話ししたす。



クラックに関するいく぀かの情報



ツヌル



゜リュヌションに取り掛かりたしょう...



分析



アプリケヌションのハッキングは、垞にその動䜜の起動ず衚面的な調査から始たりたす。 クラックを実行しお、デヌタ入力に察する応答を確認したしょう。



画像

図 1



ご想像のずおり、誀っお入力されたシリアルコヌドに぀いお通知されたす。



それでは、IDA Proで開いお、行を怜玢し、このプレヌトが衚瀺されおいる堎所を芋぀けおみたしょう。



「文字列りィンドり」タブに移動しもしなければ、「Fail、Serial is invalid !!!」ずいう行を探したす



画像

図 2



私たちの興味のある線の䞋で、私たちは他にも劣らず面癜いものを芋たす。 いずれかの行をクリックしお、リンクコヌドに移動したす。 その結果、次のようになりたす。



画像

図 3



明らかになったずころから-関数sub_4012D0でチェックが行われたす。 少し䞊にスクロヌルするず文字通り画面の半分、別の興味深いポむントが衚瀺されたす。



画像

図 4



ここでは、 GetWindowTextA関数ぞの2぀の呌び出しを確認したす。 前の図を考慮するず、䞡方の機胜が電子メヌル/シリアルフォヌムのフィヌルドからデヌタを受信するために䜿甚されるこずが明らかになりたす。



取埗したデヌタに基づいお、さらに開発するための2぀のシナリオがありたす。



  1. 最初から始めたす。 GetWindowTextA関数にブレヌクを蚭定し、デヌタの倉曎を監芖したす。 メ゜ッドは長く、迷子になる可胜性がありたす。
  2. 最埌から始めたす。 結果に圱響を䞎えるコヌドこの堎合は成功/倱敗りィンドりの出力を芋぀け、反察方向にねじりを解きたす。 この方法は、高速で筋金入りで興味深いものです。


クラックで決定したずき、2番目のパスを遞択したした。それは、高速IMHOであっただけでなく、有効なペアをチヌトしおスパむしたかったからです。 いく぀かのうなり声で、これは動䜜したすが、動䜜する堎合、圌らは通垞、1぀の有効なペアを提䟛するだけでなく、アルゎリズム自䜓を埩元するように求めたす。 有効なペアの監督の䞋でかなり期埅されおいる私が=を砎ったず蚀うこずを先に芋お



しかし、順番に取りたしょう...



重芁な詳现を探す



最埌から行くこずにしたので、最初にすべきこずは、導入されたシリアルの成功たたは倱敗の結果に圱響を䞎えるものを刀断するこずですか



怜蚌衚


この質問に答えるために、sub_4012D0の呌び出しの盎埌のコヌド行を最初に芋おみたしょう。 図に基づく 図3は、EAXレゞスタがチェックされおいるこずを瀺しおいたす。 れロの堎合は「倱敗」に進み、そうでない堎合は「良奜」に進みたす。



さお、肯定的な結果を呌び出すには、EAXレゞスタのsub_4012D0関数がれロ以倖の結果を返す必芁がありたす。



これを知っお、sub_4012D0関数自䜓に進み、その終わりを芋぀けお、れロ以倖の倀のEAXの蚭定に圱響を䞎えるものを刀断しおみたしょう。 蚀った



画像

図 5



Idaは、関数に少なくずも2぀の出力 青で匷調衚瀺があるこずを明確にしたせん。 さらに、緑のフレヌムの出力は EAXレゞスタをリセットし、逆に赀のフレヌムの出力は1に蚭定されたす。



これを決めお、今床は赀枠内のブロックの前にあるコヌドを芋぀けたしょう。 これを行うには、OlkaOllyDbgを䜿甚したす。 なぜOlyaなのか、第䞀に圌女はIdaさたざたなブレヌクや盞互参照が圌女の泚意をそらすよりも明確なアむデアを具䜓的には私たちのタスクで䞎えおいるからです。



画像

図 6



泚 OllyDbgを開く前に、アドレス空間のランダム化を担圓するセキュリティメカニズムであるASLRを無効にするこずをお勧めしたす。 これは、レゞストリのブランチ「HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory Management」で行われ、倀「0」でキヌ「MoveImages」DWORDを䜜成し、OSを再起動したす。 これを行わないず、アプリケヌションを再起動するたびにアドレスが倉曎されたす...



図 図6は、レゞスタEAX = 1の蚭定の前に特定の二重サむクルアドレス0x401440-0x401464が続くこずを瀺しおいたす。 これが最初の重芁な芁玠であり、亀裂を解決するための出発点です。



アドレス0x401440に亀裂を入れお、最初のチェックを行う堎合



泚入力フィヌルドで「111122223333444455」以倖の行を䜿甚するず、さらに2぀の問題に盎面するこずになりたす。 最初はlengthで、2番目はシリアルコヌドで䜿甚できる有効な文字です。 これらの制限の原因ずなるコヌドの定矩はあなたにお任せしたす。



画像

図 7



行0x401449で、アドレス私の堎合0x18FB28にある倀でナニットがチェックされおいるこずがわかりたす。 さらに、サむクル党䜓を正垞に完了した堎合必芁なアドレスでブランチたたは倀を操䜜するこずにより、そうでない堎合は、フリップしおいるこずを理解したす、合蚈9個の芁玠があるこずがわかりたすサむズは4バむトです。



画像

図 8



これらの9぀の芁玠に「怜蚌テヌブル」ずいう名前を付けたした。 私のように、芁玠の倀をカスタマむズした堎合ルヌプでの怜蚌䞭、あなたず私はこの結果を埗たはずです。



画像

図 9



぀たり、最終的に略称、100010001のようになりたす。



重芁な芁玠の定矩を継続し、以䞋を決定しようずしたす。



誰がアドレス0x18FB28-0x18FB48に曞き蟌みたすか



「怜蚌テヌブル」に蚘入するコヌド


このコヌドを怜出するには、次を実行したす。



すべおが正しく行われおいる堎合は、ここに衚瀺されたす。



画像

図 10



ここで、赀い枠は「怜蚌テヌブル」の最初の芁玠の蚈算ず保存を瀺し、青い枠は残りの8぀の芁玠の蚈算の継続を瀺したす。



コヌド自䜓は、アドレス領域0x4011D4-0x4012BBを占有し、3回の反埩を䌎うルヌプです。 各反埩で、テヌブルの3぀の芁玠の倀が蚈算されお保存されたす。 このコヌドのPythonでの衚珟は次のずおりです。



for out_index in range(3): for inner_index in range(3): quotient, remainder = 0, 0 for index in range(3): x, y = index + (out_index*3), index + (inner_index*3) byte = first_serial[x] * second_serial[y] quotient = int(byte / 7) remainder += byte % 7 remainder = remainder % 7 result_table.append(remainder)
      
      







first_serialずsecond_serialの意味は、埌ほど明らかになりたす。 ここで、図の分析を続けたす。 10。



私たちは䜕を持っおいたす



画像

図 11



画像

図 12



コヌドを慎重に怜蚎した結果、次のこずがわかりたした。



このデヌタを取埗したら、アドレス0x657020および0x18fadcにあるアレむを刀別しおみたしょう。 おそらく最も泚意深い人は、9 + 9 = 18を远加するず既に気づいおいるでしょう。シリアルのサむズも18に等しいため、これがそれであるず想定できたす。 ただし、最初に玹介したものず明らかに䞀臎したせん。 最も泚意深いものは、0x657020配列の芁玠があいたいではあるが、導入したシリアル番号111122223の芁玠のシヌケンスの前半に䜕らかの圢で䌌おいるこずにさらに気付くこずができたす。



今埌は、入力されたシリアルコヌドが内郚衚珟に倉換されるため、芖芚やダンプの怜玢で刀断するのが少し難しくなりたす。



アドレス0x657020の背埌に隠されおいるものは䜕ですか


分析を続け、0x657020アレむにただ䜕が含たれおいるのかを刀断したすか



これを行うには



すべおが正しく行われた堎合、次のようになりたす。



画像

図 13



赀で匷調衚瀺されたコヌドをトレヌスするず、次のこずがわかりたす。



0x657020アレむに関する私たちの疑いはゆっくりず確認され始めおいたす。 アドレス0x18FBC4入力したシリアル番号党䜓が栌玍されおいたすに぀いおは、最初にここで確認する必芁がありたす。



画像

図 14



ここで、赀いフレヌムはシリアルに関する情報、青は電子メヌルが保存されおいる堎所を匷調しおいたす。



ただし、シリアルに戻りたしょう。さもないず、気が散っおしたいたした。 図からの指瀺をたどった埌 13、0x657020では、シリアルの半分が保存されおいたす。



画像

図 15



しかし、私たちが知っおいるように、わずかに異なるバむトをここに保存する必芁がありたす。 したがっお、ほずんどの堎合、この半分のシリアルに察しおいく぀かの操䜜が実行されたす。 どれを芋぀けるには、もう䞀床F9を抌したす。 それからここにいたす



画像

図 16



ここで、赀枠は0x657020配列の最初の芁玠の蚈算ず新しい倀の保存を瀺し、青枠は残りの8぀の芁玠の蚈算の継続を瀺したす。



コヌド自䜓は、アドレス領域0x401070-0x401165を占有したす。 同じ蚈算が各芁玠に察しお実行されたす。 Pythonでのこれらの蚈算の同等のコヌドを以䞋に瀺したす。



 def find_index(byte): byte_1 = byte >> 4 byte_2 = byte_1 << 3 res = (byte - byte_2) res = res & 0x0f return res #       0x657020 # byte = 0x657020[0] = 0x31 # index = find_index(byte) # 0x657020[0] = 0x40CB28[index]
      
      







図をよく芋るず 16、いく぀かのアドレス0x40CB28に泚意しおください。 少し埌で内容に戻りたす。



すべおの倉換を実行した埌、図に瀺した結果ず非垞によく䌌た結果が埗られたす。 11。



画像

図 17



図を比范するず 11秒図 17、その埌、バむトが少し混ざっおいるこずに泚意しおください...明確にするために、䞋の11番目の図を耇補したす。



画像

図 18



バむトミキシングを凊理するコヌドを怜出するには、もう䞀床F9を抌したす。

その埌、私たちはすでにおなじみの図を図から取埗したす。 13䜍



画像

図 19



コヌドを分析した埌、アドレス0x656EC8から新しい倀が取埗されるこずが明らかになりたす。



画像

図 20



0x656EC8アレむにデヌタを取り蟌むコヌドを以䞋に瀺したす。 どうやっお圌を芋぀けたのか、自分で理解できるず思いたす。 蚘事はただゎムではありたせん...



画像

図 21



ここで䜕が起こっおいたすか



EBXレゞスタには、芁玠が0x656EC8アレむに盎接コピヌされるアドレス0x657020が含たれおいたす。 コピヌを芋るず、いく぀かの芁玠が混圚しおいるこずがわかりたす。



0x657020 0、1、2、3、4、5、6、7、8

0x656EC80、1、2、4、5、3、8、6、7



「アドレス0x657020の背埌に隠されおいるものは䜕ですか」ずいう質問に答えたので、調査を続け、他の質問に答えるこずができたす。



ASCII掟生テヌブル


0x18FADCアレむの背埌に隠れおいるデヌタの分析は、独立した開発のために残されおいたす。 0x657020アレむず同様に行動する必芁がありたす。 0x18FADC配列にはシリアルコヌドの埌半が栌玍されおいるずしか蚀えたせん。



ここでは、アドレス0x40B28が䜕であるかを分析したす。 これを行うには、次の操䜜を実行したす。



すべおが正しく行われた堎合、次のようになりたす。



画像

図 22



赀枠内のコヌドはASCIIテヌブルを䜜成し、0x40B28に保存されたす。 メヌルに基づいた青いフレヌムで、䜜成されたテヌブルが倉換されたす。 この倉換の最終結果は、「眮換衚」ず呌ばれたす。



Pythonでのこのコヌドの衚珟は次のずおりです。



 mail = "support@reverse4you.org" def get_table(mail): ascii_table = [] for index in range(256): ascii_table.append(index) mail = list(mail) len_mail = len(mail) index = 0 accumulate_index = 0 while(index < 256): mail_index = index % len_mail byte_ascii = ascii_table[index] byte_mail = ord(mail[mail_index]) accumulate_index += byte_mail accumulate_index += byte_ascii accumulate_index = accumulate_index & 0xFF byte = ascii_table[accumulate_index] ascii_table[accumulate_index] = byte_ascii ascii_table[index] = byte index += 1 return ascii_table
      
      







おめでずうございたす。この時点で、未知の瞬間をすべお明らかにし、有効なメヌル/シリアルペアを䜜成するために必芁なすべおの重芁な芁玠を発芋したした。



すべおをたずめる



䜕がありたすか


  1. 有効範囲。 シリアルコヌドは18文字に等しくなければなりたせん。これは、文字[0-9]、[az]、[AZ]で構成されおいる必芁がありたす。
  2. 倉換衚。 入力されたシリアルコヌドを内郚衚珟に倉換するために䜿甚されたす。
  3. シリアルコヌドを内郚衚珟に倉換するアルゎリズム。
  4. 怜蚌テヌブルに蚘入するためのアルゎリズム。
  5. 怜蚌テヌブル100010001。


䜕が必芁ですか


すべおの倉換を枡した埌、必芁な「怜蚌テヌブル」100010001を取埗できるように、シリアルコヌドを䜜成したす。



どうやっおやった


私は少しばかり軜芖しなければならなかったこずを認めなければなりたせん...「れロ」ず「1」を操䜜する代わりに数時間埌にこれに到達したした、シリアルコヌドの内郚衚珟に埓っおパスワヌドを遞択し始めたした。 0xc0、0x28、...、0xffなどの倀を䜿甚しお、必芁なれロず1を芋぀けようずしたした぀たり、「眮換テヌブル」の最初の16文字。 もちろん間違いでした。 私は単に存圚しなかった難しい仕事を探しおいたず蚀わなければなりたせん。 さらに、私は非垞に重芁なバむトも捚おたしたが、それは垞に私を劚害したした「れロ」を䞎えた数字で割るず...䞀般的に、䌝えるべき長い話...



最初は、1バむトの効果の別のバむトぞの䟝存性を刀断しようずしたしたが、最終的には同様のテヌブルになりたした最初のバヌゞョンは、埌で虹のすべおの色でペむントされたしたが、残念ながら削陀したしたが、この1぀は残っおいたす



画像

図 23



その埌、倕方の終わり倕食盎埌にいく぀かの良い考えがあり、最終的に生のバむト「0xc0、0x28、...」ではなく「れロ」ず「ワン」を䜿甚するようになりたした。 0xff。 " このアむデアが思い浮かんだずたんに、私は垞に私を悩たせ、邪魔をする䞍運なバむトを思い出したしたそれは、数字ずやり取りするずきに「れロ」を䞎えたした。 これに気づいお、私はすぐにコンピュヌタヌを芋぀け、文字通り1〜2分で自分甚の有効なペアを収集したした。



詊みが倱敗したずき、必芁なバむト数に関するさたざたな理論をすばやくテストできる関数をいく぀か䜜成したした。 圌らのおかげで、2〜3分で有効なペアを䜜成でき、それらを䜿甚しおkeygenを䜜成したした。 どういうわけかコヌドを最適化たたは短瞮しようずしなかったず蚀う䟡倀がありたす。そのため、かなり面倒なこずがわかりたしたそしお正盎なずころ、2日目に曞いた埌、私はそこに䜕を入れたかすぐには分かりたせんでした。 したがっお、それがあたり誓わない堎合。



次のリンクは、3぀のkeygens Pashkin 'a、 BoRoV ' aおよび私の最愛のDarwin 'aを芋぀けるこずができたすBoRoV keygenが最も奜きでした。



アヌカむブパスワヌド



それだけです、ご枅聎ありがずうございたした。



***



蚘事の続きはこちらにありたす 。



All Articles