리버스엔지니어링 문제 Advance 14

2015. 8. 14. 11:42Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/14


Problem : Find the Name when the Serial of NH6-0-0091008D0052 


이번에도 시리얼이 있을 때 Name을 찾는 문제입니다.


ollydbg로 문자열을 찾아보려했으나 찾기가 어려워 Process Explorer를 써보니 메모리에서 확인할 수 있었습니다.


ollydbg에서 해당 프로그램 메인모듈을 맞춰놓고 string 검색을 해보면 찾을 수 있습니다.

그럼 해당 부분에 bp를 걸고 디버깅을 해봅니다.

name과 serial을 초기상태로 아무렇게나 놓고 check를 누르면 여러 점프문중에 윗부분에서 Invalid부분으로 뜁니다.

name을 aaa, serial을 문제에서 제시한대로 해놓으니 다 통과하고 "Registered~" 부분 바로 위에서 점프를 합니다.


0047F443에서 이런 부분으로 들어오는데 EAX와 EDX에 두 문자열이 있습니다.  name을 바꿔서 넣어보면 EAX에 들어있는 것이 serial로 인한 비교값이란 것을 알 수 있습니다.  당연하게도 아래 CMP에선 두 문자열의 값들을 비교해주고 있습니다.  0047F438의 함수로 갑니다.  여기선 입력해준 name을 EAX에 가지고 들어갑니다.


함수 내부에서 이곳을 보면 위의 CMP와 아래의 JNZ사이에서 돌면서 입력해준 name값을 14byte로 맞춰줍니다.  문자가 14글자가 되도록말이죠.


그 아래 이부분이 name으로 키를 생성하는 부분입니다.  mov와 movzx 쌍이 있는데 EDI, EAX에 각각 name과 여기서 처음 보는 "NH KeyGenMe6"이라는 문자열의 각 값을 하나씩 넣습니다.

그리고 두 값을 더해주면 00AF라는 값이 생성됩니다.(61+4E)

저는 name으로 abcd를 넣었기 때문에 다음 값은 62+48인 00AA가 됩니다.

계산이 끝나면 이런 긴 문자열이 생성됩니다.

비교할 때는 앞의 3쌍만 가져오게 되죠.

이제 "NH "의 값으로 91, 8D, 52를 만들게 되는 문자 3개를 찾으면 됩니다.