ksnctf 4 Villager A 300pt

#問題

https://ksnctf.sweetduet.info/problem/4

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/54e1d011-d48d-173d-1af4-0c13704b119a.png)

#解いてみた

- アクセスしてみます。
    - ここではTeraTerm使いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/38066368-624a-ed7c-46dc-a1f8a8a060ac.png)

- flagあるじゃないですか！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e2be89e7-a10d-451c-5bae-d44d7f3118d6.png)

- 権限がないとのことです。がっつきすぎてファイル名間違えましたし、ふんだりけったりです。
- readme.txt読んでみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a3e92f59-8bb5-08b3-dc41-4390836ff8f9.png)

- なんとなく意味は分かりますが、英語は得意ではないので一応翻訳しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3c9daebd-d7c0-3d1f-0986-42a3ee2bb89d.png)

- /tmpも一応見ておきますか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/bec76bd1-0ca2-264b-dce4-893f7611c486.png)

- 一時ディレクトリとして使えるのかと思ったら使えませんでしたよ。
- もとに戻ってq4ファイルを調べるしかないですね。
- たぶん流れ的に実行ファイルだと思いますが、一応確認しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b9a7e017-1efc-bf1f-e0c7-48596e517d88.png)

- 実行ファイルですね。
- ということはq4を実行してそこからflag.txtを見るという流れでしょうか。
- 実行してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/788763b8-e530-80ae-f60e-b654f1b3c7a4.png)

- んー。この関門を突破する必要があるのか。
- 難読化されてなければstringsコマンドでいけるはずなのでやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/65b6baa4-861b-ae1b-7a2d-d10ef245d2a1.png)

- 最後にflag.txtって書かれているので呼び出しそうな雰囲気は満載ですが、肝心のキーワードはなさそうです。
- 次は逆アセンブルしてみますか。
    - objdump -d -M intel ./q4

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2ac94e71-889c-8c5e-b32c-46872360ab68.png)

- 当然のことながら大量に出てくるので、あたりをつけるためにgrep fopen やってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/dd54bd27-2616-7c21-8336-9a4b1456186a.png)

- 一か所でホッとしました。
- きっとここでflag.txtを開いているんだと思います。
- なのでこのちょっと前あたりを確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5fcabeb5-4b53-2f89-f6fe-558d6807801a.png)

- fopenの周辺を見てみると少し前でjneとかしてるので、if文で何らかの制御をしているんでしょう。
- 処理をワープと言ったら書式文字列攻撃ですかね。
- そもそもこれに通用するのか確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a6ebd05b-5729-8140-2e2c-434794c1cb93.png)

- できそうです。
- 入力した文字が何番目に表示されるかもチェックしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/31b95ecb-1146-6f27-c9ac-4183efbb79a2.png)

- 6番目に表示されることがわかりました。
    - aはアスキーコード16進数で61です。
- fopenをやっている80486a0の少し前のjne（804868f）を突破したあとの8048691にワープできればいいのでもう少し見る必要があります。
- もう一度オブジェクトダンプ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e643bf95-9c3e-86c4-2fdc-981b42350c9e.png)

- mainを最初から見ていくと、改行を出力しているところがいい感じな気がします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c81c183b-1b90-652f-be1f-c9defac03b1d.png)


- ここです。
- この関数の呼び出し先を見ると以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6056158f-02ea-38e8-3ff2-6395a9c0b4dd.png)

- 8048474で0x80499e0を呼び出しているのでここを書き換えて8048691の処理をするようにすればfopenにたどり着けそうです。
- まずは、0x80499e0を指定しましょう。
    - リトルエンディアンに気を付けましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ab161549-0bd7-99cf-8dbc-d10d23227e8a.png)

- 6番目に0x80499e0が入りました。
- さて、そして入力したい数値0x8048691を10進数に変換した数値134514321を入力する。
    - echo -e "\xe0\x99\x04\x08%134514321x%6\$n" | ./q4

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/112b82cb-c086-31c9-29cb-6784d98a0a92.png)

- んー、ダメでした。
- まさか見当違いかと思いましたが、ちょっと考えると、最初にアドレスの4文字分はすでに書かれているので、10進数の134514321から4を引いた134514317にしなければなりませんでした。
- 直してもう一度やってみます。
    - echo -e "\xe0\x99\x04\x08%134514317x%6\$n" | ./q4


![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/58017566-17e1-6898-0f29-11ab3eb4e599.png)

- やったぜ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/af19c783-950e-4036-f344-03cbce4d0c66.png)