2015. 8. 16. 10:20ㆍSecurity ★ Development/Reversing
http://codeengn.com/challenges/advance/15
Problem : Find the Serial when the Name of "CodeEngn.com"
Ex) AAAAAAAAAAAAAAAA이번 문제는 Unlock Code라는 것부터 찾아야합니다.
파일을 ollydbg로 열면 일종의 팩이 되어있다는 것을 알 수 있습니다. UPX는 아닙니다.
PEiD로 보면 이미지베이스 00400000에 코드베이스 00001000이라고합니다. 시작 주소는 00401000이 되겠네요.
back to user mode라는 방법을 이용합니다. 간략히 설명하면 프로그램을 실행시켜 특정 이벤트 발생으로 인한 멈춤 상태까지 간 다음에 일시정지 - Execute till user code를 누른 후 이벤트를 계속 진행시킵니다. 그럼 해당 이벤트 위치로 코드가 이동하게 되며 이런 방법으로 00401000의 코드를 확인할 수 있습니다. 한번 찾아두면 다음부터는 ollydbg가 알아서 코드분석을 해줍니다. 처음 ollydbg를 켜자마자 00401000의 위치로 가면 이상하게 보이지만 이 방법으로 가면 제대로 언팩된 코드를 볼 수 있습니다.
GetDlgItemTextA를 힌트로 해당 부분에 bp를 걸어봅니다. 그 아래에 "You have entered~"와 바로 위에 점프문도 있네요. 이 부분이 Unlock Code의 행방을 가르는 부분이라는 것을 알 수 있습니다.
CMP EAX, 7과 JBE로 인해 코드는 8글자 이상이어야 합니다. aaaaaaaa로 하겠습니다. 그럼 name과 serial 부분에 입력을 할 수 있게 됩니다.
그런데 계속 진행하다보면 그 후 코드가 다시 이상해집니다. aaaaaaaa을 넣고 name과
serial을 아무 값이나 넣고 check해보면 프로그램이 죽습니다.
ollydbg에서는 I/O command 라는 코멘트가 있는 부분에서 죽으며 위아래로 보면 004011C0의 NOP아래로 쭉~ 0040123B까지 코드가 이상하다는 것을 확인할 수 있습니다.
코드가 이상한 부분으로의 진입점은 00401135의 CALL 004011E8입니다. 그런데 004011E8은 함수의 시작점인데도 불구하고 ADD BL, AH로 되어있습니다. 실제로 이 부분은 Unlock Code로 뭐가 들어가는지에 따라 코드가 변경됩니다. 그리코 코드의 변경은 004010A7의 CALL 004012F7이 실행된 이후에 이루어집니다.
005012F7의 함수를 보면 unlockcode의 길이를 1과 비교하고 아래에 문제의 주소값인 004011C1과 0040123C가 있습니다. 함수 내의 반복은 해당 명령문만큼인 7B번 이루어지며 403318의 값과 DL을 XOR연산하고있습니다. EBX+EAX의 값은 문제의 코드 부분으로 이 주소의 값, 즉 명령어를 바꿔주고 있습니다. EBX의 값을 하나씩 올리면서 코드를 밑으로 훑고 있네요.
그런데 00403318의 값은 현재 72로 고정값입니다. 이 값으로 모든 코드를 바꿨을 때 004011E8의 코드는 ADD BL, AH로 원하는 명령어가 아닙니다. 함수의 기본 시작 형태인 PUSH EBP는 55. 즉, XOR 결과를 55로 만들어줍니다. 현재 004011E8의 값은 70. 70과의 XOR연산으로 55가 나오는 수는 0x25입니다. 00403318의 값을 25로 만들어주어야 하는데 의심되는 코드로 0040109F의 CALL 004012CD를 봅니다. 코드의 언팩은 특정 값에 따라 달라지는데 이 값은 00403318에 있고 unlockcode에 의해 결정되면 unlockcode를 다루는 함수를 의심해볼 수 있습니다. 해당 함수 내에서 루프를 돌면서 403318의 값을 바꿔주고 있습니다. 8자리 이상의 조합으로 루프를 거쳐 25가 나오게 하는 경우의 수를 이전과 같이 브루트포스를 이용할 수 있겠지만 문제는 unlockcode를 구하는 것이 아니므로 00403318의 값을 직접 수정해주겠습니다.
제대로 된 값으로 언팩된 프로그램에 name 문자열 CodeEngn.com을 넣으면 바로 serial을 확인할 수 있습니다.
여기저기서 보이네요.
'Security ★ Development > Reversing' 카테고리의 다른 글
리버스엔지니어링 문제 Advance 17 (1) | 2015.08.29 |
---|---|
리버스엔지니어링 문제 Advance 16 (0) | 2015.08.24 |
리버스엔지니어링 문제 Advance 14 (0) | 2015.08.14 |
리버스엔지니어링 문제 Advance 13 (2) | 2015.08.09 |
리버스엔지니어링 문제 Advance 12 (0) | 2015.07.12 |