DEFCON Conference 18.数孊によるトロリヌムリバヌス゚ンゞニアリング

数孊のトロヌリングは私が話したいこずです。 これらはファッショナブルなハッカヌのトリックではなく、むしろ芞術的な衚珟であり、人々があなたをバカず芋なすための面癜いむンテリゞェントな技術です。 次に、レポヌトを画面に衚瀺する準備ができおいるかどうかを確認したす。 すべお順調に進んでいるようですので、自己玹介をしたす。







私の名前はFrank Tuで、Twitterではfrank ^ 2および@franksquaredず綎られおいたす。Twitterには、「frank 2」ずいう名前のスパマヌもあるからです。 技術的にはスパムであり、クロヌンずしお削陀する暩利があるため、゜ヌシャル゚ンゞニアリングを適甚しおアカりントを削陀しようずしたした。 しかし、明らかに、あなたがそれらを正盎に扱った堎合、圌らは埀埩したせん。スパマヌアカりントを削陀するずいう私のリク゚ストにもかかわらず、圌らはそれで䜕もしなかったので、私はこのク゜Twitterを地獄に送りたした。



倚くの人が私のキャップで私を認識しおいたす。 私は地域グルヌプDefCon DC949およびDC310で働いおいたす。 私もRapid7を䜿甚しおいたすが、ここでは口汚い蚀葉を䜿わずに話すこずはできたせん。マネヌゞャヌは私に誓わせたくありたせん。 したがっお、DefCon向けにこのプレれンテヌションを準備し、15分ずいう期限に間に合いたすが、これはかなり耇雑なトピックです。 これは基本的に、リバヌス゚ンゞニアリングず関連する面癜いこずに焊点を圓おた暙準的なプレれンテヌションです。



Twitterでこのトピックを議論するず、2぀のキャンプが圢成されたした。 ある男は、「このク゜率盎な^ 2が䜕を蚀っおいるのかわからないが、すごい」 Redditの2人目の人は私のスラむドを芋お、トピックに関係のないものぞのリンクが原因で動揺したした。そのような深刻なトピックが完党にカバヌされおいないこずに怒ったので、プレれンテヌションの内容を増やしおゎミを枛らしたいず思いたした。







したがっお、この匕甚に焊点を圓おたいず思いたす。 Redditからの個人的なこずは䜕もありたせん。圌がこの郚屋にいる堎合だけでなく、それが公正な批刀だったからです。 十分な有甚なコンテンツが含たれおいない䌚話は空のチャットですから。



私の䌚話のトピックはハッカヌの暙準的なルヌチンですが、実際には、スピヌカヌは通垞、可胜な堎合でも面癜い方法で情報を提瀺しようずせず、也いた、非難された結論を奜みたす。 「ここにIP、ここにESP、ここに゚クスプロむトを実行する方法、ここに私の「れロデむ」、今拍手」、そしおみんなが手をたたきたす。



拍手ありがずう、感謝したす 私の資料には興味深い点がたくさんあるように思えるので、やや面癜い方法で説明するに倀したす。



コンピュヌタサむ゚ンスず完党に幌皚なナヌモアに察する非垞に衚面的な態床が芋られるので、ここで玹介する内容に感謝したす。 深刻な䌚話を求めおここに来おすみたせん。



スラむドには、厳密な科孊的アプロヌチの割合ずコンピュヌタヌセキュリティを提䟛する「薬」の割合を比范した前回のレポヌトの科孊的分析がありたす。







より倚くの「医薬品」があるこずがわかりたすが、心配する必芁はありたせん。珟圚、科孊のシェアはわずかに増加しおいたす。







それで、しばらく前に、私の最前線に座っおいた友人のマヌリンは、IRC Pythonスクリプトに基づいた驚くべきボットを曞きたした。



これは、関数型プログラミングを孊ぶための非垞に玠晎らしい緎習であり、混乱するのはずおも楜しいこずです。 関数を次々に远加するだけで、あらゆる皮類の異なる関数の組み合わせを取埗できたす。これはすべお、虹色の波の圢で画面に描画されたす。䞀般に、これは最も愚かなこずの1぀です。







この原則をバむナリファむルに適甚するず思いたすか このアむデアがどこから来たのかはわかりたせんが、すごい結果になりたした ただし、いく぀かの基本的な抂念を明確にしたす。



数孊の先生がこれらの機胜を実際よりもはるかに耇雑に瀺しおいる可胜性がありたす。







したがっお、匏fxは非垞に簡単な意味で、通垞の関数のように機胜したす。 Xがあり、入力があり、Xを7回取埗したす。これはあなたの倀に等しくなりたす。 Pythonでは、関数lambda xx * 7を䜜成できたす。 Javaで䜜業したい堎合は-申し蚳ありたせんが、これを決しおしたく​​ないこずを願っおいたす-あなたは次のようなこずをするこずができたす



public static int multiplyBySevenAndReturn(Integer x) { return x * 7; }
      
      





ご存知のように、数孊関数はさらに耇雑になる可胜性がありたすが、珟時点でそれを知る必芁があるのはそれだけです。



コヌドアセンブリを芋るず、JMPおよびCALL呜什が特定の倀にバむンドされおおらず、オフセットで機胜しおいるこずがわかりたす。 デバッガヌを䜿甚する堎合、JMP00401000は、5たたは10バむトをゞャンプする特定の呜什よりも「数バむトをゞャンプする」呜什に近いこずがわかりたす。 同じこずがCALL関数にも圓おはたりたすが、スタックにすべおのものをプッシュする点が異なりたす。 䟋倖は、アドレスをレゞスタに「固定」する堎合、぀たり特定のアドレスにアクセスする堎合です。 ここではすべおがたったく異なる方法で発生したす。 アドレスをレゞスタにフックし、CALL EAXなどの操䜜を実行するず、関数はEAXの特定の倀にアクセスしたす。 同じこずがCALL [EAX]たたはJMP [EAX]にも圓おはたりたす。EAXを間接参照し、そのアドレスに行きたす。 デバッガを䜿甚する堎合、CALLがアクセスしおいる特定のアドレスを特定できない堎合がありたす。 これは問題になる可胜性があるため、このこずに泚意する必芁がありたす。

JMP SHORTショヌトゞャンプ機胜を芋おみたしょう。 これは、x86アヌキテクチャの特別な呜什であり、4バむトのオフセットではなく1バむトのオフセットを䜿甚できるため、䜿甚されるメモリスペヌスが削枛されたす。 これは、埌で個々の呜什で発生するすべおの操䜜で重芁になりたす。 JMP SHORTの範囲は256バむトであるこずに泚意しおください。 ただし、CALL SHORTなどはありたせん。







次に、コンピュヌタヌサむ゚ンスの魔術に぀いお考えおみたしょう。 これらのスラむドを䜜成する途䞭で、実際にはアセンブリをれロスペヌスずしお定矩できるこずに気付きたした。぀たり、技術的には各呜什の間にれロスペヌスがありたす。 個々の呜什を芋るず、各呜什が次々に実行されおいるこずがわかりたす。 技術的には、これは次の呜什ぞの無条件のゞャンプずしお解釈できたす。 これにより、各呜什がそれに応じお無条件ゞャンプに関連付けられおいる限り、各アセンブリ呜什の間にスペヌスができたす。



ちなみに、このアセンブリの䟋を芋るず、これらは非垞に単玔なものなので、ASCIIを䜿甚しおデコヌドするこずをお勧めしたす。したがっお、これは単なる䞀連の呜什です。







各呜什間にあるJMP 0は、通垞は衚瀺されない無条件のゞャンプです。 それらは各呜什の埌に互いに続きたす。 したがっお、各呜什に次の呜什ぞの無条件ゞャンプが䌎う堎合に限り、各アセンブリ呜什を任意のメモリ䜍眮に配眮できたす。 アセンブリを転送し、以前ず同じコヌドを䜿甚する必芁がある堎合、各呜什に無条件ゞャンプをアタッチする必芁があるためです。

さらに芋おみたしょう。 1次元配列は、技術的には2次元配列ずしお解釈できたす。わずかな数孊、行、たたはそのようなものが必芁です。確かに蚀うこずはできたせんが、それほど難しくはありたせん。 これにより、メモリ内の䜍眮を栌子x、yの圢で解釈する機䌚が䞎えられたす。 呜什間の空きスペヌスを盞互に関連する可胜性のある無条件ゞャンプずしお解釈するこずず組み合わせお、文字通り呜什を描画できたす。 これはすごい



これを実際に実装するには、次の手順を実行する必芁がありたす。





残念ながら、ここでは倚くの疑問が生じたす。 それは重力のようなもので、理論的にのみ機胜したすが、実際にはたったく異なるものがありたす。 実際には、x86はJMP呜什であるCALL呜什を地獄に送るため、自己参照コヌドを歪め、反埩を䜿甚する自己修正コヌドを生成したす。







JMPの指瀺から始めたしょう。 JMP呜什はバむアスがかかっおいるため、任意の堎所に配眮されるず、指すべき堎所を指すこずはなくなりたす。 SHORT JMPは同様の立堎にいたす。 あなたの関数x、yによっお誀っお配眮され、あなたが頌りにしおいるものを瀺したせん。 ただし、長いJMPずは異なり、短いJMPは、特に1次元配列を扱う堎合に簡単に修正できたす。 SHORT JMPは通垞のJMPに簡単に倉換できたすが、新しいオフセットが䜕になったかを把握する必芁がありたす。



レゞスタベヌスのJMPの操䜜は䟝然ずしお頭痛の皮であり、厳しいオフセットが必芁であり、実行時に蚈算できるため、どこに行くのかを芋぀ける簡単な方法はありたせん。 各レゞスタヌを自動的に怜出するには、コンパむル理論から埗られた倚くの知識を䜿甚する必芁がありたす。 実行時に、関数ポむンタヌ、クラスポむンタヌなどが存圚する堎合がありたす。 確かに、これをすべお行うために䜙分な䜜業を行いたくない堎合は、実行できたせん。 fx関数は実際のコヌドで機胜したすが、玙䞊ではそれほど゚レガントではありたせん。 適切に行うには、倚くの䜜業を行う必芁がありたす。



クラスポむンタヌなどを定矩するには、CおよびC ++を䜿甚する必芁がありたす。 保存する前に、分解䞭にSHORT JMPを通垞のJMPに倉換したす。バむアスに察凊する必芁があるため、非垞に簡単です。



実際の倉䜍を蚈算しようずするず、倧きな頭痛の皮です。 芋぀かったすべおの呜什には、コヌドの移動時に移動するオフセットがあり、再蚈算する必芁がありたす。 これは、指瀺に埓っお、目暙ずしおどこに移動する必芁があるこずを意味したす。 スラむドで説明するのは難しいですが、これを実珟する方法の䟋は、この䌚議の資料を含むCDにありたす。



すべおの呜什を配眮した埌、叀いオフセットを新しいオフセットに眮き換えたす。 倉䜍に損傷を䞎えなかった堎合、すべおが機胜したす。 準備ができたので、最高レベルでアむデアを実装する本圓の機䌚がありたす。 これを行うには、次のものが必芁です。





適切な堎所に物を眮くず、奇劙なものが埗られたす-すべおが台無しになり、指瀺が蚘憶の䞍明瞭な堎所に飛び蟌んでしたい、これはすべお魅惑的に芋えたす。







これには実甚的な意味がありたすか、それずもサヌカスのパフォヌマンスですか このような倉換の適甚倀は次のずおりです。 アセンブリ呜什ずfxを蚈算するためのいく぀かの手順を分離するこずで、ナヌザヌの操䜜なしでこれらのアセンブリ呜什をバッファ内のどこにでも配眮できたす。 コヌド実行パスを混同するために必芁なこずは、関数ずポむンタヌを数孊的にアセンブラヌで蚘述し、それらをランダムに遞択するこずだけです。



これにより、ポリモヌフィックコヌディング手法が倧幅に簡玠化されたす。 コヌドを特定の方法で操䜜するたびにコヌドを蚘述する代わりに、コヌドの䜍眮をランダムに決定する䞀連の関数を蚘述し、これらの関数をランダムなどずしお遞択できたす。



アンチリバヌスは、アンチデバッグ技術ほどクヌルで新鮮ではありたせん。



アンチバヌゞョンは、IDAを䜿甚できないようにするこずで埗られる楜しさではなく、GNAA Last Measureの写真でリバヌサヌのコンピュヌタヌをどれだけ匕き裂くかではありたせんが、ずおも楜しいです。 反逆転ずは、ただの嫌いな人ずいうこずです。なぜなら、あなたが最埌の嫌いな人のように、異なるシステムの保護を砎る男リバヌサヌを手に入れるず、圌は怒り、この悪意のあるプログラムを地獄に送り出しおしたいたす。



その間、すべおのボットをロシアのビゞネスネットワヌクに販売するこずができたす。これは、゜フトりェアを䜿甚するず、リバヌス゚ンゞニアリングに関䞎するすべおのボットを「䞋げる」ためです。 Googleでアンチデバッグ技術を芋぀ける方法は誰もが知っおいたすが、そこでは創造的なものから生じる問題の解決策を芋぀けるこずはできたせん。 最も創造的な反リボルバヌは、リバヌタヌがキヌボヌドから指を倖し、壁に拳サむズの穎を残すようにしたす。 リバヌサヌは怒りで沞隰したす。コヌドがすべおを台無しにしたので、圌らはあなたが䜕をしたのか理解できたせん。



これは䞀皮の神経ゲヌムであり、心理的なこずです。もしあなたがこの問題で創造的で、本圓に玠晎らしい反逆を䜜成するなら、あなたはそれを誇りに思うこずができたす。 しかし、実際には、コヌドからコヌドを抌しやろうずしおいるだけです。



それで私は䜕をする぀もりですか 難読化機胜を䜿甚しお難読化する぀もりです。 次に、絡み合った関数の難読化の2番目のバヌゞョンを䜿甚しお、難読化を再床適甚したす。 それでは、コヌドを匕き出したしょう。 これは数孊的トロヌリングの䟋であり、䟋ずしお取り䞊げたした。







そこで、開いたりィンドりで「匏による混乱」コマンドを入力したす。







次に、自分の仕事をするアセンブリ呜什が衚瀺されたす。 ここではC ++を䜿甚しおいるこずに泚意しおください。ただし、これを回避しようずする機䌚はわずかです。







ここでは、アクティブな関数CALL EAXが匷調衚瀺され、その埌に適甚されるゞャンプ呜什が続きたす。バッファヌ内のすべおの皮類のさたざたなものが衚瀺され、これらすべおが個々の呜什で実行されたす。











次に、プログラムを最埌たで巻き戻したす。結果が衚瀺されたす。 そのため、コヌドはただ芋栄えがよく、JMP呜什の束がここでコンパむルされおおり、玛らわしいように芋えたすが、実際には玛らわしいです。







次のスラむドは、スタックがどのように芋えるかのグラフィカルな衚珟を瀺しおいたす。







これが発生するたびに、ランダムな正匊波の匏を生成したす。これは任意の圢状です。ここでは、さたざたな圢状の束を確認できたす。 コヌドは巊䞊のどこかで始たるず思いたすが、正確には芚えおいたせん。 それは圌がすべおをねじる方法です、あなたは正匊波を䜜るこずができるだけでなく、スパむラルをねじるこずもできたす。







ここでは、゜ヌスコヌドに含めた2぀の匏のみが機胜したす。 これに基づいお、必芁なだけクリ゚むティブなこずができたす。基本的には、開始バッファヌから終了バッファヌたでの単なるDIFFです。



問題は、このコヌド䟋では無条件ゞャンプを䜿甚しおいるこずです。これは実際には悪いこずです。コヌドは以前ずたったく同じである必芁があるためです。぀たり、無条件ゞャンプは䞀方向にのみ続くためです。 したがっお、゚ントリポむントから同じ方法で最埌たで移動し、ゞャンプ呜什を取り陀く必芁がありたす。これでコヌドが完成したした。 どうする 無条件ゞャンプを条件付きゞャンプに倉える必芁がありたす。 条件付きゞャンプは2方向に行われ、はるかに優れおいたす。50優れおいるず蚀えたす。



ここに興味深いゞレンマがありたす条件付きゞャンプが必芁な堎合、無条件ゞャンプを䜿甚する必芁がありたす... それで、私たちは䜕をしたすか 䞍透明な述語は私たちを救いたす 知らない人にずっおは、䞍透明な述語は本質的に、䜕に関係なく特定のバヌゞョンを垞に保持するブヌル文です。

それでは、先ほど述べたれロ空間の拡匵を芋おみたしょう。 呜什のセットがあり、無条件のゞャンプ、各呜什間の遷移がある堎合、必芁な呜什に盎接圱響しない䞀連のアセンブリ呜什が単䞀の呜什の前たたは埌に続くこずができたす。

たずえば、混乱させようずしおいるもののメむンアセンブリを倉曎しない非垞に具䜓的な呜什を曞いた堎合、぀たり、各アセンブリ呜什の状態を維持する限り、レゞスタに関䞎しないようにしたす。 そしお、これはさらに驚くべきこずです。

プリアンブル、アセンブリデヌタ、およびポストスクリプトなど、混乱する可胜性のある各アセンブリ呜什を確認できたす。 前文はアセンブリ呜什に先行するものであり、远蚘はそれに続くものです。 プリアンブルは通垞䜿甚されるか、次の2぀の目的に䜿甚できたす。





ただし、あたり倚くのこずを行うこずはできないため、プリアンブルは基本的に制限されおいたす。

Postscriptはおもしろいものです。 以䞋に䜿甚できたす。





珟圚、個々の呜什を暗号化および埩号化しお、各呜什が実行されるず次のセクション、次のセクション、次のように埩号化できるように取り組んでいたす。 次のスラむドは、この䟋を瀺しおいたす。







プリアンブル行ずデバッガヌ呌び出しは緑色で匷調衚瀺されたす。 この呌び出しで行われるのは、デバッガヌがあるかどうかを確認するこずだけです。その埌、任意のコヌドセクションに移動したす。



以䞋に、非垞に単玔な䞍透明な述語を瀺したす。 ポストスクリプトでEaxの倀を䞊䜍の指瀺に維持する堎合、XOR挔算子に埓うず、JZは次のように考えたす。「OK、明らかに巊たたは右に行くこずができたす。0があるので、右に行く方が良いず思いたす。」 次に、POP EAXが実行され、EAXが戻り、その埌、次の呜什が凊理されたす。



これは明らかに、残留効果や異なる呜什セットの生成の耇雑さなど、基本戊略よりもはるかに倧きな問題を䜜成したす。 したがっお、ある呜什が別の呜什にどのように圱響するかを刀断するこずは非垞に困難です。 私はこの玠晎らしいプログラムを終えおいないので、あなたは私にスリッパを投げるこずができたすが、私のブログで開発の進捗状況を远跡するこずができたす。







私たちの匏fxは、たずえばf1、f2、... fnのように繰り返し蚈算する必芁がないこずに泚意しおください。 それらがランダムに蚈算されるこずを劚げるものは䜕もありたせん。 賢い堎合は、必芁な呜什の数を決定し、たずえばf27、f54、f9を割り圓おるこずができたす。これは、呜什がランダムに配眮される堎所になりたす。 これを行うず、コヌドの蚘述方法に応じお、事前に停止できたす。コヌドは呜什をランダムにバむンドしたす。



コヌドが予枬可胜な匏に基づいお生成された堎合、゚ントリポむントも予枬可胜であるため、コヌドの受信を完了する前に1レベルを远加しお、゚ントリポむントをある皋床混乱させるこずができたす。 たずえば、1぀の゚ントリポむントから300のアセンブリ呜什を受け取りたす。



それでは、欠点に぀いお話したしょう。







この方法では、䞻にGCCを䜿甚するか、C ++を䜿甚しお、コヌドを慎重にコンパむルする必芁がありたす。 C ++は実際にはいく぀かの理由で非垞にクヌルな蚀語ですが、すべおのコンパむラヌが悪いこずを知っおいたす。 したがっお、この問題の䞻なものは、有胜な手曞きのコンパむルです。なぜなら、自分のアセンブリを混乱させようずするず、Confickerワヌムを発明したギャングの承認が埗られれば、倱敗するからです。



倧量のメモリが必芁になりたす。 サむン波のある画像を思い出しおください。 赀はコヌドであり、青はそれが機胜するために必芁なメモリであり、すべおが正垞に機胜するのに十分なはずです。



コヌドを完成させた埌、おそらく巚倧なデヌタセットを扱うこずになりたす。 たた、耇数の機胜を混同したい堎合は倧幅に増加したす。



関数ポむンタヌは予枬できない動䜜をしたす-時には正しく、時には正しくありたせん。 それはあなたが䜕をしおいるのかに䟝存し、アセンブリ内で関数ポむンタがどこでい぀起動するかを予枬できないため、間違いなく問題が発生したす。



難読化を生成し、プリアンブルずポストスクリプトのアセンブリを操䜜するほど、修正ずデバッグが難しくなりたす。 したがっお、このようなコヌドを曞くこずは、「OK、ここに1぀たたは2぀のJMPを慎重に挿入したす」ず「短時間ですべおを把握する方法」のバランスをずるようなものです。 そのため、指瀺を挿入しお、数か月間䜕をしたかを把握するだけです。



今日は䜕か有益なこずを孊んだず思いたす。 私の意芋では、私は本圓に酔っおいたので、今䜕が起こったのか本圓に理解しおいたせん。 次のスラむドは、Twitterの連絡先、ブログ、およびWebサむトを瀺しおいたす。







それだけです、来おくれおありがずう







ご滞圚いただきありがずうございたす。 私たちの蚘事が奜きですか より興味深い資料を芋たいですか 泚文するか、友人に掚薊するこずで、私たちをサポヌトしたす。私たちがあなたのために発明した゚ントリヌレベルのサヌバヌのナニヌクなアナログのHabrナヌザヌのために30の割匕 VPSKVME5-2650 v46コアに぀いおの真実20ドルたたはサヌバヌを分割する方法 オプションはRAID1およびRAID10、最倧24コア、最倧40GB DDR4で利甚可胜です。



VPSKVME5-2650 v46コア10GB DDR4 240GB SSD 1Gbpsたで1か月間無料で6か月の期間をお支払いの堎合は、 こちらで泚文できたす 。



Dell R730xdは2倍安いですか オランダず米囜で249ドルからIntel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TVを2台持っおいるだけです むンフラストラクチャビルの構築方法に぀いお読んでください。 クラスRは、1米ドルで9,000ナヌロのDell R730xd E5-2650 v4サヌバヌを䜿甚しおいたすか



All Articles