Basic RCE L17
Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가
힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)
이번문제는 Serial을 알아내는 다른 문제와 달리 Name을 알아내야 하는군요.
일단 실행시켜 봅시다.
Name과 Key에 A라는 값만 넣어서 실행시켰더니
문자열을 더 입력하라는 문구가 출력되네요
하라는대로 더 입력해봅시다
Name에 3글자를 입력했더니 아무일도 일어나지 않네요, Name은 3글자여야하나 봅니다 Key값은 맞아야 하는 값이 있으니 상관 쓰지 맙시다.
동적분석을 마쳤으니 Ollydbg로 정적 분석을 해봅시다. ( 패킹은 안되어 있구요. )
일단 Ollydbg로 들어가서 할 일은 Name이 1자리수가 되도록 바꾸어주는 것이 될거 같네요 문제에서 힌트로 Name이 한자리수라고 말해줬으니...
Name의 자릿수를 비교해주는 곳을 찾아야 되네요.
우선은 해당 비교 부분을 찾기 위해서 All referenced text strings를 통해서 우리가 본 문자열( Pleas Enter More Chars... )을 찾아봅시다.
위로 조금 올려보니 우리가 봤던 문자열이 보이네요 해당 부분으로 진입해봅시다.
진입해보니 우리가 찾던 문자열과 약간 위에 비교문이 있네요 저 부분이 아마 Name이 몇자리인지 비교하는 것 같은데 저 부분을 수정해 준 뒤에 진행하도록 합시다.
이제 자릿수 문제는 해결했으니 Name이 뭔지 알아봐야 하는데, 저희가 가진건 Key 값 밖에 없네요.
일단 아래에는 Please Enter Not More Then 30 Chars...라는 문자열이 있는데 이건 Key의 길이를 30자리 미만으로 제한하는 것 같은데 저희가 알고 있는 Key값은 30자리 미만이기 때문에 무시해도 될 것 같구요.
더 아래로 가보면 Good Boy!!라는 문자열이 눈에 띄는데 그 위에 부분이 아마도 key값을 비교하지 않나 싶네요.
근대 JNZ위로 CMP가 보이지 않는데 바로 위에 있는 Call부분에서 진행하는 것 같은데 해당부분으로 진입해서 확인해 봅시다.
EAX와 EDX의 값을 비교하는데 서로 같으면 RETN시킨다 이 부분에서 Key값의 비교를 해주는데 내가 입력한 값과 Key값을 비교해주는것 같으니 해당 함수에 BP를 걸고 한번 실행시켜봅시다.
실행을 시켰더니 웬 이상한 값이 EDX에 들어갔다. 고정된 값과 비교를 하는데 아닌가 싶어서 Name을 B로 바꾼 뒤에 다시 한번 실해시켜 봤는데
또 다른 값이 나왓다.. Name에 맞게 Key를 생성시키는데 Name을 맞춰서 우리가 알고있는 BEDA-2F56-BC4F4368-8A71-870B값과 같은 값이 나오도록 Name을 맞춰야하는 것 같다.
그럼 윗쪽에 Key값을 생성하는 부분이 있을 것이다.
어떤 부분에서 Key를 생성시키는지 잘 모르니까 Call함수 부분에 BP를 걸어준뒤 하나하나 어디에서 만드는지 확인해 봤다. 비교문 위로 Call이 3개가 있는데 아마도 비교문 바로 위에 있는 Call 함수에서 key를 생성시켜주는 것 같다.
의심스러운 해당 Call함수 부분에 진입해봅시다.
진입한 뒤에 f7로 천천히 실행시켜보면 어느 부분에서 문자열을 만드는 것을 알수 있다.
저 부분에서 Key값을 생성시키는 걸 알수있는데, 여기서 Key값을 생성한다고 하는 이유는 EDX에 존재하는 FFE374F0이라는 값에서 앞부분인 FFE3이라는 값이 Name을 A라고 입력하면 보여주는 Key 값의 가장 앞의 부분과 같기 때문이다.
key값을 생성하는 부분을 알았으니 해석을 해봅시다.
EBX = Name ( A )
ESI = EBX
ESI += EDX
ESI *= 772
EDX = ESI
EDX *= ESI
ESI += EDX
ESI *= 474
ESI += ESI
EDX = ESI
이러한 과정을 거치는데 우리는 저 계산을 했을 경우에 Key값의 앞부분이 같은 Name을 찾아야 하는데, 하나하나 계산을 하기에는 너무 귀찮으니 코드를 짜기로 했다.
실행시켰을 경우에 우리가 알고있는 BEDA-2F56-BC4F4368-8A71-870B에서 BEDA라는 값이 있는 문자열을 찾아야 한다.
아스키코드 값으로 70인 값이 이번 문제의 Name이다.
'Hacking > Reversing' 카테고리의 다른 글
CodeEngn_basic_19 (0) | 2020.08.02 |
---|---|
CodeEngn_basic_18 (0) | 2020.07.24 |
CodeEngn_basic_16 (0) | 2020.07.18 |
CodeEngn_basic_15 (0) | 2020.07.13 |
CodeEngn_basic_14 (0) | 2020.07.05 |