ダウンロードしたファイルをfileコマンドでファイルタイプを確認します。Consul
100
Bernie Sanders 2018
author's irc nick: mxms
Linuxの64bitバイナリです。次にobjdumpコマンドでこのバイナリを逆アセンブルします。$ file consulconsul: 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
$ objdump -s -D consul > aaa.txt
<_start>関数から<main>関数が呼び出されています。
<main>関数の中では、Poor Bernieという文字列を出力しているだけです。0000000000400540 <_start>:400540: 31 ed xor %ebp,%ebp400542: 49 89 d1 mov %rdx,%r9400545: 5e pop %rsi400546: 48 89 e2 mov %rsp,%rdx400549: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp40054d: 50 push %rax40054e: 54 push %rsp40054f: 49 c7 c0 60 0b 40 00 mov $0x400b60,%r8400556: 48 c7 c1 70 0b 40 00 mov $0x400b70,%rcx40055d: 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
逆アセンブルされたソースを眺めてみると、<help>、<real_help>、<fake_help>、<dont_call_me>という意味深な名前の関数があります。<_start>関数の中で<main>を呼び出している箇所を書き換えて、<real_help>関数を呼び出すように修正してみます。修正したファイルを実行すると、下記のような文字列が出力されました。0000000000400b3d <main>:400b3d: 55 push %rbp400b3e: 48 89 e5 mov %rsp,%rbp400b41: 48 83 ec 10 sub $0x10,%rsp400b45: 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 Bernie400b51: e8 8a f9 ff ff callq 4004e0 <puts@plt>400b56: b8 00 00 00 00 mov $0x0,%eax400b5b: c9 leaveq400b5c: c3 retq
下記が<real_help>関数の内容です。0x6012a0のメモリ内容が<sub_43E8>関数の処理により、上記文字列に変換されています。$ ./consul_2Leonardo De Pisa? Who's that?The next president?
0000000000400ad9 <real_help>:400ad9: 55 push %rbp400ada: 48 89 e5 mov %rsp,%rbp400add: 48 83 ec 10 sub $0x10,%rsp400ae1: be 0d 00 00 00 mov $0xd,%esi400ae6: bf a0 12 60 00 mov $0x6012a0,%edi400aeb: 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),%rax400af8: 48 89 c6 mov %rax,%rsi400afb: bf 0c 0c 40 00 mov $0x400c0c,%edi #%s400b00: b8 00 00 00 00 mov $0x0,%eax400b05: e8 f6 f9 ff ff callq 400500 <printf@plt>400b0a: b8 00 00 00 00 mov $0x0,%eax400b0f: e8 db fd ff ff callq 4008ef <c2>400b14: c9 leaveq400b15: c3 retq
ここで、0x6012a0周辺のメモリの内容を良く見てみます。
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!}