現在完了というのはそもそも、矢印のようなイメージがあります。過去というのを支点にして、現在まで続いているようなイメージです。
過去形は過去の一点を指します。(具体的に)
例えば、昨日だとか、2日前だとか、三年前だとか。
なので過去形では yesterday や ago が使えるんです。
しかし、現在完了では過去の一点ではなく、過去から続いている矢印のようなものなので、そういった表現は使えないことになっています。
具体的なlast night などもそうです。
なぜbeforeが正解かというと、beforeは具体的に過去の一点を指していないので 現在完了でも使えます。
分かりづらかったらお気軽に教えてください!