반응형

14.exe
0.06MB

 


 

이번 문제는 UPX로 패킹이 되어 있다.

 

 

 

OEP의 주소는 401000이다.

 

 

암호 해제 후 OEP를 보면 위와 같다.

 

 

문자열 찾기 기능을 이용하면 위와 같이 문자열들이 뜬다.

 

위에서 프로그램을 실행 했을 때 봤던 "You Have Enter A Wrong Serial, Please Try Agin" 문자열이 있다.

 

 

맞는 Serial 값을 입력 했을 때와 맞지 않는 Serial 값을 입력 했을 때의 문자열을 띄우는 조건분기는 40133C 주소에서 jne 명령어이다.

 

 

조금 더 스크롤을 올리면 위와 같이 GetDlgItemTextA() 함수로 입력된 문자값을 가져오는데, 입력된 문자값이 없으면 위에서 확인했던 "please Fill in 1 more~~~" 문자열을 띄운다.

 

 

그리고 스크롤을 아래로 내리면 위의 사진과 같이 암호화 하는 암호 알고리즘 부분이다.

 

 

암호화 알고리즘이 끝나면, 암호화 알고리즘이 끝나고 생성된 serial 값을 스택에 넣고, 내가 입력했던 Serial 값도 스택에 넣고 내가 입력한 serial 값을 길이만큼 16진수로 변환한다.

 

암호화 알고리즘이 끝나고 생성된 serial 값과 내가 입력한 serial 값의 길이만큼 16진수로 변환한 값을 비교한다.


풀이 

 

 

4012FB의 lstrlen() 함수에 BP를 걸고 실행하여 CodeEngn / slayslay을 입력하고 Check 버튼을 누른다.

 

그러면 암호 알고리즘에 의해 Name에 입력된 값이 암호화 된 후 16진수 값으로 esi에 저장된다.

 

암호 알고리즘

0. Name에 입력된 값의 길이를 구한다.

1. esi는 0으로 만들고, ecx에 eax의 값(Name에 입력된 문자열의 길이)을 넣고, eax에 1을 넣는다.

2. 403038 주소에는 Name에 입력된 값 "CodeEngn"이 저장되어 있는데 edx에 "CodeEngn" 문자열에서 가져온 문자 하나하나를 담는다.

3. edx의 값을 ebx로 옮기고, ebx의 값에 edx의 값을 곱한 값을 ebx에 저장하고, 이 ebx 값을 esi에 더해 esi에 저장한다.

4. 다시 edx에 있는 값을 ebx로 옮기고, ebx의 값을 1만큼 sar(Shift Arithmetic Right) 연산한 후 esi의 값에 더하고, 이 더해진 값에서 edx의 값을 뺀다.

5. 1번 ~ 4번의 과정을 0번에서 구한 길이만큼 반복한다.

 

 

암호화 알고리즘이 끝난 후 esi에는 129A1이 들어있다.

 

129A1는 16진수이므로 10진수로 바꾼 값이 serial 값이다.

 

 

name ="CodeEngn"
    
esi = 0
ecx = 8
eax = 1

while(ecx != 0):
    edx = int(hex(ord(name[eax-1])), 16)
    esi = esi + (edx * edx) + (edx >> 1) - edx

    eax = eax + 1
    ecx = ecx - 1
    
print(esi)

 

129A1을 10진수로 바꾸면 76193이다.

 

위의 Python 코드를 실행하면 바로 Serial 값을 구할 수 있다.

 

 

"76193"이 문제의 답이다.

 

 

반응형

'전쟁 > codeengn' 카테고리의 다른 글

[codeengn] Basic RCE 16  (0) 2022.07.31
[codeengn] Basic RCE 15  (0) 2022.07.30
[codeengn] Basic RCE 13  (0) 2022.07.29
[codeengn] Basic RCE 12  (0) 2022.07.29
[codeengn] Basic RCE 11  (0) 2022.07.28

+ Recent posts