func-array - AlpacaHack

TL;DR

ソースを読む

問題のコードは以下である。

void win() {
	asm volatile("mov $0,%spl");
	puts("You Win! 🦙🦙🦙🦙🦙");
	system("/bin/sh");
	exit(0);
}

void vuln() {
	void (*alpaca_functions[3])() = {
		alpaca_function0,
		alpaca_function1,
		alpaca_function2};

	unsigned int choice;
	printf("Select an alpaca function index: ");
	scanf("%u", &choice);

	alpaca_functions[choice]();

	exit(0);
}

int main() {
	setvbuf(stdin, NULL, _IONBF, 0);
	setvbuf(stdout, NULL, _IONBF, 0);

	vuln();

	win();

	return 0;
}

choice はとくに入力する値の範囲に制約がないので、choice = 5 などを入れると配列の外を参照する(Cなので問題なく進む)。こうするとスタック上の隣の値を関数ポインタとして呼び出すことになるので、これを上手く使って win() を呼びたい。

細かく

実験として 1 とか 2 とか近い適当な数字を打ってもいいが、ちゃんと動き方を確認することにする。

1. アセンブリでアドレス計算を確認する

vuln() を disassemble すると

objdump -d -Mintel ./chal