Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

kaka09

code engn basic 14 본문

Reversing

code engn basic 14

kaka09 2017. 8. 2. 19:14

[사진]1-1



이번 문제는 시리얼을 구하는 문제이다. bruteforce 기법을 이용해야 한다는데.. 일단 PEID로 패킹이 되어있는지 부터 검사 하였다.




[사진]1-2


UPX로 패킹되어 있는걸 확인할 수 있다. 올리 디버거로 디버깅을 시도해보자



[사진]1-3


OEP로 진입후 다음과 같은 어셈코드를 확인 할 수 있다. 서브함수로 00401025로 진입해서 어떠한 루틴을 처리하는것을 알 수 있다. 일단 시리얼키를 찾기 위해서 스트링 검색을 시도해 보았다.




[사진]1-4



스트링을 찾아보면 밑에 Good Job 으로 시작하는 문자열을 확인할 수 있다. 해당 영역으로 이동하여 어셈코드를 살펴보자


[사진]1-5


"Godd job~~" 으로 시작하는 문자열의 영역을 들어가서 확인해보면 위에서 분기문이 존재하는것을 확인할 수 있다. CMP EAX,ESI 비교를 통해 키값이 일치하는지 아닌지의 메세지를 출력하는 구조라고 볼 수 있다. 즉 키값은 ESI안에 들어 있는것이고 서브함수 00401383에서 반환되는 EAX값과 비교해서 일치해야만 "Good job~~" 메세지를 보여준다. 직접 동적디버깅을 통해 분석해보도록 하겠다.



[사진]1-6


004012F6에 브포를 잡고 실행해 보면 왼족 [사진]1-6 에서 보이는바와 같은 창이 하나 뜬다. 2개의 입력값을 받을 수 있는데 1234 와 1000을 주었더니 올리 디버거에서는 오른쪽 처럼 사용자가 입력한 인자가 저장이 된다.  사진을 보면 입력받은 인자 2개를 각각 따로 처리를 하는 느낌을 받을 수 있다. 첫번째 입력값에 대한 처리는 0040132B 까지임을 알 수 있고 두번째 입력값에 대한 처리는 00401383에서 처리가 되는것 같다. 여기서 필자는 값을 계속 바꿔가면서 여러번 실행을 해본 결과 마지막에 키값이 ESI 레지스터에 저장이 되는데, 입력값이 바뀔때마다 ESI에 저장되는 키값도 매번 바뀌게 된다. 따라서 첫번째 입력값으로 어떤 키값이 생성되는지 그 알고리즘을 분석하고 결과는 다음과 같았다.


예를 들어 사용자가 "1234"라는 입력값을 받는다면 해당 프로그램에선 다음과 같은 처리를 한다.

1. 1234 입력시 길이만큼 반복

2. 1234에서 한글자씩 빼와서(아스키 코드로) 다음과 같은 작업을 반복한다.

   edx,ebx=31

   ebx=31*31

   esi=ebx+esi

   esi=esi+(31>>1)

   esi=esi-31


3. 입력값 1234에 대한 반복처리후 ESI에 저장되는 값은 2778h 임을 알 수있다.


즉 분기문에서 EAX와 ESI가 같은지를 비교하니 EAX 값도 2778h로 만들어야 함을 알 수 있다. 따라서 이번에는 두번째 입력값을 처리하는 서브함수인 00401383 안에 들어가서 동적 디버깅을 시도해보자 




[사진]1-7


00401383 함수로 진입후 어셈코드를 살펴보면 입력갑 "1000"에서 한글자씩 빼오는 과정은 동일하다. 이때 입력값을 빼서 EAX에 저장하게 되는데 위 처럼 아스키코드로 저장되는 것이 아닌 정수형태 그대로 저장하게 된다.

EX) 1234

     EAX=1  234

     EAX=2  34

    EAX=3  4

 이런식 으로..


이렇게 숫자 하나씩 빼와 

IMUL EAX,EAX,0A

ADD EBX,EAX 
위와 같은 반복루틴을 거듭 수행하여 최종적으로 EBX에 있는 값을 EAX로 옮겨 리턴하게 된다. 1000 입력시 3EB 라는 값이 나왔는데, 이는 10진수 1000에 대한 16진수 값이다. 즉 이전 ESI에 저장된 2778h 과 일치시키기 위해서는 2778에 10진수의 값을 두번째 입력값에 넣어주면 된다는 이치가 성립한다. 따라서 2778의 10진수인 10104를 입력하여 실행해보면 정확히 성공메세지가 출력하는것을 알 수 있다.



[사진]1-8


성공 메세지가 출력되었다. 그러면 이제 첫번째 입력값에 CodeEngn을 입력하면 ESI에 어떤 값이 저장되는지 확인해보자


 




[사진]1-8


첫번째 입력값에 CodeEngn을 입력하였더니 ESI에 129A1 이라는 값이 저장되었다. 그러면 해당값을 10진수로 바꿔서 두번째 입력값에 넢으면 문제는 풀릴것이다.





 

[사진]1-9







'Reversing' 카테고리의 다른 글

code engn basic 16  (0) 2017.08.02
code engn basic 15  (0) 2017.08.02
code engn basic 13  (0) 2017.08.02
code engn basic 12  (0) 2017.08.02
code engn basic 11  (0) 2017.08.01