이번주도 리버싱 문제에 도전해볼 것이다
주어진 html파일을 열어보면 다음과 같이 비밀번호로 추정되는 생년월일을 입력하게 되어있다
정답이 아닌 값을 입력하면 다음과 같이 alert창이 뜬다
이제 코드를 살펴본다
코드 마지막 부분에 confirm 버튼을 누른 후 _0x9a220
함수가 실행되는 것을 알 수 있다
_0x9a220
가 정의되어 있는 곳에 가보니 코드가 난독화 되어있다
그러나 비밀번호가 생년월일 형식인 것을 알고 있으니 brute force로 문제를 해결할 수 있을 것 같다
다음과 같이 코드를 작성한다
(다른 분이 작성하신 것을 참고했다. 자바스크립트 공부도 해야겠다....)
for (let year = 0; year <= 99; year++){
var result = 0;
for (let month=1; month <= 12; month++){
for (let day=1; day <= 31; day++){
let password = ""
password += String(year).padStart(2, "0");
password += String(month).padStart(2, "0");
password += String(day).padStart(2, "0");
console.log(password);
result = _0x9a220(password);
if(result) break;
}
if(result) break;
}
if(result) break
}
그런데 입력을 잘못할 때마다 alert창이 뜨므로 다음과 같이 임의로 return값을 wrong이 아닌 0으로 설정해준다.
30분정도 기다리다보면 flug가 출력된다
야호
🔑 DH{Brutef0rce_th3_secur3_mail}
이번에는 dll 파일 관련 문제이다
주어진 dll 파일을 IDA에서 열어보면 다음과 같다
DllMain
함수를 디컴파일 해보면 sub_1800011A0
을 실행하는 것을 알 수 있다
sub_1800011A0
의 24번째 줄을 보면 Str1과 dreamhack.exe
를 비교하고 있고, 같으면 flag를 출력해주는 듯하다
23번째 줄을 보면 Str1은 PathFindFileNameA(Filename)
이다
즉 Filename은 실행파일명이기 때문에 dll 파일을 로드시키는 파일 이름이 dreamhack.exe
이어야 하는 것이다
다음과 같이 dll 파일을 로드시키는 c언어 코드를 작성한다
#include <windows.h>
int main() {
LoadLibrary("prob_rev.dll");
return 0;
}
c파일을 exe파일로 추출해서 실행시키면
다음과 같이 flag를 포함하고 있는 팝업창이 뜬다
🔑 DH{e7024e9341eb676b116edb69f37e86bf}
지난번까지 풀었던 유형과 비슷한 리버싱 문제이다
main함수에서 실행하고 있는 sub_140001000
을 들여다보면 7번째 줄에서 입력값과 byte_140003000
을 확인하고 있다
sub_140001000
은 다음과 같다
flag값을 구하는 파이썬 코드를 다른 블로그에서 참고했다...
encrypted = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]
latest = 0
flag = []
for i in range(23, -1, -1):
latest = encrypted[i] - latest
flag.append(chr(latest))
flag.reverse()
print(''.join(flag))
실행하면 다음과 같이 flag가 출력된다!
🔑 DH{All_l1fe_3nds_w1th_NULL}