Never Stop Running
[CodeEngn] BASIC 14 본문
* 리버싱 공부를 위한 문제풀이로
정답을 찾는 것과는 조금 다를 수 있습니다.
[CodeEngn] BASIC 14
문제 풀이 환경 |
Windows 10 / Intel / x32dbg / UPX |
문제 URL |
BASIC 14번 문제.
문제는 Name이 CodeEngn일 때 나오는 Serial값을 구하는 것이다.
일단 프로그램을 실행시키면 두 개의 입력값을 받는데, 위에 'CodeEngn'을 입력하고 밑에 Serial을 입력하면 될 것이다.
메모리 맵을 보니 UPX로 패킹되어있다.
BASIC 5번에서 풀었던 것처럼 UPX툴을 사용하여 언패킹하고 프로그램 분석을 진행한다.
[다음을 찾기] - [현재 모듈] - [문자열 참조]를 하고 'Good'을 타이핑 하여 검색하면 성공시에 뜰 법한 문자열이 2개 나타난다. 이 프로그램 코드부분 주소는 메모리 맵에 나타난 [00401000] ~ [00402000]이다. 이 사이의 주소를 가진 [00401345] 코드가 프로그램 실행 시 사용될 것이라고 생각했다.
'Good'과 'Wrong'을 결정하는 분기문 위의 CMP 코드에 Break Point를 걸었다.
임의의 Serial값을 넣었다. Name = CodeEngn, Serial = 123456.
프로그램이 정지하였다. 맞는 코드부분을 찾은 것 같다.
위에 코드를 보니 GetDlgItemTextA 함수가 두 개 있다. 둘 다 Break Point를 걸고 실행시키니 첫번째 함수에서 멈췄다.
두 개를 다 지나고 난 후 데이터의 위치를 보았다. Name은 [00403038]위치, Serial은 [00403138]위치에 저장된다.
밑의 메모리 영역에서 Serial값이 잘 들어있는지 확인했다.
Name값도 들어있는 것을 확인했다.
CMP는 EAX와 ESI를 비교하고, ESI는 반복 루프([00401309] ~ [0040132C])에서 값이 변한 후 스택에 저장되고 후에 CMP문 전에 다시 레지스터 값으로 돌아온다. 즉, ESI는 루프에서 변한 값 그대로라는 것이다.
간단하게 반복문이 끝난 후 ESI값을 봐도 되지만 리버싱 공부를 위해 반복문을 분석한다.
편의상 주소는 맨 뒤 1Byte만 표시한다. 또한, 처음 루프 돌 때의 분석값이다.
주소 |
코드 |
분석 |
09 | MOV EDX, [NAME 주소] | EDX = 65646F43 (edoC -> Code) |
0F | MOV DL , [EAX + (NAME -1) 주소] | EDX = 65646F43 2A에서 EAX++ 하는걸로 보아 EDX의 맨 끝 1Byte(DL)에 'CodeEngn'이 하나씩 들어감 |
15 | AND EDX, FF | EDX = 00000043 -> 맨 끝 한자리 즉, 0F에서 MOV한 값만 남음 |
1B | MOV, EBX, EDX | EBX = 00000043 |
1D | IMUL EBX, EDX | EBX = 0x43 * 0x43 = 0x1189 |
20 | ADD ESI, EBX | ESI = ESI + EBX = 0 + 0x1189 |
22 | MOV EBX, EDX | EBX = 00000043 |
24 | SAR EBX, 1 | 1000011(0x43) -> 100001(0x21) |
26 | ADD ESI, EBX | ESI = ESI + EBX = 0x1189 + 0x21 = 0x11AA |
28 | SUB ESI, EDX | ESI = ESI - EDX = 0x11AA - 0x43 = 0x1167 |
2A | INC EAX | EAX++ |
2B | DEC ECX | ECX-- |
이렇게 보면 ESI = ESI + DL^2 + sar(DL) - DL의 형태로 8번 반복한다.
(DL은 EDX는 맨 끝 1Byte / 'CodeEngn'이 한 단어씩 들어감)
이렇게 계산하여 ESI = 0x129A1이라는 값을 구할 수 있다.
혹은 그냥 반복문이 끝난 후 ESI값을 확인해도 된다.
ESI = 0x129A1 = 76193이므로 Serial = 76193.
'Training > Codeengn' 카테고리의 다른 글
[CodeEngn] BASIC 15 (0) | 2018.09.24 |
---|---|
[CodeEngn] BASIC 13 (0) | 2018.09.24 |
[CodeEngn] BASIC 12 (0) | 2018.09.24 |
[CodeEngn] BASIC 10 (0) | 2018.09.24 |
[CodeEngn] BASIC 08 (0) | 2018.09.24 |