2016. 1. 15. 16:09

버튼 하나만 있는 아주 간단하고 문제의 목적을 알 수 있다. PEiD로 확인해보면 VB프로그램인 것을 알 수 있다.


VB 디컴파일러로 확인해보면 하나밖에 없는 버튼을 클릭했을 때 어느 코드가 실행되는 지 알 수 있다.


디컴파일러에서 확인한 0x402240의 주소를 확인하니 클릭 시 실행되는 게 맞다. 이후에 나오는 코드들은 모두 클릭 후에 실행되는 코드들이다.


처음으로 denied로 점프하는 분기문이 있는 부분이다. 이 곳에서는 __vbaLenBstr함수를 호출하여 입력한 문자열의 길이를 확인한다. 문자열의 길이가 7이 아니면 denied를 출력하는 곳으로 점프한다.


입력한 문자열의 길이가 7인 경우 점프되지 않고 아래의 이 코드들이 실행된다. __vbaObjSet, __vbaHresultCheckObj, rtcMidCharBstr, __vbaStrMove, __vbaStrI2, __vbaFreeStrList, __vbaFreeObj, __vbaFreeVar 함수들이 실행된다.

할당과 해제에 관련된 함수를 제외하고 살펴보자. rtcMidCharBstr 함수는 입력한 문자열에서 한 문자를 가져온다. __vbaStrI2 함수는 문자열을 다른 문자열로 바꿔주는 역할을 한다. 이러한 코드가 총 7개가 있다.

4번째와 6번째에는 __vbaStrI2 함수가 없는 것만 빼면 동일하다.


이 코드들이 실행되면 어떤 값들이 저장되는 지 알아보기 위해 문자열 1234567 을 입력해보았다.

위의 코드와 비슷한 코드 7개들 모두 실행한 후의 스택 영역이다. 스택에는 문자열을 가리키는 포인터들이 저장된다. 중간에 문자열로 표시되지 않는 곳을 따라가보면 아래와 같은 값이 저장되어있다.




스택이 가리키는 문자열은 순서대로 "49", "50", "51", "\x34", "53", "\x36", "55" 이다. 1씩 증가하는 문자열을 입력했고, 스택에서도 1씩 커지는 문자열들을 가리키고 있다. 여기서 __vbaStrI2 함수가 한 문자를 10진수 아스키 코드 문자열로 변환하는 것을 알 수 있다. 4, 6 번째 문자를 처리할 때는 __vbaStrI2 함수가 없기 때문에 문자의 16진수 값이 그대로 저장된다.

char 

10 

16 

49 

31 

50 

32

51 

33 

52 

34 

53 

35 

54 

36 

55 

37 

코드를 실행하면 위의 표와 같이 문자열이 생성되고 각 스택에서 문자열들을 가리킨다.


각 문자를 처리하면 위 사진의 코드가 실행된다. 문자열을 비교하는 __vbaStrCmp 함수가 7번 실행된다. 비교하는 문자열이 다를 경우 denied를 출력하는 곳으로 점프한다. 7번의 __vbaStrCmp에는 순서대로 "69", "99", "104", "\x33", "108", "\x30", "110"의 문자열들이 비교된다.

이 조건을 만족하기 위해서는 아래의 표와 같이 문자열을 구성해야한다.

char 

10 

16 

E

69

45

c

99

63

h

104

68

3

51

33

l

108

6C

0

48

30

n

110

6E 







'WriteUp' 카테고리의 다른 글

Crackit2.exe Writeup  (0) 2016.02.01
Crackit2.exe Writeup  (0) 2016.01.14
[예시] Easy Keygen (100pt)  (0) 2016.01.11
Posted by 지환태