본문 바로가기

WARGAME/codeengn

Advance 10

Korean 
Serial이 WWWCCCJJJRRR 일때 Name은 무엇인가 
Hint 1 : 4글자임 
Hint 2 : 정답으로 나올 수 있는 문자열 중 (0~9, a~z, A~Z) 순서상 가장 먼저 오는 문자열 


이번 문제는 여러 함수가 복잡하게 되어있어서 ida 디컴파일러의 힘을 빌렸다.


일단 main 함수 부분을 보면 Name, Serial을 입력받고 유효성 검사를 하는 부분이 있다. 유효성 검사를 모두 통과하면 곧바로 5개의 함수를 실행한다. 




위 사진은 5개의 함수 중 위 3개의 함수만 나온 사진인데, 3/5 번째의 함수에 Name과 Serial(Passwd)이 인자로 들어가는 것을 볼 수 있다. 


ida에서 확인해보면 해당 함수 이름은 check_serial() 이다.


이제 해당 세 번째 함수를 보면 Serial과 Password 체크 루틴이 나온다. 

(처음 ida없이 할 때는 대충 감을 잡을수 없어서 함수 하나하나 전부 분석했다가 체력 문제로 포기)




위 사진은 세 번째 함수에서 Name과 Serial을 비교하는 루틴만 캡쳐한것으로 'check'변수가 0이 되면 "잘못된 시리얼 입력" 문구를 출력한다. 


따라서, check 변수가 0이되지 않으려면 "변수 v25에서 변수 v24를 뺀 값의 절대값" 이 5보다 작으면 된다. 


그래서 해당 부분을 ollydbg로 보면 다음 사진과 같다. 



401b4c 주소에서 EDX 레지스터에 NAME의 한 글자를 연산한 값이 들어가고, EAX에는 시리얼 중 한 글자를 연산한 값이 들어가게 된다. 


이 값들이 각각 v25, v24에 해당된다. 


EAX : Serial 중 한 글자를 연산한 값 (v25)

EDX : Name 중 한 글자를 연산한 값 (v24)


이제 우리는 저 401b5f의 분기문에서 401b61 주소의 [EBP-69] 주소 값에 0을 넣는 부분을 건너 뛰어야 하는데, 그러기 위해선 각 Name과 Serial의 글자들을연산한 결과값을 알아야 한다. 


약간 노가다 성으로 알아보면 각 글자들은 다음 값과 같이 1:1 매칭된다. 


[+]NAME (오른쪽 값은 16진수)

1=43

2=38

3=31

4=36

5=40

6=2c

7=3d

8=42

9=33

0=3e


a=25

b=2d

c=47

d=45

e=46

f=2a

g=28

h=3f

i=3c

j=26

k=2e

l=48

m=35

n=49

o=2f

p=44

q=41

r=29

s=37

t=34

u=3a

v=2b

w=30

x=27

y=32

z=39


또한, Serial의 WWWCCCJJJRRR 글자를 연산하면 다음 값을 가진다. 

[+]Serial ( 오른쪽에 있는 값은 16진수)

WWW=303030

CCC=474747

JJJ=262626

RRR=292929


이제 위 값들을 이용해서 abs(Serial - Name) > 5 연산을 하여 Hint 에 있던 '정답으로 나올 수 있는 문자열 중 (0~9, a~z, A~Z) 순서상 가장 먼저 오는 문자열 '을 만족시키면 31a6 이라는 값이 Name이 되어야 한다. 




답 : 31a6


'WARGAME > codeengn' 카테고리의 다른 글

Advance 12  (0) 2015.04.08
Advance 11  (0) 2015.04.08
Advance 9  (0) 2015.04.06
Advance 8  (0) 2015.03.29
Advance 7  (0) 2015.03.19