[EVI$ION] CTF 3문제 챌린지 5

beanii·2023년 6월 20일
0

CTF

목록 보기
6/7
post-thumbnail

💫[Dreamhack] Secure Mail

https://dreamhack.io/wargame/challenges/92/

이번주도 리버싱 문제에 도전해볼 것이다

주어진 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}



💫[Dreamhack] Inject ME!!!

https://dreamhack.io/wargame/challenges/119/

이번에는 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}



💫[Dreamhack] rev-basic-5

https://dreamhack.io/wargame/challenges/19/

지난번까지 풀었던 유형과 비슷한 리버싱 문제이다

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}

0개의 댓글

관련 채용 정보