일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ImageSwitching
- CP949
- 서비스디버깅
- IL코드
- 분석 보고서
- OllyDbg
- Static안티디버깅
- Visual Studio
- Python
- RedLine Stealer
- .net
- dotPeek
- Self-Creation
- DebugBlocker
- UTF-32
- 리버싱핵심원리
- Exe2Aut
- x32dbg
- hxd
- Dynamic안티디버깅
- 서비스프로세스
- PEImage
- Advanced안티디버깅
- PEImageSwitching
- 리버싱
- 안티디버깅
- JIT
- 디버깅
- UTF-16
- CodeEngn
- Today
- Total
-榮-
[CodeEngn] Advance RCE L09 본문
● CodeEngn Advance RCE L09 문제
◎ 파일 실행 화면
◎ 패킹 및 난독화 여부 확인
● CodeEngn Advance RCE L09 풀이
[그림 2]를 보면 실패 시 "Sorry, but the username and/or password is incorrect!" 문자열이 출력되는 것을 볼 수 있습니다. [Search for > All referenced text strings]를 보면 성공 문자열과 실패 문자열을 확인할 수 있습니다.
성공 문자열이 더 낮은 주소에 있으므로 성공과 실패를 나누는 분기점은 성공 문자열 주변 주소에 있을 것으로 생각됩니다. 성공 문자열 주소로 이동하겠습니다.
성공 문자열 주소로 이동하면 005E12AD가 분기점이라는 것을 알 수 있습니다.
분기 조건으로 이동하는 주소를 확인하면 00341097인 것을 확인할 수 있습니다.
00341097로 이동하면 0034105F의 "DonaldDuck" 문자열과 [0034440C]의 문자열을 비교하는 반복문이 나옵니다.
즉, 이곳까지 실행하였을 때 [0034440C]에 입력받은 Username("ABCD")이 있다면 Username은 "DonaldDuck"입니다.
[그림 8]이 있는 함수의 시작 부분에 [그림 8]과 같은 반복문이 있습니다. 이 반복문에선 [003431F8]과 [0034440C]의 문자를 비교하고 있습니다. 어떤 문자열을 비교하는지 확인하기 위하여 BP[F2]를 걸고 실행[F9]해 보겠습니다.
함수의 시작(00341000)까지 진행하면 [0034440C]에 입력받은 Username("ABCD")이 있는 것을 확인할 수 있습니다.
따라서 [그림 8]에서 추측한 대로 Username은 "DonaldDuck"입니다.
[그림 10]과 [그림 11]의 사이에 [그림 12]의 코드가 있습니다.
00341043에서 [34442C]의 "4D2"h를 EAX로 옮기고 0034104B에서 "4D2"h의 값과 [ECX]의 값을 비교합니다. "4D2"h 값은 입력받은 Password("1234"d)의 16진수 값이므로 0034104B에서 진행하는 비교가 입력받은 Password("1234"d)의 16진수와 Password 16진수([ECX])인 것을 알 수 있습니다.
입력받은 Password("1234"d)의 16진수와 Password 16진수([ECX])를 비교하는 0034104B로 이동하면 Password 16진수([ECX])가 "0088228F"h인 것을 알 수 있습니다. 입력받은 Password("1234"d)가 16진수로 변환되어 비교되는 것으로 볼 때, "0088228F"h의 10진수가 "DonaldDuck"의 Password인 것을 알 수 있습니다.
"0088228F"h를 10진수로 변환하면 8,921,743d입니다.
찾은 Username과 Password를 입력하면 "I can't believe you felt for that! xD"와 "Sorry, but the username and/or password is incorrect!" 문자열이 나타납니다. 이 문자열 중 "I can't believe you felt for that! xD"은 트레이싱해보면 알겠지만 Username을 "DoanldDuck"으로 작성하면 나오는 문자열입니다.
"Sorry, but the username and/or password is incorrect!"는 Password와 관련이 있는 문자열입니다. Advance RCE L09의 분기 조건은 003412AB TEST BL, BL이고, 분기점은 003412AD JE 003412DF입니다. 이 분기점이 같은 코드를 바로 밑에서 확인할 수 있습니다.
Password가 맞게 입력되는 틀리게 입력되든 003412AB에서의 EBX는 00000000입니다. 하지만 아래 있는 분기 조건에서는 Password가 맞게 입력되면 01이 입력되어 있고, Password가 틀리게 입력되면 00이 입력되어 있는 것을 확인할 수 있습니다. 따라서 분기점을 003412B4로 변경하기 위한 패치를 해줍니다.
패치 후 실행[F9] 하여 분기 조건을 확인해 봅시다.
● CodeEngn Advance RCE L09 확인
+α
◎ 패치 후 Password만 맞을 경우
◎ 패치 후 Username만 맞을 경우
'CodeEngn > Advance' 카테고리의 다른 글
[CodeEngn] Advance RCE L11 (2) | 2021.04.08 |
---|---|
[CodeEngn] Advance RCE L10 (0) | 2021.04.07 |
[CodeEngn] Advance RCE L08 (0) | 2021.04.05 |
[CodeEngn] Advance RCE L07 (0) | 2021.04.04 |
[CodeEngn] Advance RCE L06 (0) | 2021.04.02 |