#About
Author : Acid Bytes [CFF]
Korean :
이 프로그램의 등록키는 무엇인가
English :
The registration key of this program is?
#Contents
프로그램에 등록된 시리얼키를 찾는 것이 문제이며, 패킹의 개념을 이해하는 것을 목적으로 한다
#Solution
[그림 1] - 실행
[그림 2] - 에러
프로그램 실행시 나와있던 키 값으로 등록을 진행해보았지만 시리얼 값이 올바르지 않다는 문구를 볼 수 있음
[그림 3]
디버거로 해당 프로그램을 열었을 때, 코드 섹션의 압축과 암호화 또는 많은 양의 데이터가 끼워져 포함되어 있다는 문구를 확인할 수 있음
[그림 4]
처음보는 메시지였기에 잠깐 보류해두고 디버거로 해당 프로그램에 사용된 API를 확인해보기 위해 "Search for > All intermodular calls"
옵션을 사용했을 때 무언가 이상함을 느낄 수 있었고 에러메시지를 기반으로 검색해보았더니, 패킹이 되어 있음을 알 수 있었다
패킹이란 실행압축이라는 의미를 가지며 그 의미인 즉슨 파일 내부에 압축해제코드를 포함하고 있어서
실행될 때 메모리단에서 압축해제 후 실행시키는 기술을 의미한다
패킹을 진행하는 이유는 코드 분석을 통한 프로그램의 악용을 막는 용도로 많이 활용되며 구체적 설명으로는
정상적으로 프로그램이 실행되었을 때 자동으로 언패킹이 진행되며 원본코드가 동작하도록 하지만
코드 분석을 위해 접근했을 경우 패킹이 되어있기 때문에 원본코드의 분석의 어려움을 겪거나
원본코드의 OEP(Original Entry Point) 또는 디버깅에 필요한 정확한 위치를 찾지 못하게 하는 것에 초점이 맞춰져 있음
[그림 5] - 패킹 여부 확인
UPX(Ultimate Packer for eXecuteables)라는 방식으로 패킹되어 있었고 언패킹을 아래와 같이 진행했다
[그림 6] - 언패킹
언패킹을 위한 옵션 d와 원본 실행파일의 보존을 위해 k옵션을 주고 언패킹을 진행했고, 실행파일의 사이즈가 증가함을 확인할 수 있다
[그림 7] - API 목록
언패킹을 진행 후에는 [그림 4]와 달리 실행파일에 사용된 API 목록들을 확인할 수 있었으며 아래와 같이 아스키 텍스트도 확인할 수 있었다
[그림 8] - 아스키 텍스트 값 확인
[그림 9]
[그림 8]의 아스키 값과 [그림 9]의 어셈블리코드를 확인결과 인증로직이 있음을 알 수 있었고 로직은 다음과 같다
if ( name == empty ){printf("Enter a Name!");
elif ( serial == empty ){
printf("Enter a Seiral!");
elif ( name == Registered User && serial == GFX-754-IER-954 ){
printf("Congrats! You cracked this CrackMe!");}}}
if ( name == FALSE ){
printf("Wrong Serial, try again!");
elif ( serial == FALSE ){
printf("Wrong Serial, try again!");}}
[코드 1] - 코알못 이해좀 (+어셈)
[그림 10] - 인증
'Wargame' 카테고리의 다른 글
CodeEngn Basic 7 (0) | 2017.09.24 |
---|---|
CodeEngn Basic 6 (0) | 2017.09.13 |
CodeEngn Basic 4 (0) | 2017.09.05 |
CodeEngn Basic 3 (0) | 2017.09.05 |
CodeEngn Basic 2 (0) | 2017.09.04 |