연산 루틴 리버싱 - 시리얼 추출 방법
F-Secure Reverse Engineering (FSC)
2007년 F-Secure 해외 백신 회사에서 개최한 리버스 엔지니어링 대회 문제들이다
문제의 스타일은 일반적인 시리얼 연산 루틴이 주를 이루고 있다
※ 공부 목적으로 문제를 풀기 때문에 최대한 분석하고 여러 방법으로 푸는 것을 목적으로 했습니다
FSC Level 2
00. 프로그램의 Import 함수 확인하기
00-1) PEiD로 프로그램 파악하기
PEiD로 FSC_Level2.exe가 UPX1로 패킹되어 있는 것을 확인할 수 있다
안에 있는 Import문을 확인 하기위해서는 언패킹을 하고 확인 해야한다.
언패킹 방법은 수동 언패킹과 프로그램을 이용한 언패킹이 있는데 지금은 프로그램을 이용한 언패킹을 사용했다
upx -d를 이용해서 FSC_Level2.exe를 언패킹 한다 (이전에 사본은 따로 만들었다..)
upx -d -o 를 이용하면 따로 사본을 만들지 않고 언패킹한 파일을 따로 만들 수 있다
언패킹 후 Import 함수를 확인했을 때 GetCommandLineA, MessageBoxA, wsprintfA 함수를 사용한것을 확인 할 수 있다
여기서 가장 중요한 GetCommandLineA를 확인해본다
※ import 함수중 모르는 것이 있을 때는 함수명 msdn 을 입력하면 함수에 대해 알 수 있다!!!!
GetCommandLineA는 프로세스에 대한 명령줄 문자열을 검색하는 함수인데
프로그램을 실행할 때 파라미터로 정답을 찾을 수 있다
01. 프로그램 파악
언패킹 후 얻은 OEP에서 부터 파악한다
0x401186부터 0x4011B5까지 한글 자씩 EDX에 추가한다 -> "D:\\FSC_Level_2.exe(프로그램 경로)" 1111(인자)"
EDX는 문자열의 마지막 포인터를 가리킨다
여기서 부터는 공백을포함한 파라미터 값이 4개인 것을 확인할 수 있다
-> [EDX-5](EDX 뒤에서 5번째 1Byte값을 가져온다) MOV AL, 20(20 :공백) 이므로 맨뒤 다섯번째 값이 공백이라 파라미터값이 4자리인것을 확인할 수있다
[EDX-4] 4바이트를 가져오는 것을 봐서 파라미터 값을 가져와서 XOR 0x5528566D를 하고 그 결과 값을 통해
AH와 BH를 XOR하는 것을 확인할 수 있다
BH는 계속 0이라서 XOR하더라도 자기 자신값이 나온다
[EDX-6]은 파라미터 이후 공백 다음 오는 문자를 의미한다
[EDX-6] 값과 0x22(")를 비교하는 것을 확인 할 수 있다
PTR DS :[EDX-A]라서 EDX 뒤에서 10번째 자리부터 4자리를 가져오는데 확인해보면 .exe 값인 것을 알 수 있다
.exe를 DWORD로 형변환을 하면 0x6578652E라는 것을 확인할 수 있다
이전에 비교했던 값과 지금 나온 값을 비교하면 정답이 나온다
param XOR 0x5528566D == 0x6578652E XOR param
그러면 param = 0x5528566D XOR 0x6578652E 를 하면 파라미터 값을 구할 수 있다
계산한 결과 0x5528566D XOR 0x6578652E = 0x30503343이라는 것을 확인했다
이제 0x30 0x50 0x33 0x43을 각각 아스키코드로 변환하면 0 P 3 C 인데 이것을 리틀엔디안 방식을 다시 정렬 하면
C3P0이라는 파라미터값을 확인할 수 있다
정답을 확인할 수 있다
'개인 공부 > 리버싱' 카테고리의 다른 글
Reversing Lena3 (1) | 2023.05.28 |
---|---|
Reversing Lena1 (0) | 2023.05.24 |
Reverse Engineering-11(FSC_Level1) (0) | 2023.05.11 |
Reverse Engineering-10 (MFC) (1) | 2023.05.08 |
Reverse Engineering-009(strcat ~ strlwr) (1) | 2023.04.27 |