일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Advanced안티디버깅
- Static안티디버깅
- RedLine Stealer
- DebugBlocker
- 안티디버깅
- IL코드
- 디버깅
- Exe2Aut
- OllyDbg
- hxd
- dotPeek
- JIT
- UTF-16
- 서비스프로세스
- UTF-32
- Visual Studio
- CP949
- 리버싱핵심원리
- 리버싱
- CodeEngn
- PEImageSwitching
- Self-Creation
- 서비스디버깅
- x32dbg
- PEImage
- 분석 보고서
- Python
- ImageSwitching
- .net
- Dynamic안티디버깅
- Today
- Total
-榮-
[CodeEngn] Basic RCE L17 본문
● CodeEngn Basic RCE L17 문제
◎ 파일 실행 화면
문제의 힌트에서 Name은 한 자리라 했지만 Name에 한 문자를 넣으면 "Please Enter More Chars..."이 나옵니다.
패치가 필요해 보입니다.
◎ 패킹 및 난독화 여부 확인
● CodeEngn Basic RCE L17 분석 및 풀이
문자열 검색으로 성공 문자열을 찾아봅니다.
성공 문자열 주소로 이동하면 분기점(0045BBA9)이 보입니다.
성공 문자열에서 더 내려가면(주소 기준) "Please Enter More Chars..."문자열과 함께 문자열 길이를 3과 비교하는 코드(0045BB24)가 보인다. 이 부분이 패치할 부분입니다.
문제의 힌트에서 Name은 한 자리라 했으니 CMP EAX, 3 --> CMP EAX, 1로 패치합니다.
[※참고]
패치 파일 만드는 법은 CodeEngn Basic RCE L01의 "+α 패치파일 만드는 법"
패치 파일을 만들어서 OllyDbg에 올립니다.
패치 코드에 BP를 걸고 실행[F9] 후 Step Over[F8]로 진행하다 보면 CALL 0045B850에서 Name(A)에 대한 Serial이 만들어지고, CALL 00404C3C에서 만들어진 Serial과 입력받은 Serial을 비교하는 것을 확인할 수 있습니다.
0045BB9B에서 Step Into[F7]를 하여 내부로 이동합니다.
CALL 0045B850 내부에는 반복문이 크게 4개가 있습니다.
위 반복문들의 결과는 표와 같습니다.
EDX : FFE3 74F0 | EDX : 02C7 33B4 |
EDI : 08A4 8A32 | EBX : E1CB C640 |
[그림 10]에서 Name(A)으로 만들어진 Serial("FFE3-2C73-0502A34C-8A48-E1CB")을 봤을 때, 반복문들의 결과의 (0을 제외한) 4자리가 Serial 앞과 뒤의 내용과 같다는 것을 알 수 있습니다.
CALL 0045B850 내부에서 두 번째 반복문 이후의 CALL 0045B54C에서 Serial의 중간 문자열이 만들어지는 것을 확인할 수 있습니다.
네 번째 반복문 이후 코드에서 각 반복문의 결과 값을 4자리 이어 붙이는 코드가 나옵니다.
Serial이 "BEDA-2F56-BC4F4368-8A71-870B"인 Name을 찾기 위해
첫 번째 반복문을 분석하여 반복문의 결과 값이 "BEDA"가 나오는 한 자리를 찾아봅시다.
# 첫 번째 반복문 흐름
첫 번째 반복문 |
설명 및 예시 |
1. ecx = 1 |
1. 입력받은 Name의 문자열을 가져오기 위한 ecx ex. Name : A 1) [EBP-4] : 18F50E8 ex. 입력받은 A의 주소 값 2) esi : 입력받은 Name을 Byte 단위로 입력 ex. esi : 0x41 ('A') 3) ex. esi : 41 / edx : 0 4) ex. esi : 41 * 772 : 1E3F2 6) ex. edx : 1E3F2 * 1E3F2 : 92DB 10C4 7) ex. esi : 1E3F2 + 92DB 10C4 : 92DC F4B6 8) ex. esi : 92DC F4B6 * 474 : FFF1 BA78 9) ex. esi : FFF1 BA78 + FFF1 BA78 : FFE3 74F0 |
반복문의 결과 값이 "BEDA"가 나오는 한 자리를 찾는 코드
def First_Loop(name): ## 첫 번째 반복문
esi = name
esi = esi * 0x772
edx = esi
edx = edx * esi
esi = esi + edx
esi = esi * 0x474
esi = esi + esi
edx = esi
return edx
if __name__ == '__main__':
for name in range(0x30, 0x7A): ## 숫자 0 부터 z 까지
serial = First_Loop(name)
lenght = len(hex(serial))
if 'beda' == hex(serial)[lenght-8:lenght-4]: ## 'beda'와 일치하는 name 출력
print(chr(name))
● CodeEngn Basic RCE L17 확인 및 답
CodeEngn Basic RCE L17의 답은 Name의 MD5 (대문자) = 800618943025315F869E4E1F09471012
'CodeEngn > Basic' 카테고리의 다른 글
[CodeEngn] Basic RCE L19 (+α AutoIt 전용 디컴파일러) (0) | 2021.03.27 |
---|---|
[CodeEngn] Basic RCE L18 (0) | 2021.03.27 |
[CodeEngn] Basic RCE L16 (0) | 2021.03.26 |
[CodeEngn] Basic RCE L15 (0) | 2021.03.25 |
[CodeEngn] Basic RCE L14 (0) | 2021.03.25 |