Consul

100

Bernie Sanders 2018

consul

author's irc nick: mxms

ダウンロードしたファイルをfileコマンドでファイルタイプを確認します。
$ file consul
consul: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=897c070c53ceb5b58080d891a68b96a197816773, not stripped
Linuxの64bitバイナリです。次にobjdumpコマンドでこのバイナリを逆アセンブルします。
$ objdump -s -D consul > aaa.txt
<_start>関数から<main>関数が呼び出されています。
0000000000400540 <_start>:
  400540: 31 ed                 xor    %ebp,%ebp
  400542: 49 89 d1             mov    %rdx,%r9
  400545: 5e                   pop    %rsi
  400546: 48 89 e2             mov    %rsp,%rdx
  400549: 48 83 e4 f0           and    $0xfffffffffffffff0,%rsp
  40054d: 50                   push   %rax
  40054e: 54                   push   %rsp
  40054f: 49 c7 c0 60 0b 40 00 mov    $0x400b60,%r8
  400556: 48 c7 c1 70 0b 40 00 mov    $0x400b70,%rcx
  40055d: 48 c7 c7 3d 0b 40 00 mov    $0x400b3d,%rdi #<main>
  400564: e8 a7 ff ff ff       callq  400510 <__libc_start_main@plt>
  400569: f4                   hlt  
<main>関数の中では、Poor Bernieという文字列を出力しているだけです。
0000000000400b3d <main>:
  400b3d: 55                   push   %rbp
  400b3e: 48 89 e5             mov    %rsp,%rbp
  400b41: 48 83 ec 10           sub    $0x10,%rsp
  400b45: 89 7d fc             mov    %edi,-0x4(%rbp)
  400b48: 48 89 75 f0           mov    %rsi,-0x10(%rbp)
  400b4c: bf 11 0c 40 00       mov    $0x400c11,%edi #Poor Bernie
  400b51: e8 8a f9 ff ff       callq  4004e0 <puts@plt>
  400b56: b8 00 00 00 00       mov    $0x0,%eax
  400b5b: c9                   leaveq 
  400b5c: c3                   retq   
逆アセンブルされたソースを眺めてみると、<help>、<real_help>、<fake_help>、<dont_call_me>という意味深な名前の関数があります。<_start>関数の中で<main>を呼び出している箇所を書き換えて、<real_help>関数を呼び出すように修正してみます。修正したファイルを実行すると、下記のような文字列が出力されました。
$ ./consul_2
Leonardo De Pisa? Who's that?The next president?
下記が<real_help>関数の内容です。0x6012a0のメモリ内容が<sub_43E8>関数の処理により、上記文字列に変換されています。
0000000000400ad9 <real_help>:
  400ad9: 55                   push   %rbp
  400ada: 48 89 e5             mov    %rsp,%rbp
  400add: 48 83 ec 10           sub    $0x10,%rsp
  400ae1: be 0d 00 00 00       mov    $0xd,%esi
  400ae6: bf a0 12 60 00       mov    $0x6012a0,%edi
  400aeb: e8 5c fb ff ff       callq  40064c <sub_43E8>
  400af0: 48 89 45 f8           mov    %rax,-0x8(%rbp)
  400af4: 48 8b 45 f8           mov    -0x8(%rbp),%rax
  400af8: 48 89 c6             mov    %rax,%rsi
  400afb: bf 0c 0c 40 00       mov    $0x400c0c,%edi #%s
  400b00: b8 00 00 00 00       mov    $0x0,%eax
  400b05: e8 f6 f9 ff ff       callq  400500 <printf@plt>
  400b0a: b8 00 00 00 00       mov    $0x0,%eax
  400b0f: e8 db fd ff ff       callq  4008ef <c2>
  400b14: c9                   leaveq 
  400b15: c3                   retq   
ここで、0x6012a0周辺のメモリの内容を良く見てみます。

no title

0x601280の部分が怪しく見えます。
00000000:00601280|26 2c 21 27 3b 37 32 29 34 25 1f 29 2e 1f 22 25|&,!';72)4%.).."%|
00000000:00601290|32 2e 29 25 e1 3d                              |2.)%.=          |
この部分にそれぞれ0x40を加算すると、下記のとおりとなり、これを文字に直すとフラグの形式になります。
66 6C 61 67 7B 77 72 69 74 65 5F 69 6E 5F 62 65 72 6E 69 65 21 7D
フラグは、
flag{write_in_bernie!}
です。
 
アセンブリ言語スタートブック
高田美樹
技術評論社
2015-08-08