WARGAME/reversing

[abex crackme] 2번

lucykorea414 2023. 9. 11. 02:22
728x90

2번을 실행해보면 다음과 같은 화면이 나온다

그리고 아무거나 입력해보면 다음과 같이 메세지 박스가 뜬다

디버거로 분석을 해보자.

우리는 저 문자열을 참조한 부분을 찾아보자.

다 중단점(F2)을 걸어놓고 더블클릭해서 자세히 봐보자.

 

그리고 점프 문들 위로 함수 호출 하는 부분들도 브레이크 포인트를 걸고 아무 값 입력해서 체크 버튼을 눌러보면 다음과 같다

이때, 계속 진행을 하다가 보면 Congratulations을 하기 위해서는 00403332에 있는 명령인 점프를 하지 않고 그냥 밑으로 진행을 해야한다. 그러면 test ax,ax 를 했을때 ZF 가 0으로 설정이 되면 안된다. 

push edx 와 push eax 에서 스택에 값을 넣고 있는데, 이때 스택을 따라가 보면 다음과 같다

 

여기서 aaaaaaaaa 는 내가 비밀번호를 입력한 값이고 위에 95959595라는 값은 전에 반복문을 돌면서 계속 증가하던 문자열이다. 

이 부분에서 계속 반복문을 돌면서 95가 추가되는 것을 볼 수 있다.

따라서 이 값을 시리얼 값에 넣어 확인해보면 다음과 같이 정답 화면을 볼 수 있다!!

원래 함수를 추정하자면, 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을 입력하고 돌리면 다음과 같이 결과가 나온다!

우리가 스택에서 봤던 값과 동일하게 나온다~!

앞으로 저 코드를 사용하면 시리얼키를 다 얻을 수 있다 ^_^

728x90

'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