---
# System prepended metadata

title: 低レイヤ勉強会 1月 予習

---

# 低レイヤ勉強会 1月 予習

## 第5章 ROT13 (Malleus P.42)
### はじめに
実行ファイルを開くと
```
Lbh pna fbyir guvf ceboyrz ol sbezng fgevat nggnpx
```
と出てくる。

これを問題名のROT13で復号すると...
(=アルファベットを13文字ずらす)
```
You can solve this problem by format string attack
```
となる。
この内容より、今回の想定解法は**書式文字列攻撃**。

書式文字列を使って、main 関数のリターンアドレスから libc のアドレスをリークし、GOT を
One-gadget RCE に書き換える。

### 問題のソースコード
```5.c
//  gcc rot13.c -o rot13 -no-pie -fcf-protection=none
#include <stdio.h>
#include <unistd.h>

void setup()
{
    alarm(60);
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);
}

int main()
{
    char buf[0x100] = "";
    int i = 0;

    setup();

    fgets(buf, sizeof buf, stdin);

    for (i=0; i<0x100; i++) {
        int d = 0;
        if ('A'<=buf[i] && buf[i]<='M' ||
            'a'<=buf[i] && buf[i]<='m')
            d = +13;
        if ('N'<=buf[i] && buf[i]<='Z' ||
            'n'<=buf[i] && buf[i]<='z')
            d = -13;
        buf[i] += d;
    }

    printf(buf);
    printf("https://en.wikipedia.org/wiki/ROT13\n");
}
```
**これを読み、どこに脆弱性があるか考えてみてください。**
ヒント:基本、外部から受け取った文字列などの情報は信用してはいけない。取り扱う際は十分に注意!

### 新しい用語: Stack Smashing Protection
コンパイラを用いて，**スタックバッファオーバーフロー脆弱性を悪用した攻撃を防ぐ対策技術**．

スタック内のebpレジスタの値格納場所とローカル変数の間に配置した、**canary**と呼ばれる値の書き換えの有無によってスタックバッファオーバーフロー攻撃を検知する．

プログラムの実行中で，関数の呼び出し時にスタックにcanaryを挿入し，関数からリターンする直前に埋め込んだcanaryの値が書き換えられていないかチェックする．
canaryの値が書き換えられていない場合は，通常通り実行が完了するが，スタックバッファオーバーフロー攻撃によってバッファのサイズ以上の入力があり，**canaryの値が書き換えられていた場合は，実行を中止**.

([出典:明治大学情報セキュリティ研究室 バッファオーバーフローへの対策技術入門](https://www.saitolab.org/infra_kaisetsu/)
ここではバッファオーバーフローについても詳しく解説してあるので、まだちょっとあやふやな人は読んでみてください)

> 余談:Canary = カナリアという名前は、坑道に有毒ガスが無いかをチェックするためにカナリアを連れて行き、カナリアが死んだら危険な状態になっていると判断して実行を中止...というのがが元ネタのようです。
> ここでも、カナリアが死亡 = canaryが書き換えられた -> プログラムの実行を中止 という感じです。

### Checksec.sh を使ってSSPの有効/無効を確かめる
一応導入方法を再掲しておきます:
```a.sh
$ cd
$ git clone https://github.com/slimm609/checksec.sh
```

使い方は以下の通りです。
**実行ファイルが存在するディレクトリに移動した後、**--file="" の""内に調べたい実行ファイル名を入れてください。

注意: checksecは、パスを通してないので、checksecと打ち込んでも"checksec: command not found"となります。
```a.sh
$ ~/checksec.sh/checksec --file="rot13"
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified      Fortifiable     FILE
Partial RELRO   Canary found      NX enabled    No PIE          No RPATH   No RUNPATH   70) Symbols       No    0     rot13
```
うまくいけば上記の通りに出力され、SSPについては"STACK CANARY"を見るとわかります。
今回は、**"CANARY FOUND"となっているため、SSPは有効**です。

