char s1[100];
int i = 0;
while ((s1[i++] = *errmsg++) != '¥0');

errmsgに終端文字がある前提で、
errmsgのサイズが100よりも大きい場合、配列要素外への書込みになるから、そこで実行時エラーが発生してプログラム止まるんじゃないの?
攻撃できないじゃん。

設問3(1)は攻撃の話ではなく、単純なBOFに関して排除できないと言っているのかな。