今日はlevel10を解きます。

hintを見ると

二人の使用者が会話ルームを利用して会話をしている。

その会話ルームは共有メモリを利用して作られてるし、key_tの値は

7530だ。これを利用して二人の会話を盗聴してlevel11の権限を得てください

と書いてあります。

find命令語で探しても、何も出てこなかったので、systemが起動されるとき、

自動的に起動されるようになっていないかなと思ってrc.localをみたら

やはり、ありました!

けど。。rootの所有だったのでprogramディレクトリには入れなかったです。

では、hintで出てることだけで、問題を解くしかないですね。

共有メモリ。。初めて聞いたので、色んなところを検索しながら、勉強しました。

この問題を解くためにはshmgetとshmat関数を利用します。

メモリの内容を覗く?ためにはメモリの住所が必要です。

メモリの住所はshmat関数の戻り値です。

shmat関数にはメモリ識別子が必要です。

識別子はshmget関数の戻り値です。

shmget関数にはkey_tの値が必要です。(既に作られている場合、今回はもう作られているので)

key_tの値はhintファイルに書いてありました。

なので、早速攻撃してみましょう。

上記のように必要なことだけ簡単に書いて、コンパイルして実行してみると

はい!でました!

私も、今回の問題で共有メモリのことを知りました。

 

 

 

 

今日はlevel9を解きます。

やっとBOFの問題がでました。

では、早速解きます。

hintファイルをみると

次は/usr/bin/bofのソースコードだ。

これを利用してlevel10の権限を獲得してくださいと書いてあります。

fgets関数を利用して、bufに入力しますが、ここでbofが起きますね。

そしてbuf2の前の2文字がgoという文字だったら次のレベルのシェールが

獲得できます。つまり、bofを利用してbuf2のところに正確な値を入れてという事ですね。

bof技法?を使うためには、変数がメモリにどう配置されるか、各変数に実際にはどのくらいメモリの空間が割り当てられるのか、についてしらなきゃいけないです。

まず、hintに書いてあるbuf[10]とbuf2[10]だと、char形式なので、

bufとbuf2変数は各10byteづつ割り当てられて、連続てきに並んでるんじゃない?

(bufの住所が0x0だったらbuf2の住所は10byte離れた0x10じゃない?)

と考えられますが、実際に見てみるためにtest用のソースコードを書いて、実験してみました。

こういうに各変数を作ってその住所と距離を出力するようにしました。

お。。実際に見ると変数間の距離が想像とは違いますね。

これは。。色々調べましたが、ある方はgcc2.96以上のバージョンでは

変数の間にゴミ値の空間ができると書いてありましたが、ある方は変数がメモリ空間を

割り当てられる時、各OSやパソコンの環境によって違うと書いてました。

ん。。。どっちが正解かは私も分かりません。。もっと調べながら勉強します。

一応分かるのは変数間の距離が想像とは違う事でした。

なので、今回のサーバー環境ではどのくらいの

メモリの空間が割り当てられるのかを調べるためにhintと同じ大きさの

変数を作って実際に見てみました。

簡単に書いて、gccでコンパイルした後、実行してみると

AとBの距離は10進数で16です!

では、実際に攻撃をしてみましょう。

おおーlevel10のシェールを獲得できました!!

今回のことで、実際にメモリの空間が割り当てられる時は変数のサイズとは

ちょっと違う!ということが勉強できました。

今日はlevel8を解きます。

hintをみると

level9のshadowファイルがサーバーのどこかに隠れている。

そのファイルについて、知られてるのは容量が2700だと。。

なので、早速、find命令語で探してみました。

-sizeの後ろに

bはブロック(512byte)

kはkbyte

cはbyte

wは2byte

単位を付けないとデフォルトでbが付きます。

それで、kとwでは出なかったのですが、cを付けたらfound.txtという怪しいファイルが

出てました!

catでみるとHashアルゴリズムで暗号化された文字列がでてます。

これは?!ずっと前にアップロードしてたパスワードクラックツールのJohn the Ripperを

使えばわかりますね。

こういう風にtxtファイルに貼り付けてjohnさんのところに持って行ったら?!

はい!!level9のパスワードが出ました!

今回は短すぎかな。。wwww

 

 

今日はlevel7を解きます。

まず、ログインしてhintをみると

ん。。。

1.パスワードは近いところに。。

2.想像力を発揮しなさい

3.2進数を10進数に変換できる?

4.計算機設定を工学用に変えて

お~~何ですかねwww

/bin/level7を実行してみましょう!!

パスワードは分からないので適当に入れたら下の方に何かが。。??

hintに書いてあった2進数を10進数。。。

あれが2進数だったら

1101101 1100001 1110100 1100101

これを10進数に変えたら??

109 97 116 101です!!

また、これをアスキーコード表をみて変えたら??

mateという文字になります。

ほぉ。。あってますね!!www

今回は簡単?!ですね

なので、またgdbで分析をしてみましょう~

では!!みましょ~!

まず、最初0x64をstackにpushしてmalloc関数を呼び出します。

つまりmalloc(0x64)というコードが実行されて、heap領域に100バイト分の空間を

確保します。

その後、Insert The Password :という文字列をstackにpushして

printf関数を呼び出し、画面に出力します。

その後、0x8049744、0x64、ebp-4をstackにpushしてfgets関数を呼び出します。

0x8049744はstdin(標準入力)

0x64は10進数で100

ebp-4はmalloc関数で100バイトの空間を確保したポインターでしょう

つまり

char *input;

input=(char *)malloc(0x64);

ここでinputがebp-4です。

次はstrncmp関数でinputと0x80485d7を4バイト(4文字)比較します。

はい!0x80485d7はパスワードです!

比較して、正解だったら

Congratulation~~~という文字列が出力されます!!

今日はlevel6を解きますー!

同じく前獲得したlevel6のパスワードでログインします。

いきなり、こういう画面がでました。

hintはインフォショップbbsのtelnet接続メニューでよく使われたハッキング方法です。

と書かれています。

私はまだ、89年生まれなので。。分からないです。。それでgoogle先生に

聞いても、よくわからなかったです。。

一応エンターキーを押したら

こういう画面が。。接続したいbbsを選択してくださいと。。。

????????????????????????????????????????????????????????????????????????????

今回はさっぱり分からなくて、色々検索したり、本をみたりしました。

回答は!シグナルに関係がある問題でした!!

それでシグナルに関して、勉強も少ししました!

シグナル=信号!!

linuxではkillコマンドでシグナルを送ります!linuxを使ったことある方は知ってますよね!

windowsでもタスクマネージャーでプロセスを強制終了する時シグナルを

送ります。

それがCUIがGUIかだけの差だとgoogle先生が教えてくれました!

 

それで、一番最初のhintが出力される時ctrl+cを押すとlevel6の

シェールが現れます。

ここでpasswordファイルの中身をみると。。次のパスワードがでます

ははははは。。。。。ん。。。何か物足りないですね。。

なのでgdbで分析をしてみました。

お。。今回はちょっと長いですねwww

一番上から見ていきましょうー!

まず何かをpushそてsystem関数を呼び出します。

それは”cat hint”ですね!!

だから、ログインしたらすぐhintの内容が見えたのですね!

次は、キャプチャー撮るを忘れましたがgetchar関数で一文字を

入力されます。

 

その後”clear”をpushしてsystem関数を呼び出します。

 

clearした後は次のprintf文達で上の画面のように(#########なんちゃら~)

何かのサービス達を出力します!!

 

そして、signal関数を呼び出します。

signal(2、sig_func)こういう形ですね。

つまり、ctrl+cシグナルが入力されるとsig_funcが実行されます。

それで、sig_func関数を見てみると、ctrl+cが入力されると

Can't use ctrl+cという文字列を出力します!

→2番はSIGINTです!interrupt!これです!

日本語では割り込みだとgoogle先生が翻訳してくれました。

実行されてる処理を一時的に中断する!ということで。。。ww

 

そして、上で見てた、1,2,3番のサービス番号を入力されます。

scanfは引数が二つですね!scanf(”%d”、&buf)こういう形なのでpushを二回します。

二回というか。。二つをpushしますね!

 

これの下はif文で1か2か3かを判断し、それぞれのIPアドレスに接続をして

終了するものです!!

それでパスワードは

これでーす!!