# 11/3 低レイヤ 勉強会
---
## 事務連絡
### 活動時間について
10月活動してみて、私(小俣)のキャパシティ的に週2回勉強会の準備をするのは大変だったので、
勝手ながら
- 水曜3限:CTF勉強会(全員参加)
- 1コマ(時間未定):OS勉強会(2年生のみ)
で進めていきたいと考えています。
### 来週について
来週 11/11はセンターで活動します
## One-gadget RCE について
基本配布した参考書を使って読み合わせる感じで進めていきます。
ただ、ここからの内容は、メモリの値など、環境によって出力される値が異なる場面が多くみられ、テキストの文を自分で読み替えること必要になってくるので、ここではヒントを書いていきます。
コマンドを打ったら、スクショやメモを取る習慣をつけていきましょう
### one-gadget RCEの検索プログラム
```test.sh
sudo apt -y install ruby
sudo gem install one_gadget
```
### libc について
printf(),fopen(),fread()... など
「よく使われるC言語関数」がまとめられてライブラリとなったもの
#include <stdio.h>のように読み込んで使ってるアレ
### 4.2 one_gadget で One-gadget RCE のアドレスを検索
```test.sh
$ one_gadget /lib/x86_64-linux-gnu/libc.so.6
//以下の値は環境によって異なります。
//各自の出力結果を、メモするなりして使うようにしてください
0xcbdda execve("/bin/sh", r12, r13)
constraints:
[r12] == NULL || r12 == NULL
[r13] == NULL || r13 == NULL
0xcbddd execve("/bin/sh", r12, rdx)
constraints:
[r12] == NULL || r12 == NULL
[rdx] == NULL || rdx == NULL
// ここが重要!! -------------------------
0xcbde0 execve("/bin/sh", rsi, rdx)
constraints:
[rsi] == NULL || rsi == NULL
[rdx] == NULL || rdx == NULL
// -------------------------------------
```
### libc ライブラリが配置されるアドレスの調べ方
```test.sh
$ sudo sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0
$ echo "int main(){}" | gcc -x c - -o rce_test
$ LD_TRACE_LOADED_OBJECTS=1 ./rce_test
linux-vdso.so.1 (0x00007ffff7fd0000)
// libc が配置されるアドレス。//特に重要!!
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7dfd000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd2000)
```
### シェルを起動するCコード
```test.c
int main() {
void (*rce)(int, int, int) = (void *)([libcが配置されるアドレス]LL + [one_gadget RCE("/bin/sh", rsi, rdx)のアドレス]);
rce(0, 0, 0);
}
```
例:
```test.c
int main(){
void (*rce)(int, int, int) = (void *)(0x00007ffff7dfd000LL + 0xcbde0);
rce(0, 0, 0);
}
```
### 4.3
次のコマンドで表示します:
```a.sh
$ objdump -d -M intel login3 > login3.txt
$ cat login3.txt
```
### libc中のprintfのアドレス
```a.sh
$ gdb login3
gdb-peda$ b *0x40121f
gdb-peda$ r
gdb-peda$ x/1xg 0x404020
0x404020 <printf@got.plt>: 0x0000000000401046
gdb-peda$ ni
gdb-peda$ x/1xg 0x404020
# -----------------------------------------
0x404020 <printf@got.plt>: 0x00007ffff7e2ae10
# (printf 関数を呼び出した後で)アドレス 0x404020 の値を出力して出てくる
# libc 中のprintf 関数のアドレス
# 環境によって変わるのでメモしておきましょう
#------------------------------------------
```
## WSLについて
Windows上で手軽にLinuxを扱えるようにする機能。
GUIはないが、PwnにおいてはGUIはあまり必要なく、その分軽量。
それに加え、ファイルのやり取りなどが仮想マシンに比べて飛躍的に楽になる(Windows上のDiscord,LINEで配布されたファイルをそのまま扱える)。
このような理由で、WSLの利用を推奨したいです。
WSL1とWSL2があり、2は1より限りなく挙動がLinuxに近づくが、他の仮想機能(VirtualBox等)のパフォーマンスが若干劣化する(動作は確認済み)。またWindows10 Ver.1903 以上,VirtualBox 6 以上が必要

Malleus Pwn の著者はWSL 1を使っており、互換性や性能の観点から、使っても問題ないと思われるので、未導入の人がなるべく楽に環境構築を済ませられるようにWSL 1のインストール方法・注意点だけ簡単に載せておきます
1. 以下のコマンドを管理者権限のPowershell で実行
```test.ps1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all
```
2. 再起動
3. Windows ストアから KALI Linux をインストール
4. Kali Linuxを開き、ユーザー名とパスワードを設定
5. 次のスクリプトを実行:
```a.sh
sudo apt -y update
sudo apt -y install gdb python3 python3-pip netcat git ruby build-essential
sudo pip3 install pwntools
sudo gem install one_gadget
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
```
6. explorer.exe . と打ち込み、Linux内のディレクトリがWindows エクスプローラーからみられることを確認。ここからファイルを出し入れできる
## Docker について
コンテナという仕組みを用いた、きわめて軽量な仮想マシン
なるべく問題プログラムは自分のほうから配布していきますが、
問題サーバーを各自で用意したくなった場合、これを使います
**WSL 2が必須です。**
先にPowershellで次のコマンドを打ちます:
```a.ps1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all
```
https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe
ここからDockerをダウンロードした後、powershellから
```a.ps1
docker run --rm -it -p 10080:80 -p 10001-10012:10001-10012 kusanok/ctfpwn:2
```
と打ってください
その後
localhost:10080
にアクセスすると問題サイトに飛べます