Security/reverse engineering
[dreamhack] Secure Mail
KimKwangWoon
2025. 2. 9. 21:52
문제 설명을 확인해보면 6자리의 숫자로 이루어진 보안 메일을 해결하면 Flag를 획득할 수 있을 것으로 예상됨
secure-mail.html 브라우저로 열어서 확인해보면 최대 6자리의 비밀번호를 검증하는 로직으로 구성된 것을 확인할 수 있음
vscode로 secure-mail.html 열어서 코드를 확인해보면 onclick에 존재하는 _0x9a220 function이 존재하는데, 내용은 난독화 되어 있어서 확인이 힘듦
따라서 6자리 숫자로 이루어진 비밀번호 조합을 brute force하여 Flag를 획득하는 방법으로 진행함
(function bruteForceBirthdayPassword() {
let foundPassword = false;
const startYear = 1990;
const endYear = 2025;
window.alert = function (msg) {
if (msg !== 'Wrong') {
console.log(`비밀번호를 찾았습니다! 메시지: ${msg}`);
foundPassword = true;
throw new Error(`브루트포싱 완료: ${msg}`);
}
};
function tryBrute(pwd) {
document.querySelector('#pass').value = pwd;
document.querySelector('button').click();
}
function isValidDate(year, month, day) {
const date = new Date(year, month - 1, day);
return (
date.getFullYear() === year &&
date.getMonth() + 1 === month &&
date.getDate() === day
);
}
try {
for (let year = startYear; year <= endYear; year++) {
const shortYear = year % 100;
for (let month = 1; month <= 12; month++) {
for (let day = 1; day <= 31; day++) {
if (foundPassword) break;
if (!isValidDate(year, month, day)) continue;
const password = `${shortYear.toString().padStart(2, '0')}${month.toString().padStart(2, '0')}${day.toString().padStart(2, '0')}`;
console.log(`시도 중... 비밀번호: ${password}`);
tryBrute(password);
}
if (foundPassword) break;
}
if (foundPassword) break;
}
} catch (e) {
console.log(e.message);
}
})();
핵심은 YYMMDD로 이루어진 형식으로 brute force가 진행되어야 하고, 비밀번호가 틀리는 경우 팝업되는 alert가 무시되어야 하며, 조건에 맞는 비밀번호가 입력될 시 brute force가 멈추고 해당 값이 반환되어야 함
성공!