問題

腐った牛肉を復活させてください!

🦙 < フラグは

flag.txt

にあるパカ

抜粋

int main(void) {
    int key = 0xdead, dummy = 0xdead;
    char buffer[12];
    printf("input > ");
    scanf("%11s", buffer);
    printf("Your input: ");
    printf(buffer, &key, &dummy); // !?
    printf("\\n");
    if(key == 0xbeef){
        printf("key = 0x%x (dummy = 0x%x), ok!\\n", key, dummy);
        printf("Congratulations! spawning shell...\\n");
        execve("/bin/sh", NULL, NULL);
    }
    else{
        printf("key = 0x%x (dummy = 0x%x), try again!\\n", key, dummy);
    }
    return 0;
}

TL;DR

解法

keyの値を0xdeadから0xbeefに変える問題。

コメントで!?とある部分を確認すると、FSBに気づく。

%48879c%1$n を入力として与えれば、

0xbeef(48879)文字分出力(%c)、1番目(1$)の引数に出力文字数書き込み(%n)

となり、keyを書き換えられる。

余談

「詳解セキュリティコンテスト」を読むと分かりやすいはず。

今回は引数の指している場所の書き換えでシンプルだったが、