본문 바로가기

리버싱/Lena Tutorial

level 4

우선 PixtopianBook을 설치한다.

 

프로그램을 실행하면 예외가 발생해서 실행이 되지 않는다.
여기서 멈추게 된다.

 

다시 프로그램을 실행시키면 위와 같은 창이 나온다.
FFFFFFFF으로 가는 루틴이 나오고 이젠 더이상 실행되지 않는다. 하지만 "Shift + F9"를 누르면 넘어간다.
다시 "Shift + F9"를 누르면 위와 같은 창이 나타나면서 프로그램은 종료된다.

위와 같은 과정은 잘못된 루틴으로 빠진 것인데, 안티 디버깅 기법이다.

 

위와 같은 상황을 해결하기 위해선 예외적인 처리를 해줘야한다.

"Options - Debugging options"를 누르고
오른쪽 사진처럼 변경시키면 정상적으로 실행이 된다.

이 문제에선 패치해야 하는 문자열이 3개가 있다.

 

1.

 

이 프로그램에 있는 "UNREGISTERED VERSION"을 "REGISTERED VERSION"으로 바꿔서 사용버전처럼
모양을 바꿔볼 것이다.

 

메모리에 가서 "Ctrl + B"를 누르고 ASCII 또는 UNICODE에 수정하고자 하는 문자열의 일부를 입력한다.
문자열을 찾아내면 위의 사진과 같은 창이 뜨는데 "PixtopianBook(UNREGISTERED)"의 시작부분의 메모리주소가 4E4BCA로 나온다.
메모리영역을 보면 Pixtopia의 리소스부분인 것을 알 수 있는데 리소스영역은 프로그램에 필요한 자원(문자열 등)들을 넣어둔다 (게임같은 경우는 그래픽이나 아이템 관련된 정보들을 저장하기 위해 리소스부분을 많이 사용)
메모리 덤프창으로 가서 "Ctrl + G"를 누르고 4E4BCA를 입력하면 입력한 번지로 이동한다.
"(UNREGISTERED VERSION)" 부분의 데이터를 00으로 채우고 변경한 부분을 선택하고 "Copy to executable file"을 누르고 Save file을 눌러서 리소스영역을 변경한 상태로 파일로 저장한다.
 왼쪽 : 수정 전 오른쪽 : 수정 후 

 

2.

 

메모리로 가서 "Ctrl + B"를 누르고 ASCII에 "this is an unregistered version"이라고 입력하였다
찾고자하는 문자열이 있는 번지로 이동했고 dump창에서 "Ctrl + E"를 눌러서 "this is a registered version"으로 수정한다.
왼쪽 : 수정 전  오른쪽 : 수정 후 

3.

"help - About PixtopianBook"을 클릭하면 현재 프로그램의 상태를 볼 수 있다

"Unregistered version v1.07"을 볼 수 있는데 원래라면 "Help - Register Now"를 눌러서 등록을 해야 상용 프로그램으로 사용할 수 있다.

 

UNICODE에 "Unregistered version"을 입력해서 문자열을 찾는다.
문자열 시작 번지를 찾는다.
메모리 덤프창에서 4D4830번지로 이동하고, 위 사진처럼 문자열을 수정한다.
왼쪽 : 수정 전  오른쪽 : 수정 후

 

문자열 수정은 끝났다. 이번엔 2개의 기능 제한을 풀어볼 것이다.

 

1.

"Add Group" 버튼을 눌러서 그룹을 추가할 수 있다.
 그룹이 3개인 상태에서 하나를 더 추가하려고 하면 이렇게 경고창이 발생한다. 경고문이 떠있는 상태에서 프로그램을 일시정지 한다.
Call Stack으로 가면 Call된 흔적들을 볼 수 있는데 함수를 누가 호출했는지, 어떻게 호출했는지, 앞으로는 어떻게 흘러갈지에 대해 알 수 있다(리턴주소가 저장되어 있음)
CPU가 멈춰있는 위의 창에서는 ntdll로 시스템 dll이기 때문에 분석할 필요가 없다.
위와 같이 Pixtopia는 유저프로그램이고 나머지 DLL들은 시스템에서 불러와주는 프로그램이다.

 

Pixtopia는 유저 프로그램이고 나머지 DLL들은 시스템에서 불러와주는 프로그램이므로 "Debug - Execute till user code"는 "Pixtopia"가 올 때까지 실행하라는 의미로 해석할 수 있다. "Execute till user code"를 눌러주고 오류창에 OK를 눌러주면 된다.

위 사진처럼 유저코드가 있는 부분으로 이동하게 된다.
Call Stack창으로 가면 위와 같은 화면을 볼 수 있다. 여기서 "Pixtopia.004562ED"를 더블클릭하면 아래의 화면으로 이동한다.
4562ED번지의 함수를 호출해서 "MessageBoxA"가 떴기 때문에 문제를 해결하려면 4562ED번지보다 한단계 전인 408B1D번지로 이동해야함을 알 수 있다.
 408B1D번지로 이동하면 위 사진처럼 나오는데 "CALL Pixtopia.004562ED" 명령어를 볼 수 있다 앞에서 메시지박스를 출력했던 명령어 번지이다. (콜스택 가장 윗부분)

함수가 호출이 될 때 몇 가지 인자들도 PUSH를 통해서 넘어오는데 여기서는 경고문만 띄워주는 역할을 한다.

 

408B1D번지에서 살짝 위로 올리면 JL조건문을 볼 수 있는데 바로 위에 "CMP EAX,3"명령어를 볼 수 있다. EAX가 3이상일 경우 분기되지 않고 오류문이 출력되는 것을 알 수있다. 그리고 여기서 3은 그룹의 갯수 라는 것을 알 수 있다.  그러므로 JL을 JMP로 패치하는 방법이 있다.
왼쪽 : 패치 전  오른쪽 : 패치 후
문제 해결

 

2.

다른 기능제한인 1개의 그룹 내에서 추가할 수 있는 인원수 제한이다.

앞에서 했던 것과 마찬가지로 오류창이 뜨면 프로그램을 일시 정지시키고 "Execute till user code"를 누르고 오류 창의 OK 버튼을 눌러준다.

앞과 마찬가지로 "MessageBoxA" 함수 다음으로 이동이 된다
Call Stack으로 가서 4562ED라는 익숙한 주소를 볼 수 있다. 앞에서처럼 4562ED번지의 함수를 호출해서 "MessageBoxA"가 떴기 때문에 문제를 해결하려면 4562ED번지보다 한단계 전인 408B1D번지로 이동해야함을 알 수 있다.
412DEA번지로 이동하고 위를 보면 위의 사진과 같다. CMP문에서 4는 1개의 그룹 내에서 추가할 수 최대 있원수임을 알 수 있다. 그래서 앞과 마찬가지로 JL을 JMP로 패치하고 파일로 저장한다.
더 추가할 수 있게 되었다.

'리버싱 > Lena Tutorial' 카테고리의 다른 글

level 8  (0) 2019.08.16
level 5  (0) 2019.05.23
level 3  (0) 2019.05.20
level 2  (0) 2019.05.17
level 1  (0) 2019.05.16