본문 바로가기

리버싱/Lena Tutorial

level 5

프로그램을 실행하면 나오는 화면이다. 체험판이라서 최대횟수가 10으로 제한되어 있다(한 번 실행했으므로 남은 횟수는 '9') Nag창이 횟수제한과 같이 있기 때문에 Nag창을 제거하면 횟수제한도 없어진다. 이 창에서 "Start Program"을 누른다.
다음과 같은 화면이 나타난다. 여기서 창을 닫는다.
위 사진과 같은 두번째 Nag창을 볼 수 있다. 두번째 Nag창도 제거할 것이다.

 

올리디버거를 켜고 "F8"을 계속 눌러서 프로그램을 실행시키다보면 4BD444 ~ 4BD452구간이 계속 반복이 된다. 4BD455번지에 BP를 걸어두고 "F9"를 눌러 빠져나온다.
빠져나오면 다시 "F8"을 계속 눌러주면서 분석을 진행한다. 그러다가 위 사진의 CALL문에서 Nag창이 뜬다. 다시 BP를 걸어두고 "Ctrl + F2"를 눌러 프로그램을 재시작한다. 그리고 처음 걸어둔 BP는 해제하고, 방금 걸어둔 BP로 이동한다.

"F7"을 눌러서 안으로 들어가면 4BD510번지로 이동하는데, 다시 "F8"을 누르면서 분석을 진행한다.

 

이번엔 4BD520번지에서 Nag창이 떴다. BP를 걸고 앞에서처럼 재시작을 한 후 이전 BP는 해제한다. 4BD520번지로 왔으면 "F7"을 눌러서 들어가준다.
다시 "F8"을 누르면서 분석을 시작하다보면 40만번지대가 아닌 73xxxxxx번지가 나온다. 이것은 EXE파일이 아니라 MFC42.dll 즉, 시스템 dll의 주소라는 것을 올리디버거 타이틀에서 알 수 있다.
메모리창으로 가면 위 사진의 범위가 프로그램의 범위이다.
메모리창에서 MFC42.dll의 text영역에 있다.
분석하다가 위 명령어를 실행하면 Nag창이 발생한다. 이제 BP를 걸어야 하는데 시스템 파일들의 주소에서는 프로그램을 재시작하게 되면 BP가 풀리기 때문에 일반적인 BP를 사용할 수 없다.
"F2"를 눌러서 걸어주는 BP는 소프트웨어 BP이다. 시스템 주소에서는 하드웨어 BP를 걸어야 하는데 위 사진은 하드웨어 BP를 거는 방법이다. "BP를 걸 주소에 마우스 우클릭 - Breakpoint - Hardware, on execution" 을 누르면 된다.
프로그램을 재시작하고 F9를 눌러서 73DDC1CC번지로 오면 아래의 상태창에서 하드웨어 BP가 걸렸음을 확인할 수 있다.
"Hardware breakpoints"를 누른다
위 사진은 하드웨어 BP는 동시에 최대 4개까지 설정이 가능하다는 것과 어디에 하드웨어 BP가 걸려있는지를 알 수 있다.

소프트웨어 BP, 하드웨어 BP 비교 정리

 

소프트웨어 BP : 올리디버거로 보면 빨강색이지만 가상메모리를 열어서 직접 보면 0xCC로 패치된다. "F9"를 누르면 0xCC로 패치된 곳에서 멈춘다. 0xCC를 어셈블리어로 바꾸면 INT 3이다. INT 3이라는 명령어를 실행코드 앞단에다가 설정함으로써 CPU가 이 명령을 실행할 때, 핸들러가 제어권을 디버거에게 넘겨주는 원리(명령어의 처음 1Byte를  INT 3으로 변경하는 형태로 구현)

오직 RAM에서만 실행할 수 있다.

 

* INT : CPU가 예외처리를 하기 위해 인터럽트를 발생한다.

* INT 3 : BP 인터럽트

 

하드웨어 BP : CPU내에서 Debug Register를 통해 제어한다. 디버그 레지스터들은 CPU내에서 주소에 직접적으로 Break를 걸 수 있다. CPU는 INT 1을 사용해 핸들러에게 제어권을 넘겨준다. 즉, 디버거에게 제어권을 넘겨준다.

 

* INT 1 : 디버그 인터럽트

 

소프트웨어 BP와 같이 RAM에서만 쓸 수 있는 것이 아니라 전 영역에서 사용가능

DLL같이 소프트웨어 BP가 설정되지 않는 것에 하드웨어 BP를 사용

73DDC1CC번지에서 "F7"을 눌러서 [EAX+58] 함수를 호출하면 489310번지 즉, 프로그램의 메인으로 오게된다.

다시 "F8"을 누르면서 분석을 한다. 하지만 계속 눌러도 Nag창이 뜨지 않는다.

 

"Animate over"를 눌러주면 계속해서 "F8"을 눌러주는 기능을 한다.

 

여기서 Nag창이 뜨면서 멈춘다. 그럼 BP를 걸어주고 Hardware BP를 해제시켜준다.  그리고 프로그램을 재시작한 후 "F9"를 눌러주고, "F7"을 눌러서 안으로 들어간다.

 

이 화면에서 "F8"을 누른다.

그럼 다시 73xxxxxx번지로 이동한다. 그리고 "Animate + F8"을 누르면 73DE5446번지에서 Nag창이 발생한다.

Nag창이 발생한 주소에서 다시 Hardware BP를 걸어준다.

1.프로그램을 재실행하고 73DE5446번지로 이동한다.

2. "F7"을 눌러서 안으로 들어가면 아래의 사진과 같이 73DE54D8번지로 이동한다.

 

BP를 걸은 함수들은 마우스나 키보드로 메시지를 보내는데 메시지를 실시간으로 읽는다. 즉, 이 함수들이 동작을 한다는 것은 이미 모든 절차가 끝나고 사람들에게 메시지를 받을 준비를 하고 있다는 의미이다. 그래서 여기 이전부분을 분석해야한다.
마지막으로 거쳐간 004xxxxx번지이다.
살짝 위로 올려보면 JLE문을 볼 수 있다. 그 위에 TEST문의 결과에 따라 분기여부가 갈린다. 그리고 TEST문의 EAX는 4898E7번지에서 가져오는 것이기 때문에 사진과 같이 BP를 걸어준다.

4898E7번지에서 "F8"을 누르면 EAX가 6으로 바뀌는 것을 알 수 있다.

dump창에서 "edi+0xe4" 번지로 이동한다.
6이 저장되어 있다.
JLE문에서 분기되지 않으면 489912번지로 이동하게 되므로 분기되도록 ZF를 1로 바꿔고 실행한다.
위와 같은 창이 뜬다. 하지만 나는 아직 6번의 trials이 남았다. 이걸로 앞의 조건문은 trials 횟수를 체크하는 역할을 한다. 그러므로 앞은 조건문 보다 더 뒤로 가서 분석해야한다.
다음 조건문을 찾았다. JNZ문에서 분기되지 않으면 앞과 마찬가지의 결과가 나오기 때문에 분기되도록 ZF를 0으로 바꿔준다.
실행시키면 Nag창이 없어졌다는 것을 확인할 수 있다.
이 부분이 trials version을 체크하는 부분이다.
왼쪽 : 패치 전  오른쪽 : 패치 후

그리고 저장한다.

위 사진의 두번째 Nag창을 제거할 차례이다 

위 사진의 창이 떠 있는 상태에서 일시정지를 시켜준다. 

 

Call Stack으로 가면 마지막으로 실행된 004xxxxx번지를 찾으면 위의 번지임을 알 수 있다.  그리고 더블클릭하면 아래의 사진으로 이동한다.
위 사진의 번지에 BP를 걸어주고, 재시작한다.
"CALL 004BC42A"로 해석할 수 있고, 이 명령어가 두번째 Nag창을 호출한다. 그러므로 이 부분을 NOP으로 채우면 Nag창이 뜨지 않는다.

 

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

level 9  (0) 2019.08.17
level 8  (0) 2019.08.16
level 4  (0) 2019.05.21
level 3  (0) 2019.05.20
level 2  (0) 2019.05.17