L05. 이 프로그램의 등록키는 무엇인가
PEiD 프로그램을 통해서 05.exe가 패킹되었는지 확인한다. EP Section을 확인한 결과, UPX로 패킹되어 있다는 것을 확인할 수 있다. 패킹된 실행파일은 언패킹을 하기전에 PUSHAD 명령어를 통해서 레지스터의 상태를 저장해 놓고 언패킹이 완료되었을 때 POPAD 명령어를 통해서 레지스터의 상태를 복구한다. 하지만 이번에는 UPX 패킹 툴을 사용하여 언패킹한다.
언패킹하고 다시 PEiD를 통해 05.exe를 확인한다.
올리디버거에서 Search for > All referenced text strings를 클릭하여 코드에서 참조되는 문자열 목록을 확인한다. 성공했다는 메시지 문자열 위치에 있는 등록키 찾고 ID와 PW를 입력한다.
성공 메시지가 출력된다.
L06. Unpack을 한 후 Serial을 찾으시오.
PEiD 프로그램을 통해 06.exe가 UPX로 패킹되어 있음을 확인한다.
Upx –d 06.exe 명령어로 언패킹.
OEP : Original Entry Point - 패킹된 파일의 실제 프로그램 시작 부분. OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어서 압축을푸는 명령어
OEP가 00401360임을 확인.
연결된 API를 확인하는 방법으로 search for – all intermodular calls에 들어가 ‘messagebox’가 있는 것을 확인하고 그 위치로 이동
TEST : 첫 번째 Operand와 두 번째 Operand를 AND 시킵니다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고버려집니다. 즉 test 명령어는 단지 eax의 갑이 0인지 아닌지를 판단하기 위해서 사용.
JNZ : 제로 플래그의 결과값이 0이면 점프시키는 구문
JNZ SHORT 06.004010A3은 Test EAX,EAX의 결과 값으로 0이 나오지 않았을 때 004010A3으로 이동 후 ‘wrong serial’ 메시지 출력하는 MessageBoxA 함수를 호출.
입력창에 임의의 값 ‘serial’ 입력하고 F8로 실행한 결과 GetDigItemTextA를 지나면서 입력값과 ‘AD46DFS547’을 비교하는 것을 확인. (test eax, eax)
둘이 일치하지 않아 wrong serial 이라는 문구의 messagebox가 뜨는 것을 확인. 따라서 ‘AD46DFS547’ 값이 시리얼 넘버라는 것을 확인.
시리얼 키 ‘AD46DFS547’ 입력하면 ‘you got it’이라는 메시지 박스가 뜨면서 성공
OEP + serial => 00401360 AD46DFS547
L07. 컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가
우선 프로그램을 실행시키고, 의미 없는 문자를 입력해보았다.
시리얼이 일치하지 않는다는 메시지를 띄우고 프로그램이 종료되었다.
다음은 PEiD에서 실행시켜보았다.
이번 문제는 패킹되어 있지 않은 것을 확인할 수 있었다.
다음으로 올리디버거에서 실행시켜보고, 출력문이 나오는 곳을 찾아보았다.
맞는 시리얼 값과 틀린 시리얼 값을 입력했을 때 출력되는 문장을 찾을 수 있었다. 0x004010FC에는 CMP 명령어가 있었는데, EAX 값과 0 값을 비교하고 있었다. EAX 값과 0을 뺐을 때 0일 경우 ZF(Zero Flag)가 1이 되는데, 그 값이 1이면 JE문이 실행되어 실패 메시지를 출력하게 된다. 앞서 의미 없는 문자열을 넣었을 때는 EAX 값이 0이었기 때문에 JE문이 실행되어 실패 메시지가 출력되었다.
그래서 비교되는 문장이 무엇인지 확인하기 위해 0x0040106C에 BP를 걸고 한 줄 씩 실행시켜보았다.
0x004010A3 Dest에 “CodeEngn4562-ABEX”라는 문자열이 생성된 것을 확인할 수 있었다. 즉, 여기서 c 드라이브의 이름 ‘CodeEngn’에 ‘4562-ABEX’가 붙은 것이다. 이제 이 문자열이 어떻게 변화하는지 알아내기만 하면 된다.
0x004010AD에서 DL에 2를 넣고 0x004010CB에서 하나씩 감소시키는 것을 보니 2번 반복하는 것을 알 수 있었다. 그렇다면 40225C, 40225D, 40225E, 40225F에 들어있던 값 Code가 Eqfg로 변한 것을 0x004010A3에서 확인할 수 있었다.
즉, 반복문을 통해 아스키 코드 값을 2씩 증가시켰다는 것이다.
앞에서 얘기한 CMP문 직전까지 실행시켜보니 c드라이브의 이름이 ‘CodeEngn → CodeEngn4562-ABEX → EqfgEngn4562-ABEX → L2C-5781EqfgEngn4562-ABEX’로 변화했음을 아래와 같이 확인할 수 있었다.
변화한 값과 입력문을 비교하고 있으므로 결국, Serial 값은 L2C-5781EqfgEngn4562-ABEX이다.
이를 입력해보니 다음과 같이 성공 메시지가 출력되었다. 정답 창에는 CodeEngn이 변화한 값, EqfgEngn을 입력하니 다음과 같이 성공이 출력되었다.
L08. OEP를 구하시오 Ex) 00400000
PEiD 프로그램을 통해 08.exe가 UPX로 패킹되어 있음을 확인한다.
UPX로 패킹된 파일을 언패킹한다.
OEP는 Original Entry Point로 프로그램 진입 시 시작되는 곳의 주소를 의미한다. 따라서 실행 시 표시되는 부분의 OEP는 1012475이다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2020.11.07]CodeEngn Challenges Basic RCE L13 ~ L16 라이트업 (0) | 2020.11.07 |
---|---|
[2020.10.10]CodeEngn Challenges Basic RCE L09 ~ L12 라이트업 (0) | 2020.10.10 |
[2020.9.19]CodeEngn Challenges Basic RCE L01 ~ L04 라이트업 (0) | 2020.09.20 |
[2020.06.16] 리버싱 핵심원리 | Hello World 문제 (0) | 2020.07.02 |
[2020.06.16] Reversing.kr | Position 문제 (0) | 2020.07.01 |