2번을 실행해보면 다음과 같은 화면이 나온다
그리고 아무거나 입력해보면 다음과 같이 메세지 박스가 뜬다
디버거로 분석을 해보자.
우리는 저 문자열을 참조한 부분을 찾아보자.
다 중단점(F2)을 걸어놓고 더블클릭해서 자세히 봐보자.
그리고 점프 문들 위로 함수 호출 하는 부분들도 브레이크 포인트를 걸고 아무 값 입력해서 체크 버튼을 눌러보면 다음과 같다
이때, 계속 진행을 하다가 보면 Congratulations을 하기 위해서는 00403332에 있는 명령인 점프를 하지 않고 그냥 밑으로 진행을 해야한다. 그러면 test ax,ax 를 했을때 ZF 가 0으로 설정이 되면 안된다.
push edx 와 push eax 에서 스택에 값을 넣고 있는데, 이때 스택을 따라가 보면 다음과 같다
여기서 aaaaaaaaa 는 내가 비밀번호를 입력한 값이고 위에 95959595라는 값은 전에 반복문을 돌면서 계속 증가하던 문자열이다.
따라서 이 값을 시리얼 값에 넣어 확인해보면 다음과 같이 정답 화면을 볼 수 있다!!
원래 함수를 추정하자면, Name의 길이를 받고 4글자 이하면 탈락~ 4글자 이상이면 1차 통과하고 name의 길이만큼 반복문을 돌며 각 문자마다 특정 시리얼 문자로 변경시키는 코드인것 같다! 따라서 그 시리얼 생성 코드만 파악할 수 있다면 바로 정답화면을 볼 수 있을 것이다.
이 디버거로 함수를 보는건 너무 복잡해서 다른 디버거로 봐보자.
이 문제는 VB 로 쓰였기 때문에 VB 디컴파일러를 사용해보자!!
이 코드를 분석해보면 다음과 같다
시리얼키 생성 과정을 자세히 살펴보자.
var_9C = Len(var_74)
If (var_9C < 4) <> 0 Then GoTo loc_004034F3
For var_24 = 1 To 4 Step 1
If var_134 = 0 Then GoTo loc_004032A5
var_54 = Asc(CStr(Mid(var_74, CLng(var_24), 1)))
var_44 = var_44 & Hex(var_54 + 100)
Next var_24
GoTo loc_00403197
CLng(var_24)는 그냥 인덱스로 생각하면 될 것 같다고 Mid() 는 하나의 문자열을 추출해준다.
여기서 Asc() 를 해서 아스키 값을 저장한 뒤 100을 더한 헥스값을 var_44에 저장해준다. (순차적으로 쌓아짐)
이때, 시리얼을 생성하는 과정을 파이썬 코드로 바꿔봤다!
(var_134는 의미상 생략..)
var_74 = "1111"
var_9C = len(var_74)
var_44 = ""
for var_24 in range(1, 5):
var_54 = ord(var_74[int(var_24) - 1])
var_44 += hex(var_54 + 100)
print(var_44)
var_74에 name 입력값인 1111을 입력하고 돌리면 다음과 같이 결과가 나온다!
우리가 스택에서 봤던 값과 동일하게 나온다~!
앞으로 저 코드를 사용하면 시리얼키를 다 얻을 수 있다 ^_^
'WARGAME > reversing' 카테고리의 다른 글
[dreamhack] rev-basic-3 (0) | 2023.09.22 |
---|---|
[dreamhack] patch (0) | 2023.09.22 |
[dreamhack] rev-basic-1 (0) | 2023.09.15 |
[dreamhack] rev-basic-0 (0) | 2023.09.15 |
[Crackme] #1 (0) | 2023.09.11 |