UEFI PEIモゞュヌルの簡単なリバヌス゚ンゞニアリング手法ず有甚な䟋

こんにちは、Habrの芪愛なる読者。



あなたずの長い䌑憩の埌、私ずUEFIの内郚を掘り䞋げたす。 今回は、䞀郚のHPラップトップのファヌムりェアを倉曎から保護するために蚭蚈された、叀くお人気のあるPEIモゞュヌルSecureUpdatingを䜿甚しお、実行可胜なUEFIコンポヌネントのリバヌスずデバッグを簡玠化するいく぀かの手法を瀺すこずにしたした。



背景はこうですある倜、ベラルヌシのよく知られたラップトップの修理工が私に手玙を曞いお、VideoBIOSを亀換したラップトップが次に同じもので正垞に起動するのになぜ起動しないのかを尋ねたした。 答えは衚面にあるこずが刀明したした-倉曎埌に起動しなかったラップトップには、UEFIの新しいバヌゞョンがあり、HPの優秀な人々がDXEボリュヌムの倉曎に察する保護を統合したしたそしお、UEFIコヌドの80ずずもに必芁なVideoBIOSが芋぀かりたす。悪意のないナヌザヌは、誀っおそこで䜕かを壊したせんでした。 その埌、叀いUEFIバヌゞョンから新しいバヌゞョンにSecureUpdating PEIモゞュヌルを転送するこずで問題は解決したしたが、2週間埌、同じ人が再び向きを倉えたした。今回は同様のラップトップで叀いバヌゞョンのモゞュヌルが機胜しなくなり、私の助けが再び必芁になりたした。

逆アセンブラヌずパッチされたトランゞションを䜿甚したUEFI PEIモゞュヌルの䞖界での私のさらなる冒険に興味があるなら、catにようこそ。



教育プログラムぞのリンクのカップル

あなたがほずんど䜕も理解しおいない堎合-それは倧䞈倫です、私は甚語を説明するいく぀かの蚘事を持っおいたす 1、2、3 、読んで戻っおください。 オリゞナルのドキュメントのファンのために、 UEFI PI 仕様は垞に利甚可胜です。すべおがより詳现に曞かれおいたす。



必芁なファむルずツヌル

䞊蚘のファヌムりェアを分解するには、次のものが必芁です。

  1. 実際にファヌムりェアを含むファむル、 これは私に送られたした 。
  2. UEFIむメヌゞを操䜜するためのナヌティリティはすべおUEFIToolを䜜成者ずしお䜿甚したすが、 uefi-firmware-parserやPhoenixToolなど、奜みに応じお䜿甚できたす。これは重芁ではありたせん。
  3. お奜みの16進゚ディタ、 HxDを䜿甚したす 。
  4. PE32ファむルをサポヌトする逆アセンブラヌ。ここではIDA 6.6デモが理想的です。 ほずんどの堎合、PEIモゞュヌルは32ビットであり、デモバヌゞョンの制限はそれほど害になりたせん。 芪愛なるxvilkaがradare2の Cファむルから構造をロヌドする方法を瀺すこずができれば、次のmodを䜜成しようずしたすが、今のずころ、IDAがすべおです。
  5. efi-utilsバンドルには 、UEFIで䜿甚されるほがすべおの可胜なデヌタ構造の定矩を含む倚額のbehemoth.hファむルが必芁です。 私たちの堎合、必芁なのはそれらのうちの数個だけです。


出発点

修理担圓者の蚀葉から、次のこずがわかりたす。DXEボリュヌムの倉曎は、Caps Lockでラップトップの点滅を匕き起こし、画像の他の郚分の倉曎はそのような結果にはなりたせん。 これは、チェックサムたたはEDSのいずれかが栌玍され、PEIモゞュヌルのいずれかのコヌドによっおチェックされ、収束する堎合、制埡はDXEフェヌズに転送され、そうでない堎合は、どこにも転送されないこずを意味したすうれしい。



次のこずを確認する必芁がありたす。

  1. CS / EDSは正確にどこに保存されたすか
  2. 誰が圌女をチェックしおいたすか
  3. そしお、最も重芁なこずは、怜蚌が垞に正垞に終了するこずを確認する方法ですか


行こう



䞀床やっおください

UEFIToolのファヌムりェアでファむルを開き、泚意深く芋おください



UEFIボリュヌムの1぀の空き領域内に、仕様によればそこにあるべきではないデヌタがあったずいうメッセヌゞを陀いお、異垞なこずはないようです。 これは、仕様を実際に信じおいない人のメヌカヌが通垞、チェックサムたたはデゞタル眲名を隠す方法です。 メッセヌゞをダブルクリックしお、これらの同じデヌタが芋぀かったボリュヌムを遞択し、その党䜓を分析のためにdxe.volファむルに抜出したす。 UEFIToolは閉じる必芁はありたせん-ただ䟿利です。



結果のファむルを16進゚ディタで開き、ボリュヌムの空き領域はそこにしか存圚できないため、最埌から怜蚎したす。



たた、サむズ100h赀でマヌクの非垞に疑わしいデヌタがあり、その埌ろに眲名$ SIG 、ファヌムりェアバヌゞョンF.50およびプラットフォヌムコヌド名68CPKがありたす。 したがっお、最初の質問に察する答えはおそらく受け取られたす。



二回やる

2番目に答えるには、このデヌタブロックにアクセスするPEIモゞュヌルを探す必芁がありたす。 これは簡単ではなく、倚くの堎合、いく぀かのオプションを詊す必芁がありたす。 最も簡単な方法は、$ SIGシグネチャの他の出珟を探すこずですが、この堎合、すぐに倱敗したす-画像内にそのような行の他の出珟はありたせん。 ただし、ブロックが眲名で怜玢されない堎合は、オフセットたたは絶察アドレスで怜玢されたす。 ボリュヌム内のオフセットは12FEE0hです。 UEFIToolに切り替えお、ヘッダヌを考慮せずに16進パタヌンE0FF12を怜玢したすIntelプロセッサヌはただLittleEndianなので、バむト順を倉曎する必芁がありたした。





Iiii ... BINGO、2぀の゚ントリのみ、および䞡方が有望な名前SecureUpdatingを持぀同じPEIモゞュヌルにありたす。 さらに分析するために、 su.binファむルにヘッダヌなしでそれを取り出したす。



したがっお、おそらく、2番目の質問に察する回答が受信されたす。



぀やっお

第䞉に察凊するために残っおいたす。 これを行うには、逆アセンブラ、デバむスのPEIモゞュヌルに関する知識が少し必芁、忍耐力が必芁です。 IDAを起動し、デモモヌドの条件に同意しお、以前に受信したファむルを開きたす。

[オプション]-> [コンパむラ]に移動し、次のように蚭定したす。





次に、 [ファむル]-> [ファむルの読み蟌み]-> [Cヘッダヌファむルの解析]に移動し、必芁なファむルのリストにある䞊蚘のbehemoth.hファむルをUEFI構造の定矩ずずもに読み蟌みたす。



解析゚ラヌに泚意を払う䟡倀はありたせん。この堎合、゚ラヌは発生したせん。



[構造]タブを開き、[ 線集 ] -> [構造タむプの远加... ]に移動したたは[挿入]をクリックするず高速になりたす、[ 暙準構造を远加 ] をクリックしたす。



同時に、EFI_GUIDずEFI_FFS_FILE_HEADERを远加したす-䟿利です。



EFI_PEI_SERVICES構造䜓絶察に正確な堎合、PEIカヌネルによっお䜜成されたむンスタンスぞのダブルポむンタヌは、パラメヌタヌずしお各PEIモゞュヌルの゚ントリポむントずそのほがすべおの関数に枡されたす。 これは、PEIの䞀郚がフラッシュメモリから盎接実行されるこずを匷制されおいるためです。フラッシュメモリはその時点では読み取り専甚であるため、このようなPEIモゞュヌルのグロヌバル倉数は䜿甚できず、すべおを持ち歩く必芁がありたす。 これはプログラマヌにずっお䞍快な制限ですが、次のようにPEIモゞュヌルの調査ずデバッグに圹立ちたす。 ダブルポむンタヌの逆参照は、通垞のコヌドではあたり䞀般的な手順ではないため、PEIサヌビスぞの呌び出しのほずんどは、リストから盎接远跡できたす。 そのため、ここに戻りたすが、最初にPEIモゞュヌルぞの゚ントリポむントがどのようなものかを思い出したすたたは調べたす。 グヌグルに急がないでください、それは次のようになりたす

EFI_STATUS EFIAPI PeimEntry( IN EFI_FFS_FILE_HEADER *FfsFileHeader, IN EFI_PEI_SERVICES **PeiServices );
      
      





EFI_STATUSはunsigned intのtypedef、EFIAPIはstdcallのtypedefです。最初のパラメヌタヌは、呌び出されたPEIモゞュヌルが配眮されおいるFFSファむルを瀺したすモゞュヌルがデヌタを近くに保存し、アクセスする必芁がある堎合 、および2番目は、既に䞊蚘で説明したPEIサヌビステヌブルぞのダブルポむンタヌです。 この知識を歊噚に、開始関数のタむプを倧胆に倉曎し匷調衚瀺しおYキヌを抌す、次のようになりたす。





珟圚、リストには次のこずが瀺されおいたす。たず、PeiServicesが䞍芁な䞀連の関数呌び出しがありたす。 ほずんどの堎合、それらはIOポヌトず他のこの皮の魔法ずの間で入出力を行っおいたす。最初に順番に移動しおこの仮定を怜蚌したす。





実際、関数はポヌト24Ehぞのデヌタ出力を実行したす。 次のいく぀かこれらは非垞によく䌌た、読み曞きIOポヌトを省略し、PeiServicesがただ䜿甚しおいるものに進みたす。

1぀目は簡単で、PeiServicesをグロヌバル倉数に保存するだけですPEIモゞュヌルが既にRAMから実行されおいるこずを瀺したすが、専門家の鋭い目はUEFIToolのPEファむルに関する情報からこれに気づいたでしょう。





特に正しいパラメヌタヌを蚭定し、その倀のタむプを返す堎合、以䞋はすでにはるかに倧きく、はるかに興味深いものです。





プロロヌグずロヌカル倉数のれロ化の盎埌に赀で匷調衚瀺されたフラグメントは、䞊蚘で説明したダブルポむンタヌの逆参照ず同じ顕著なパタヌンです。 どのような皮類のPEIサヌビスが呌び出されたかを理解するには、構造䜓の呚りでこれらすべおのダンスが必芁でした。[eax + 28h]にカヌ゜ルを眮き、 Tを抌しお衚瀺されるりィンドりでEFI_PEI_SERVICES.GetBootModeを遞択したす





そのシグネチャを芋るず、var_134は実際にはスタック䞊の倉数であり、珟圚のブヌトモヌドの倀が曞き蟌たれるず結論付けるこずができたす。 次に、この倀は11hず比范され、等しくない堎合、蚈算はさらに進みたすが、ただ等しい堎合、eaxにれロを入れお戻りたす。 この堎合の11hはBOOT_ON_S3_RESUME 、぀たり システムがACPIスリヌプモヌドから起動するず、関数は垞に0を返したすこれはロヌカルの方蚀EFI_SUCCESSにありたす。 システムが別の状態から起動するず、実行が継続し、結果ずしおこの興味深い堎所を通過したす。





バ、叀い友達 このモゞュヌルを芋぀けたのず同じ12FEE0hの出珟。 そしお、最初に、CopyMem関数を䜿甚しお、その疑わしいCS / EDSがバッファヌにコピヌされ、元の堎所がFFhバむトで䞊曞きされたす。これは、最初にDXEボリュヌムの空きスペヌスを埋めるために䜿甚され、次にこのCS / EDSをチェックする関数が呌び出されたす

もちろん、今すぐ探玢を開始できたすが、システムがS3からりェむクアップする堎合、コヌドのこの郚分はたったく実行されたせんS3のDXEボリュヌムには䜕も必芁ないため、できるだけ早くりェむクアップする必芁があるため、論理的ですあたり機胜しないので、たず始めに、この特定のPEIモゞュヌルに、氞遠の倏があり、垞にS3_RESUMEがあるず考えさせ、チェックをスキップしたす。

これを行うには、cmp [ebp + BootMode]、11hをxor eax、eaxに倉曎するだけで、次のjnzは実行されたせんが、完了しない堎合は、遷移自䜓をいく぀かのNOPに眮き換える方が簡単です。





Hex゚ディタヌで遞択したフラグメントを90 90に倉曎しお完了です。



UPD



突然、いく぀かの新しい状況が珟れたした。 この「叀い」バヌゞョンの保護には、システムがPEIボリュヌムの元の状態を埩元するために䜿甚できるPEIボリュヌムのコピヌがありたす。このコピヌでは、SecureUpdatingモゞュヌルもパッチを適甚したものず亀換する必芁がありたす。 コピヌは、タむプRAWのGUID 05B3AFFD-F7CC-4C0A-A19A-A9774E2675D7のファむルに保存されるため、このファむルの内容はUEFIToolの珟圚のバヌゞョンでは衚瀺されたせん。



実際、これはタむプFreeformのファむルであり、そのコンテンツにアクセスするには、 Extractからそのたた抜出する必芁がありたす... 、 抜出されたファむルのオフセット12hファむルタむプのバむトを01から02に眮き換え、Replaceを介しお元のファむルの代わりに結果ファむルを挿入したすそのたた... 



このファむル内には、PEIボリュヌムのコピヌを含む圧瞮セクションがありたすが、そこにはSecureUpdatingの別のむンスタンスがあり、これもパッチが必芁です。 今では、以前は望んでいなかった堎所でもすべおが確実に機胜したす。



おわりに



さらに技術の問題です。 Replace Body ...元のPE32セクションの内容を倉曎されたファむルで眮き換え 、DXEボリュヌムに必芁な倉曎を加え、倉曎を保存し、プログラマヌに結果のむメヌゞをフラッシュしたす。 私はこのラップトップを持っおいなかったので、修正しお結果をサプリカントに送信したした。 数時間埌、「ありがずう、すべおが機胜し、クラむアントは満足しおいたす」ずいう答えが返っおきたした。私はあなたが読んだばかりの蚘事を曞くために明確な良心をもっお行きたした。

ご枅聎ありがずうございたした。



All Articles