리버싱 스터디 - 코드엔진 #5,6

리버싱 스터디

2019. 10. 7. 01:55

작성자: 이희찬

 

문제 #5

 

 

5번 문제를 실행시키면 다음과 같이 일련 번호를 알아내야하는 문제라는 것을 알 수 있습니다.

 

 

 

마찬가지로 OLLYDBG로 실행시켜서 순서대로 작동시키면

다음 jB 구간을 반복해서 작동하고 다음 구간으로 넘어가지 않고

 

 

 

'Wrong Serial, try again!' 문자열을 찾기 위해 도구를 열였는데 아무것도 나타나지 않는다.

검색을 해보니 패킹이라는 가정을 통해서 코드를 압축시킨 것 같다.

 

이때 패킹은 실행 압축을 뜻하는데 흔히 접할 수 있는 .zip와 .par은 직접 압축을 해제 해야하지만 실행 압축은 실행과 동시에 해제가 되어 실행이 된다. 

 

패킹은 실행 파일인 PE(Portable Excutable) 파일을 대상으로 파일 내부에 압축 해제 코드를 포함하고 있어 데이터 압축, 악성 코드의 경우 작은 용량으로 안걸리도록 하는 목적을 가지고 있다. 

 

패킹은 PE 패커라는 Run Time 패커를 이용해서 가능한데 크게 순수한 의도의 패커와 불순한 의도의 패커로 나눌 수 있다. 

 

 

이러한 패킹된 프로그램의 코드를 볼 수 없으니 우선 어떤 PE 패커를 이용했는지 알기 위해서 PEID 프로그램을 사용한다.

 

 

 

 

PEID 프로그램 사용 시 UPX를 사용하여 PE 패커를 하였다는 것을 알 수 있다. 

 

따라서 UPX 압축 및 해제하는 프로그램을 다운 받아서 cmd로 실행시킨다.

 

(인도우 cmd 에서는 ls 명령어가 없어 다음 명령어를 통해서 파일 추적이 가능하다.)

해당 폴더에서 upx 명령어를 사용하여 해당 프로그램을 upx 압축 해제를 한다. 

(-d 옵션이 해제 옵션)

 

 

 

다시 PEID로 확인하면 해제가 되었을 알 수 있다. 

 

 

해제된 프로그램을 가지고 다시 문자열을 확인해보면 'Wrong Serial, try again!'을 볼 수 있다. 

해당 메모리로 따라가보면

 

 

 

 

ASCII 코드 두개의 "Registered User"와 "GFX-754-IER-954"를 볼 수 있다. 

해당 코드 뒤 Call 되는 코드를 통해서 00403B2C로 따라가면

 

 

 

다음 코드를 볼 수 있는데 입력한 값은 EAX에 앞선 코드에 있는 아스키 코드는 EDX에 들어가서

두 문자열을 비교하는 코드임을 알 수 있다. 

 

또한 해당 루프문 반복 후에 두 경우 모두 JNZ로 0이 아닌 경우 jump해서 Failed가 나도록 되어있다.

따라서 두 문자열이 모두 맞아야지 성공하는 것을 알 수 있다.

 

 

 

 

 

따라서 다음과 같이 입력하면 Crack이 가능하다.

 

 

 

 

문제 #6

코드엔진 문제에서도 나와있듯이 해당 문제도 5번과 같이 압축이 되어있다.

6번 문제를 실행시키면 다음과 같이 맞는 시리얼 번호를 찾아야함을 알 수 있다. 

 

 

 

PEID 프로그램 결과 UPX로 압축되어 있음을 확인하고 위와 똑같은 과정으로 UPX를 해제하면 될 것같다.

 

 

 

 

(프로그램을 구동시키면서 압축 해제를 하면 다음과 같이 Failed이 발생한다.)

 

 

 

 

똑같은 명령어로 압축을 해제 하고 

 

 

문자열 중에서 'Wrong serial!!!' 메모리를 찾아서 따라오면 

역시나 'Good job!'앞에서 Failed를 먼저 확인하는데

 

'JNZ'를 통해서 위에서 값을 비교함을 알 수 있고 

'TEST EAX, EAX' 문을 통해서 위 아스키 구문의 'AD46DFS547'이 시리얼 번호임을 알 수 있다. 

 

 

 

 

끝으로 문제에서 OEP도 구하라고 하는데 OEP는 Original Entry Point로 패킹 된 파일의 압축 푸는 명령어 후 실제로 프로그램의 시작 위치를 나타내는 포인트이다. 

 

 

따라서 00401360임을 알 수 있다. 

'리버싱 스터디' 카테고리의 다른 글

코드엔진 문제 - #3, #4  (2) 2019.09.29