2023/07/17
第29週: 日月火水木金土
2023年 54.25%経過
今日のn年前
2022/07/17
2021/07/17
t6o_o6t.icon
大学と趣味の使い分けが破綻してきた
多分大学の方を極力薄くすると良い
今までの活動は趣味が起点だったから、学生として活動しようとするとちぐはぐになる
GitHubを新しく作ることも検討
大学と、大学以外で切り分ける
趣味→大学は見えるが大学→趣味は見えないようにする
理解できた
1. 1つめのstrlenのGOTを書き換える
これは、strlenという関数が、別のアドレスを指すように書き換えるということだろう
2. 次の
わかっていなかったこと
標準入力に2行与えると1行ずつ使う
普段のことを考えれば当然だったが、
なぜ/bin/shと書くのか
例えばこれをlsに変えると、一度lsが実行されて終わる
strlen -> system に書き換えられている状況
system関数は、コマンドを受け取って実行する
$ man system
lsの場合
lsを一度実行して終了
/bin/shの場合
/bin/shが別途起動するので、自由にコマンドを実行可能
なぜcatが必要か
例えばこれをlsに変えると
code:ls.txt
/bin/sh: 1: fsb: not found
/bin/sh: 2: fsb.c: not found
/bin/sh: 3: got: not found
/bin/sh: 4: got.c: not found
/bin/sh: 5: hello.txt: not found
/bin/sh: 6: peda-session-fsb.txt: not found
/bin/sh: 7: peda-session-got.txt: not found
/bin/sh: 8: result.txt: not found
32512
というような出力になる
この出力はなにか
shの挙動の確認
code:sh_1.txt
$ /bin/sh # 起動
$ fsb
/bin/sh: 1: fsb: not found
$ fsb
/bin/sh: 2: fsb: not found
内部の動作を推測
code:sh_2.txt
$ /bin/sh
fsb
fsb.c
got
got.c
...
catは、空白区切りで標準入力を受け取る
ファイル名が1行ずつ出力される
/bin/shは、catの行った出力をそれぞれ標準入力として受け取る
理解できた
catを使う理由
この入力が、書き手が何をしたいのかをよく表している
$ (echo -e '\x1c\xa0\x04\x08\x1e\xa0\x04\x08%51112x%7$hn%12308x%8$hn\n/bin/sh' ; cat) | ./got
1. /bin/shを起動する
1. 1回目の標準入力
\nまでの文字列が./gotに与えられる
\x1c\xa0\x04\x08\x1e\xa0\x04\x08%51112x%7$hn%12308x%8$hn
2. printfの書式文字列攻撃で、strlenをsystemに書き換え
3. 2回目の標準入力
このときは/bin/shが入力される
4. printfの実行
このときstrlenが呼び出される
strlenはsystemを指すように書き換えられており、system関数が呼び出される
引数の内容は3.で与えられた/bin/sh
2. catの実行
重要なのは、catは繰り返し標準入力を読み取って標準出力すること
echoによる標準出力が全てパイプに流れたあと、どうなるか
catによる標準出力がパイプに流れ始める
https://scrapbox.io/files/64b51023b35e15001be71f90.png
こうなる
1個目のprintfでstrlenをsystemに変えて、次の入力は間接的にsystemコマンドに渡される
そうして/bin/shが実行され、echoの実行は終了
以降は、ユーザーの入力をcatが出力してその度に./got内の/bin/sh内に渡されるという状態。
includeがディレクティブとして設計されているの、多分意味が違うからだ
コンパイル時
ヘッダーファイルから、関数の呼び出しが正しいことを検証する
コードは.text内に
この時点では再配置可能
リンク時
静的リンクの場合
インクルード先をそのまま取り込む
pltセクションにコードを書き込む
再配置を完了する
動的リンクの場合
インクルード先のパスを書き込む
再配置を完了する
Cのincludeは「〇〇を読み込む」という意味ではない
プリプロセッサがそれを展開するという意味
2023/07/16←2023/07/17→2023/07/18