Challenge

必要なのは基本だけ

// gcc chal.c -o chal
#include <stdio.h>

char buf[0x10];
void vuln() {
    fgets(buf,sizeof(buf),stdin);
    printf(buf);
}

int main(void) {
    while(1) {
        vuln();
    }
}

Solution

短い入力長でのFSBが何度でもできる問題。

    Arch:       amd64-64-little
    RELRO:      Full RELRO
    Stack:      No canary found
    NX:         NX enabled
    PIE:        PIE enabled
    SHSTK:      Enabled
    IBT:        Enabled
    Stripped:   No

考え方

vulnのretを壊すとFSBを繰り返すのが難しくなる。

→ mainのret addrでROP chainを組み立てたい。

→ PIE有効なのでmain周り、Full RELRO/ASLR有効なのでlibc周りをleakしてbaseを計算する必要がありそう。

leakした後、どうmain のret addrを書き換えるか考える。

→ FSBでよくやるのが書き換え先のアドレスを入力に含めるテクニック

→ 今回はbufがグローバルにあるためスタック上にない

→ leakの中で参照関係にある2つを利用する2段階書き込みを行う

→ 入力長の制限にかかるので参照関係にあるのはスタック内のmain ret addrと近い上位アドレスが一致するものが良い

→ 入力は16byteまでなので%65535c%??$c あたりが通り、2byteはまでは確実に可能