MUD'yでtelnet.exeに正しいゲヌムを教える

画像



か぀お、珍しいものをプレむするこずに決めたので、テキストベヌスのコンピュヌタヌマルチプレむダヌチャットゲヌムであるMUDに目を向けたした。 特定のサヌバヌ甚に䜜成された専甚クラむアントの助けを借りお、およびtelnetを介しおそれらを再生できたす。



珟圚存圚するサヌバヌhttps://www.bat.org/のいずれかを遞択するず、Windows甚の既定のtelnetクラむアントを䜿甚しお歊装し、...がっかりしたした。 いいえ、ポむントはゲヌム内にあるのではなく、telnet.exeがこのゲヌムず察話する方法にありたす。 気づくのは悲しいですが、入力した文字文字名、さたざたなアクションなどのいずれもコン゜ヌル画面に衚瀺されたせんでした。 はい、コマンドはEnterキヌを抌すこずで送信されたしたが、最小限の察話機胜がないため、このようなゲヌムは事実䞊䞍可胜になりたした以前に入力した文字を削陀するのは特に䞍䟿でした。



考え盎すこずなく、私はパテず...を䜿甚しお同じサヌバヌに接続しおみるこずにしたした... うわヌ  入力した文字が衚瀺されたす



telnet.exeで゚コヌが機胜しないのはなぜですか これを修正する方法はありたすか それを理解したしょう。



プロセスがどのように進んだか、そしおその結果は、カットの䞋で読みたした。 この蚘事を読む前に、以前の蚘事をよく理解しおおくこずを匷くお勧めしたす。 ここでは省略された倚くの点に぀いお既に説明しおいたす。



最初のステップは、件名を取埗するこずです。 telnetクラむアントをむンストヌルしWin-R-> appwiz.cpl-> Windowsの機胜をオンたたはオフにする->「Telnetクラむアント」の碑文の暪にチェックマヌクを付け、「OK」ボタンをクリックしたす、実行可胜なtelnet.exeファむルを「 WINDIR\ System32 "他のディレクトリに。



次のステップは、必芁なツヌルを準備するこずです。 PE ToolsずOllyDbgをダりンロヌドしたす 。これは以前の蚘事で䜕床も蚀及したしたが、䟿利なディレクトリに展開しおください。



次に、探玢するバむナリに察しおASLRテクノロゞが有効になっおいるかどうかを理解する必芁がありたす。 PEツヌルを起動し、Alt-1を抌しおtelnet.exeを遞択し、「オプションのヘッダヌ」ボタンをクリックしたす。



画像



はい、ASLRは有効です。 それをオフにしたしょう-0x8140を0x8100に眮き換えおそれが以前に説明された理由です-たずえば、 ここを参照 、「OK」ボタンをクリックしたす。



それでは、考えは䜕ですか 私が最初に思い぀いたのは、アプリケヌションがSetAPonsoleMode WinAPI関数を䜿甚しお゚コヌを明瀺的に「無効化」できるこずです。 OllyDbgでバむナリを開始し、モゞュヌル間呌び出しのリストを含むりィンドりを開き、この関数ぞの呌び出しがアプリケヌションに実際に存圚するこずを確認したす。



画像



それらにブレヌクを眮き、F9を抌しお、ブレヌクポむントの1぀で停止したす。



画像



スタックりィンドりの匕数を芋おみたしょう。



画像



ドキュメントを読む



ENABLE_ECHO_INPUT

0x0004



ReadFile関数たたはReadConsole関数によっお読み取られた文字は、読み取られるずきにアクティブな画面バッファヌに曞き蟌たれたす。 このモヌドは、ENABLE_LINE_INPUTモヌドも有効になっおいる堎合にのみ䜿甚できたす


必芁なもの ただし、もっず簡単な方法がありたす-この関数を呌び出さないでください



コン゜ヌルが䜜成されるず、ENABLE_WINDOW_INPUTを陀くすべおの入力モヌドがデフォルトで有効になりたす


デバッグを再開したしょう、呌び出しを停止したす



画像



゚コヌが動䜜するかどうかを確認しおください。 いいえ、結果は以前ず同じです-入力した文字はコン゜ヌル画面に衚瀺されたせん。



さお、ゲヌムが名前の入力を芁求する瞬間を埅ちたしょう



画像



、およびOllyDbgでF12䞀時停止を抌したす。



私たちが今どこにいるかを理解するために呚りを芋回すこずをお勧めしたす。 開始するには、Alt-Kを抌しおコヌルスタックを開きたす。



画像



そのため、user32.dllの腞内のどこかにハングアップしたす。 user32.dllに到達した堎所から、 0x0100D0D0にある最も近い「ナヌザヌ」コヌド぀たり、telnetモゞュヌルに属するコヌドにゞャンプしたす。



画像



経隓豊富なWindows開発者は、遞択された呜什GetMessageの実行時にEDIレゞスタで最も可胜性の高い関数アドレスをすでに理解しおいる必芁がありたす。 しかし、これを個人的に確認したしょう。 このアドレスにブレヌクを眮き、デバッグを再開し、目的の堎所に到達するたでF9を抌したす。



画像



ご芧のずおり、これは実際にはGetMessageです。 この堎合の問題は、この関数がEnterキヌを抌す前に呌び出したコヌドに制埡を戻さないこずです。぀たり、゚コヌずはたったく関係ありたせん。



次に、この時点で他のスレッドが䜕をしおいるのかを芋おみたしょうもちろん、存圚する堎合。 再床、F9を䜿甚しおプログラムを実行し、F12を抌しお「スレッド」りィンドりを開きたす衚瀺->スレッド



画像



赀で匷調衚瀺されおいるこれは今芋たばかりの珟圚のスレッドです以倖は、それぞれをCPUりィンドりで開きスレッド-> CPUりィンドりで察応する行を右クリック、呌び出しスタックを確認したす。 次の呌び出しスタックを䜿甚しおスレッドに泚意を向ける必芁がありたす。



画像



ReadConsoleInputは、このケヌスではすでにより興味深い関数です。 呌び出しにブレヌクポむントを蚭定し、デバッグを再開し、... telnetりィンドりにフォヌカスを移動するたびに停止したす。



画像



近くにスむッチがあるこずに泚意しおください。ほずんどの堎合、察応するむベントのハンドラヌにゞャンプしたす。 デバッガで実行した埌、フォヌカスが倉曎された堎合、制埡がデフォルトのケヌスに移されるこずがわかりたす。



画像



OllyDbgによるコヌドの分析から刀断するず、ここには倚くのオプションはありたせん-デフォルトのケヌスに加えお、ケヌス10および1もありたす。最初のケヌスでは、いく぀かの呜什を実行した埌、考慮したデフォルトのケヌスにゞャンプしたす。 ReadConsoleInput関数の呌び出しからブレヌクを削陀しお、ケヌス1にブレヌクを入れおみたしょう。



画像



デバッグを再開し、名前の入力を求めるメッセヌゞが衚瀺されるのを埅ち、「1」を抌しお、このたさにケヌスブロックで停止したす。



画像



今䜕ができたすか これで、bat.org、たずえばsmtp.gmail.comに接続した堎合のtelnet.exeの動䜜を確認できるようになりたした。思い出すず、゚コヌは正しく機胜しおいたした。 「トレヌスの実行」りィンドりを開き衚瀺->トレヌスの実行、右クリックしお、「ファむルにログ」ずいうメニュヌ項目を遞択し、ファむル名を遞択しおCtrl-F11トレヌスむンを抌したす。 トレヌス埌、ファむルを閉じ「トレヌスの実行」りィンドりを右クリック->ログファむルを閉じる、smtp.gmail.com25の堎合も同じこずを行いたすtelnetポヌトを明瀺的に指定する堎合は、IPアドレスをスペヌス文字を䜿甚したす。぀たり、コマンドは「telnet.exe smtp.gmail.com 25」のようになりたす。



動䜜の顕著な違いは、アドレス0x0100A2F9から始たりたす。



bat.orgの堎合

アドレススレッドコマンド。 登録ずコメント
 0100AB9F 00002EA0 JNZ telnet。0100AED2
 0100ABA5 00002EA0テストバむトPTR SS[EBP-24]、3
 0100ABA9 00002EA0 JE telnet。0100AED2
 [...]
 0100A2F7 00002EA0テストEAX、EAX
 0100A2F9 00002EA0 JNZショヌトtelnet。0100A304
 0100A2FB 00002EA0テストバむトPTR DS[1010740]、10
 [...]


smtp.gmail.comの堎合

アドレススレッドコマンド。 登録ずコメント
 0100AB9F 00002EA0 JNZ telnet。0100AED2
 0100ABA5 00002EA0テストバむトPTR SS[EBP-24]、3
 0100ABA9 00002EA0 JE telnet。0100AED2
 [...]
 0100A2F7 000031D4テストEAX、EAX
 0100A2F9 000031D4 JNZショヌトtelnet。0100A304
 0100A304 000031D4 PUSH EDI;  Arg4 = 01024CA0
 [...]




telnet.exeがbat.orgず通信する堎合、0x0100A304ぞのゞャンプは実行されたせん。 0x0100A2F9の呜什から無条件にゞャンプしおみたしょう。 デバッグを再開し、telnetモゞュヌルに移動しおCtrl-Gを抌し、衚瀺されたりィンドりにアドレス0x0100A2F9を入力し、Enterを抌したす。 スペヌスバヌを抌しお、 JNZ呜什をJMPに眮き換えたす。



画像



F9キヌを抌し、Telnetりィンドりに「1」を入力しお、提案されたオプションのいずれかを遞択するか、名前を入力しおください。入力した蚘号が衚瀺されたす。



画像



デバッガで実行するず、 SetConsoleCursorPositionやWriteConsoleOutputCharacterなどのWinAPI関数の呌び出しが行われるコヌドブランチに入るこずがわかりたす。



画像



ではなぜ早くここに来なかったのですか ゞャンプに぀いおの決定が䜕に䟝存しおいるか芋おみたしょう



画像



TEST EAX、EAX操䜜の結果に䟝存し、前のスクリヌンショットに芋られるように、倀はアドレス0x01010754からEAXレゞスタヌに萜ちたした。 さお、bat.orgの堎合にれロであった理由を理解しおみたしょう。



調べるために、アドレス0x01010754にハヌドりェアブレヌクレコヌドを眮くこずを提案したす。 それにゞャンプするには、 0x0100A2BDにある呜什を右クリック->ダンプでフォロヌ->メモリアドレス



画像



指定されたアドレスの最初のバむトを右クリック->ブレヌクポむント->ハヌドりェア、曞き蟌み-> Dword。 デバッグを再開し、れロが含たれるずきにアドレス0x01010754ぞの最埌の呌び出しを芋぀けたす。 このアピヌルはこちらです



画像



呌び出しスタックを芋お、ここで呌び出された堎所からプロシヌゞャにゞャンプするず、受信デヌタの埌続の分析を䌎うrecv関数の呌び出しが衚瀺されたす。



画像



定数0xFFに泚意しおください。 telnet 仕様によるず、このバむトに続くのは、このプロトコルで䜿甚されるコマンドです。



   以䞋は、定矩されたTELNETコマンドです。 これらのコヌドに泚意しおください
   たた、コヌドシヌケンスは、すぐに指定された意味を持ちたす
    IACが先行したす。

      名前コヌドの意味

       SE 240サブネゎシ゚ヌションパラメヌタの終わり。
       NOP 241操䜜なし。
      デヌタマヌク242同期のデヌタストリヌム郚分。
                                 これは垞に䌎うべきです
                                  TCP緊急通知による。
       243 NVTキャラクタヌBRKを解陀したす。
      割り蟌みプロセス244機胜IP。
      出力の䞭止245関数AO。
       Are You There 246関数AYT。
      文字247の消去関数EC。
      消去行248関数EL。
      先に行く249 GAシグナル。
       SB 250埌に続くものが
                                 瀺されたの副亀枉
                                 オプション。
       WILLオプションコヌド251開始を垌望するこずを瀺したす
                                 実行、たたは確認
                                 あなたは今挔奏しおいたす
                                 瀺されたオプション。
       WO N'Tオプションコヌド252実行の拒吊を瀺したす。
                                 たたは実行を続けるず、
                                 瀺されたオプション。
       DOオプションコヌド253
                                 盞手が実行する、たたは
                                 あなたが期埅しおいるこずの確認
                                 実行する盞手、
                                 瀺されたオプション。
       DO N'Tオプションコヌド254
                                 盞手のパフォヌマンスの停止、
                                 たたはあなたがいないこずの確認
                                 盞手を長く期埅しおいる
                                 実行するには、瀺されたオプション。
       IAC 255デヌタバむト255。




スタックを芋るず、「進む」ずいうコマンドを瀺すバむトシヌケンス0xFF 0xF9に盎面しおいるこずがわかりたす。 それに関しおは、Microsoft Webサむトで次のこずが報告されおいたす。



元のTelnet実装は、デフォルトで半二重動䜜に蚭定されおいたした。 ぀たり、デヌタトラフィックは䞀床に䞀方向にしか送信できず、䞀方向のトラフィックの終わりを瀺すために特定のアクションが必芁であり、トラフィックはもう䞀方の方向に開始される可胜性がありたす。 [これは、アマチュア無線およびCB無線オペレヌタヌによる「ロガヌ」および「オヌバヌ」の䜿甚に䌌おいたす。具䜓的なアクションは、デヌタストリヌムにGA文字を含めるこずです。


䜕らかの理由で、Microsoft telnetクラむアントの実装では、このコマンドは0x01010754の内容をれロ以倖の倀に戻すこずなく゚コヌに圱響したす。



これを確認するには、Pythonで小さなサヌバヌを䜜成したす。



import socket, threading s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 1900)) s.listen(1) class daemon(threading.Thread): def __init__(self, (socket, address)): threading.Thread.__init__(self) self.socket = socket self.address = address def run(self): self.socket.send('Greetings!') while True: data = self.socket.recv(1024) if data[0] == '1': data = 'Response' elif data[0] == '2': data = bytearray() data.append(0xFF) data.append(0xF9) self.socket.send(data); self.socket.close() while True: daemon(s.accept()).start()
      
      





このサヌバヌを起動し、コマンド「telnet.exe 127.0.0.1 1900」を䜿甚しお接続するず、コマンド「2」に察する答えが埗られるたで゚コヌが正確に機胜するこずがわかりたす。



ご挚拶1Response1Response1Response1Response2ResponseResponseResponseResponseResponseResponse


しかし、それだけではありたせん 実際、他のチヌムも同様の動䜜をしおいたす。 たずえば、「操䜜なし」を瀺す0xFF 0xF1のバむトシヌケンスは、Telnetクラむアントの゚コヌを完党に「無効」にしたす。



バグ 機胜 圌を知っおいる人。 䞻なこずは、telnet.exeにMUDで正しいゲヌムを教えたこずです



あずがき



もちろん、解決策はただ完党ではありたせん。 たずえば、Backspaceキヌを抌しおも、カヌ゜ルの前の文字は削陀されたせんただし、ナヌザヌが入力したコマンドの「内郚」衚珟は予想どおりに倉曎されたす。 はい、これは単なる矎容䞊の瞬間であり、我慢するこずができたすが、この蚘事を始めたのは矎容䞊の䞍䟿さでしたよね



ご枅聎ありがずうございたした。たた、この蚘事が誰かに圹立぀こずを願っおいたす。



All Articles