ㄹㄹㄹㄹ뤼벌씽~ 오랜만~~
푸는거 제일 복잡하고 어려운데 제일 재밌음 ㅋㅋ
답을 찾기위해 거꾸로 가는 여정이 즐거운 것 같다
내가 왔던 길을, 거꾸로, 다시 내가 간 길을 찾기위해서
_0x9a220를 찾아 자세히 보자
스크립트 내부의 _0x9a220 함수를 보면,
if 문에 의해 잘못된 값이 들어오면 alert 창을 띄운 후 return 되는 것이 보인다.
이를 넘어가야 document에 무언가를 써주는데, 이것이 flag일 것 같다.
코드를 분석하기보단, 6자리 생년월일이라는 제한이 있기 때문에
브루트포싱이 빠르다고 판단되어 콘솔에 직접 코드를 쳤다.
출처ㅣ https://velog.io/@c01dbr0th3r/DreamHack-Secure-Mail
brute force는 영어 뜻 그래로다 짐승같은 힘
즉 비번이 1174일때 경우의 수는 0000~9999까지다
그걸 일일히 다 대입해서 1172,1173,1174가 대입된 순간, 로그인이 되게하는거다
경우의 수가 늘어나면 시간이 오래걸리는 만큼, 비번을 찾는 확률을 100%다
정말 짐승같은 힘이 아닐수 없다..
brute forcing을 해보자, 콘솔에 직접 코드를 입력하면 된다
window.alert = function ( text ) { console.log( 'tried to alert: ' + text ); return true; };
function birthday(aaa){
var format = /^([0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[0,1]))$/;
if(format.test(aaa)){
_0x9a220(aaa);
}else{
}
}
for(var i=800000; i<999999; i++) {
birthday(i);
}
코드 출처ㅣ https://m.blog.naver.com/pouerccat/222107488415
이 코드는 JavaScript 코드로, 여러 가지 중요한 요소들이 있습니다. 각 부분을 설명하겠습니다.
### 1. **`window.alert = function (text) { console.log('tried to alert: ' + text); return true; };`**
- 이 줄은 **`window.alert`** 함수를 재정의합니다. 원래 `alert` 함수는 브라우저에서 알림 창을 띄우는 역할을 합니다.
- 하지만 이 코드는 **`alert`** 대신 **`console.log`**를 사용하여 메시지를 **콘솔에 출력**하게 변경합니다.
- 즉, **`alert`** 창을 띄우는 대신 콘솔에 `tried to alert: <text>` 형태로 텍스트를 출력하게 됩니다.
- `return true;`는 `alert` 함수가 **false**로 평가되지 않도록 방어적으로 설정한 코드입니다.
### 2. **`function birthday(aaa) { ... }`**
- `birthday`라는 함수를 정의하고 있습니다. 이 함수는 매개변수로 `aaa`를 받습니다.
- 함수 내부에서 `aaa`는 **문자열 형식의 날짜**를 나타내는 것으로 추측됩니다.
### 3. **`var format = /^([0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[0,1]))$/;`**
- 여기서는 **정규 표현식**을 사용하여 `aaa`의 값이 올바른 **생일 형식**인지 검증하려고 합니다.
- 정규 표현식은 날짜를 `YYMMDD` 형식으로 검사하는 규칙을 정의하고 있습니다.
- `([0-9]{2})`: 첫 두 자리는 숫자 (`YY`), 즉 연도를 나타냄.
- `(0[1-9]|1[0-2])`: 그다음 두 자리는 월을 나타내며, 01부터 12까지의 숫자.
- `(0[1-9]|[1,2][0-9]|3[0,1])`: 마지막 두 자리는 일을 나타내며, 01부터 31까지의 숫자.
이 정규 표현식은 `YYMMDD` 형태의 날짜 형식이 정확한지 확인합니다.
### 4. **`if (format.test(aaa)) { _0x9a220(aaa); }`**
- 이 부분에서 `aaa`(입력 값)가 정규 표현식 `format`에 맞는지 테스트합니다.
- 만약 정규 표현식을 통과하면 `_0x9a220(aaa);`가 호출됩니다. `_0x9a220` 함수는 코드 상에서 정의되어 있지 않지만, 이 함수가 `aaa` 값을 처리하는 역할을 하는 것으로 보입니다. 이 함수가 **알 수 없는 함수명**이기 때문에, 실제로 무엇을 하는지 확인하려면 해당 함수가 정의된 부분을 봐야 합니다.
### 5. **`else { }`**
- `else`는 빈 블록으로, 정규 표현식 테스트를 통과하지 못한 경우 아무 동작도 하지 않도록 설정되어 있습니다.
### 6. **`for(var i = 800000; i < 999999; i++) { birthday(i); }`**
- 이 코드는 `800000`부터 `999999`까지의 숫자들에 대해 `birthday(i)`를 호출합니다.
- `birthday(i)` 함수는 각 숫자에 대해 실행되며, 숫자가 `YYMMDD` 형식에 맞는지 확인합니다. 만약 맞다면 `_0x9a220(i)`가 호출됩니다.
- 예를 들어, `i`가 800000이라면 `birthday(800000)`이 호출되고, 이는 `80`년 `00`월 `00`일을 의미하는 날짜입니다. 이 형식이 맞는지 정규 표현식으로 검사하고, 통과하면 `_0x9a220(800000)`이 실행됩니다.
### **전체적인 흐름**
1. `window.alert`를 재정의하여 알림 창 대신 콘솔에 메시지를 출력하도록 설정합니다.
2. `birthday` 함수는 주어진 숫자가 `YYMMDD` 형식의 날짜인지를 정규 표현식으로 검사합니다.
3. `i` 값이 `800000`부터 `999999`까지 반복되며, 각 값에 대해 `birthday(i)` 함수가 실행됩니다.
- 이 숫자들이 유효한 날짜 형식(`YYMMDD`)인지 확인하고, 유효하면 `_0x9a220(aaa)`를 호출합니다.
### 결론
이 코드의 주된 목적은 **800000부터 999999까지의 숫자**가 **유효한 날짜 형식**인지 확인하고, 유효한 값에 대해 `_0x9a220`라는 함수가 호출되도록 하는 것입니다. `window.alert`를 재정의한 것은 코드 실행 중에 알림 창 대신 콘솔에 메시지를 출력하기 위함입니다.
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[74] IT 비전공자 [dreamhack]Apache htaccess문제 풀기 (0) | 2024.11.22 |
---|---|
[73] IT 비전공자 [dreamhack]File Vulnerability Advanced for linux문제 풀기 (1) | 2024.11.21 |
[71] IT 비전공자 [dreamhack] Basic_Forensics_1문제 풀기 (2) | 2024.11.19 |
[70] IT 비전공자 [dreamhack] baby-union문제 풀기 (2) | 2024.11.18 |
[69] IT 비전공자 [dreamhack] Command Injection Advanced문제 풀기 (2) | 2024.11.17 |