[코드엔진] Basic RCE L06 풀이

비얌·2022년 3월 7일
0

어셈블리 게임

목록 보기
5/15

코드엔진 Basic RCE L06을 IDA로 분석하여 풀어보려고 한다.

문제 파일을 실행해보면 다음과 같이 실행되고, 아무 시리얼 번호나 입력해보면 Wrong serial!!!이라는 창이 출력된다.


문제는 다음과 같다.


따라서 우리는 첫번째로 Serial, 두번째로 OEP값을 찾아야 한다.

파일을 우선 Detect It Easy에 올려보았다. upx로 압축된 파일이라고 뜬다.


그래서 일단 upx로 언패킹을 해서 패킹된 파일, 언패킹한 파일 이렇게 각각 한개씩을 만들어뒀다.



이제 Serial과 OEP를 구해보자.


Serial값 찾기

이제 Serial값을 찾아보자.

언패킹된 파일을 IDA로 열어보았다. F5를 눌러 디컴파일하면 아래와 같은 win32api가 보인다.


이 함수를 더블클릭해서 들어가봤다. DialogBoxParamA와 LoadIconA가 보이는데, LoadIconA는 아이콘을 로드하는 함수로 보이고 DialogBoxParamA는 메세지 박스를 만드는 함수이다.

  • DialogBoxParamA에 대한 설명은 다음과 같다.


DialogBoxParamA의 DialogFunc을 더블클릭해서 들어가봤다.

그리고 sub_4011A0 안의 sub_401005함수에 들어갔다.


sub_401030()함수를 더블클릭해서 들어간다.


스트링 비교 함수 strcmp함수가 나온다. Str1과 Str2를 비교한 후 같으면 “You got it;)”을 출력한다고 한다.


Str1을 더블클릭해서 들어가보았다. Str1은 AD46DFS547 이다. 따라서 시리얼값은 AD46DFS547인 것 같다. 확인해보자.


맞는 것을 확인했다!



OEP 찾기

OEP란? OEP(Original Point)는 특정 언팩 루틴이 수행되고 정상 바이너리 흐름이 시작되는 곳을 의미한다. 일반적인 프로그램은 실제 시작점이 프로그램 실행 시 시작점과 동일하지만 패킹이 되면 실제 OEP가 숨겨져 있게 된다.

(1) 패킹된 파일의 OEP는 언패킹한 파일의 EP

패킹킹된 파일의 OEP는 언패킹한 파일의 EP와 같다. 따라서 UPX로 언패킹한 파일의 EP인 00401360이 이 실행파일의 OEP이다.

(2) PUSHAD/POPAD명령어 찾기

  • UPX는 PUSHAD와 POPAD를 활용해 언패킹한다.
  • PUSHAD: 범용 레지스터의 값들을 스택에 저장하며, POPAD와 짝을 이루어서 사용된다.
    POPAD: 스택에 저장된 레지스터 값들을 다시 레지스터에 입력한다. 보통 POPAD 밑에 점프문이 있으며 이 점프문 주소에 해당하는게 OEP인 경우가 많다. 이 문제의 경우에도 해당되었으며, jmp 401360으로 OEP로 이동하였다.


따라서 답은 00401360AD46DFS547을 합친 00401360AD46DFS547이다!

profile
🐹강화하고 싶은 기억을 기록하고 공유하자🐹

0개의 댓글