티스토리 뷰

level18문제를 보면 Serial값을 구하는 것입니다. 


실행을 했더니 "You serial is Wrong, try again"을 띄웁니다.



Exeinfo PE를 실행하면 어떤 컴파일러를 이용했는지 출력이 안되네요. 일단 분석을 진행하겠습니다.



GetDlgItemTextA에 BP를 걸고 실행을 합니다. 문제에 나온 것과 같이 CodeEngn을 Name으로 주고 Serial은 임의로 123을 주겠습니다. 실행을 하면 문자열을 입력받고 다음 줄부터 분석이 가능합니다.



쭉 내려오다 보면 00401141~00401146 줄을 보면 name으로 입력한 CodeEngn을 인자로 주고 00404058 함수를 실행하는데, 들어가서 분석을 해보겠습니다.



00404058 함수의 전체 모습입니다. 눈으로 훑어봤을 때 XOR도 몇개 나오고 비교도 하고 그냥 암호화 시키는 것 같은 느낌이 들었습니다.



00404058 줄부터 00404065 줄을 설명하겠습니다. 일단, 40405E줄에서 [ARG.1]에서 ESI로 name(CodeEngn)을 집어 넣습니다. 

404063 줄을 보면 ESI 주소안에서 4바이트 만큼 EAX에 넣습니다. 

404065 줄에서도 마찬가지로 ESI 주소안에서 4바이트 만큼 EDX에 넣는데 [ESI+4]를 넣는 걸 보니 CodeEngn에서 4바이트만큼 잘라서 EAX:EDX 에 각각 Code 와 Engn으로 넣는 것을 확인 가능합니다.



ESI[4076F0] 의 덤프 부분입니다. 



레지스터창의 결과 값으로는 EAX에 65656F43(Code) 들어가고, EDX에는 6E676E45(Engn)이 들어갑니다.



00404068 ~ 0040406A 줄을 보면 BSWAP 라는 어셈블리가 있습니다. 저도 처음 보는건데 기능을 보니 엔디언 순서를 바꾸는 기능을 합니다. 즉, 현재 레지스터 창에는 리틀엔디언 값으로 들어있는 EAX(65646F43)을 빅엔디안으로 바꾸는 기능을 합니다.



레지스터창을 보면 EAX와 EDX가 값은 변하지 않고 엔디언 방식만 변경이 되어있는 것을 확인 가능합니다.

 



아래 루틴을 분석 해보겠습니다.



00404075까지 실행을 한 결과입니다. ESI, EDI에 436F6465(Code)를 넣어줍니다.



00404077 ~ 0040407A 실행 결과입니다. 

SHR을 통해 오른쪽으로 EDI, ESI에 18과 10을 Shift 시킵니다. 

결과로는 ESI는 436F(Co)가 되었고, EDI에는 43(C)가 되었습니다. 

오른쪽의 그림은 0040407D 줄에서 AND로 ESI를 0xFF 시킨 값으로 6F(o)값이 되어버립니다.

  



00404083 ~ 0040408A 줄입니다. 404083줄을 실행하면 EBX에는 EB651B88이 되고 40408A줄을 실행하면 EBX와 DS:[] 안의 값과 더해서 45A3463B가 됩니다.

 


404091줄 부터 4040AD줄까지 한 줄씩 실행 해보겠습니다.


404091, 404094줄을 실행했더니 ESI와 EDI에 AH(64), AL(65)가 차례대로 저장이 됩니다.


404097, 40409E 줄을 실행했더니 EBX에는 BB506003 값이 저장 됩니다.

 


4040A5 줄에서는 EBX와 EDX를 XOR해서 EBX에 저장합니다.



ECX를 1증가 시키고, EDX에 EDX + EAX 한 값을 저장합니다. 4040AA 줄에서 ECX와 10을 비교해서 같을 때까지 반복을 하는 형태로 동작합니다.



4040AD 줄에서 EBX의 값을 EAX에 넣습니다.



ECX가 10이 될 때까지 반복을 하기 때문에 BP를 걸고 실행을 하겠습니다. 오른쪽 그림을 보면 ECX가 10이 되었을 때 레지스터 결과 창입니다.

 




반복문에서 구한 것을 가지고 아래 4040B1 ~ 4040CE까지의 명령줄을 트레이싱 해보겠습니다.



4040B1 줄에서 XCHG로 EAX와 EDX의 값을 서로 변경합니다.

 --------> 



4040B2 ~ 4040B8줄은 값이 0이기 때문에 EDX, EAX는 0이되고 ESI에는 ARG.2[4088F0] 주소값이 저장됩니다.

4040C1 ~ 4040C3 줄은 위에서도 설명했듯이 엔디언 순서를 바꿔버립니다.

 




4040C5 ~ 4040C7 줄은 중요한 줄입니다. 밑에서 시리얼 값을 생성하는 구문에서 인자로 사용이 될 것입니다. EAX(F81FFECD)와 EDX(6EB09EB3)을 ESI[4088F0] 주소에 4바이트씩 리틀엔디안으로 바뀌면서 들어갑니다. 

 




404058 함수를 빠져나온 레지스터 창입니다. LEAVE 명령으로 인해 에필로그 과정이 되면서 ESP가 바뀌었습니다. 별 상관은 없는 듯 합니다.




아래의 인자값들과 함께 40115B 함수로 들어가서 분석해보겠습니다. 오른쪽 그림을 보면 인자가 보입니다. 0012FB14주소의 004088F0은 위에서도 봤듯이 [ CD FE 1F F8 B3 9E B0 6E ] 를 인자로 넣습니다. 그리고 두 번째로 0012FB18 주소의 '8'은 NAME(CodeEngn)의 길이이고, 세 번째로 0012FB1C에 있는 00408AF0 주소는 비어있습니다. 이 주소는 함수안에서 사용이 됩니다.

 





함수 안으로 들어와서 00404826 ~ 0040482E 줄을 보면 인자 값 3개를 각각 EBX[ARG.2], EDI[ARG.3], ESI[ARG.1] 를 집어넣습니다. 오른쪽 화면은 값을 모두 넣은 레지스터 창입니다.

 




404833줄부터 00404867줄까지 하나의 루틴입니다. 하나씩 분석을 해서 캡쳐를 해놨는데, 너무 결과가 뻔해서 삭제했습니다. 




루틴의 결과로써 설명을 하면 4088F0에 있던 [CD FE 1F F8 B3 9E B0 6E] 생각나시나요? 이 결과 값들을 아까 세 번째 인자로 주었던 408AF0 주소를 봤을 겁니다. 텅 비어있던 주소였고, 함수에서 쓰인다고 설명했습니다. 햇갈리면 위에 다시 보면 됩니다. 4088F0에 있는 값들을 아스키 코드로 하는 16진수를 408AF0 값에 2바이트씩 적습니다. 





빠져나오게 되면 00401166부터 00401187까지 EAX에 시리얼을 생성하기 위한 인자값을 넣기 위해 계산을해서 넣습니다. 401166줄에서는 4088F0에 있는 CD~6E 값들을 EDI에 넣고, EDX에 524544 값을 강제로 넣고 EAX에는 4088F0 에있는 바이트 하나씩 가져와서 EAX에 넣습니다.

DL에 값을 넣어주는데 [EBX+404768 (40)] 값을 DL에 넣습니다. 그리고 다시 EAX와 EDX를 더하고 EAX에 넣어줍니다. 

다시 EAX는 407AF0(옆에 보이는 아스키 코드(D41D8CD98F00B204E9800998ECF8427E))를 곱해주고 EAX에 넣습니다. 

EDX에 EAX를 더해서 EDX에 넣습니다. EDX는 시리얼 값을 만드는데 또다른 인자로 사용됩니다. 401187줄에서 마지막으로 EAX에서 하드코딩된 587370 값을 빼는 것으로 마무리합니다.




00401187 줄까지 실행한 레지스터 상태입니다.




마지막으로 CodEngn의 Serial 값을 생성하는 곳입니다. wsprintfA 함수로 인자를 EAX와 EDX를 받고 %8X 포맷팅을 이용하여 4080F0 주소에 값을 저장합니다. 



스택창으로 보면 아래와 같습니다. 인자로 EAX(56B6AC0)와 EDX(6162370)이 들어가고 %8X로 포맷한 것을 볼 수가 있습니다.

  



wsprintfA의 리턴 값을 저장한 4080F0 주소를 봤더니 [06162370056B6AC0] 이 결과로 나왔습니다. 



004011CE ~ 004011E0 까지는 GetDlgItemTextA로 비밀번호를 적었던 것(123)을 가져옵니다.




이번 문제는 비밀번호를 가지고 계산하는 것이 아닌 NAME 값을 가지고 계산을 복잡하게 진행하는 것을 볼 수가 있습니다. 

4011EF 줄에서는 lstrcmpiA 함수로 아까 wsprintfA로 구한 값과 임의로 적어준 비밀번호(123)과 비교합니다. 

즉, name이 CodeEngn 일 때 시리얼이라는 것을 알 수가 있습니다. 




둘의 값이 같다면 Z 플래그가 1이되며 JE 점프문을 통해서 성공 루틴으로 갈 것입니다.



맨 뒤에 답만 보러 오는 분도 있겠지만, 과정을 봐주신 분들께 정말 감사드립니다. 부족한 설명과 그림 때문에 더 햇갈릴수 도 있었겠네요..




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

[codeEngn] Basic RCE level19  (0) 2015.07.31
[codeEngn] Basic RCE level17  (2) 2015.07.30
[codeEngn] Basic RCE level16  (0) 2015.07.30
[codeEngn] Basic RCE level15  (0) 2015.07.29
[codeEngn] Basic RCE level14  (0) 2015.07.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함