必要なのは基本だけ
// 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();
}
}
短い入力長での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はまでは確実に可能