F.R.I.D.A.Y.

리버싱 - abexcm1(실습).exe 본문

리버싱/Olly

리버싱 - abexcm1(실습).exe

F.R.I.D.A.Y. 2018. 9. 13. 03:01
반응형



 abexcm1(실습).exe를 실행하면 위와같은 메시지가 출력된다.


그리고 [확인]을 누르면 Error라는 제목의 메시지가 발생하는데, 이를 아래와같은 메시지로 출력할 수 있도록 코드를 수정해야한다.


" Ok, I really think that you HD is a CD-ROM! :p "



 처음 olly를 실행해서 abexcm1을 열게되면 아래와 같은 어셈 코드가 나온다.

ASM 코드 (x64라서 그런지 모듈명이 ntdll이다 )


 이 상황에서 [F9]를 누르면 프로그램의 진입점, 즉 프로그램이 시작하는 첫 코드로 이동하게 된다. 아래 이미지와 같은 화면이 나오면 된다. 메모리의 주소는 [ 401000 ]으로, 이 주소[각주:1]가 프로그램의 시작이다. 그외에는 오류.



 [F8]을 이용해 메모리 주소가 [ 401024 ]인 곳까지 내려온다. 중간에 [ 40100E ] 부분에서 [F8]을 눌러도 내려가지 않는 경우는 메시지박스가 출력된 것이니 출력된 메시지 박스를 닫고 다시 시도하자.


 [ 401024 ]의 명령어는 다음과 같다.


cmp eax, esi


 차례대로 설명하면


 cmp [ ASM 명령어 모음 ]

>> 비교한다

 eax

>> 확장된(Extended, e) ax 레지스터

 esi

>> 확장된 si 레지스터


 레지스터 설명은 아래 링크를 참고하자.

 [ CPU 레지스터 ]


 간단하게 eax 레지스터와 esi 레지스터의 값을 비교해 같으면 0을, 다르면 1을 ZF 레지스터[각주:2]에 넣는다.

 cmp는 값을 단순 비교하는 것이 아니라 한쪽에서 다른쪽 값을 빼는 행위를 통해(값이 반영되지는 않는다) 값을 비교한다. 그래서 0값이 참, 1값이 거짓이 된다. 일반 프로그래밍과 다르다보니 여기서 혼돈이 찾아온다. 그런데 olly에서 보여주기를 ZF 에 1이 있으면 참, 0은 거짓이다..

오른쪽 Z가 바로 플래그 레지스터중 Z(ero) 플래그 레지스터이다. 저 값이 0이면 비교값이 0이 아님, 1이면 0임을 알린다. 

더블클릭으로 변경가능

오른쪽에 ZF를 더블클릭해 값을 1로 바꾸면 이미지상에 왼쪽에 강조한 화살표부분이 빨간색으로 변경된다. 점프 분기를 [ 401028 ]로 하는 것이 아니라, [ 40103D ]로 하도록 변경한다. je는 다음과 같이 보면 된다. 이전에 배운 C로 코드를 짜보면 다음과 같다고 보면 된다.


if ( !ZF ) goto 40103D; // << je 작업
401028:[각주:3]


40103D:

 변경후 다시 [F8]을 누르면 [ 40103D ]로 이동한 것을 볼 수 있다.

 그리고 나서 쭉 실행해보면 리버싱에 성공한 것을 확인할 수 있다.


※ 참고

>> ZF값을 바꾸지 않고 cmp eax, esi 부분에서 eax와 esi의 값을 임의로 같게 만들어주어도 가능하다.



참고

>> http://blog.naver.com/PostView.nhn?blogId=67sooon&logNo=10166021894

  1. 디버깅과정에서 편의를 위해 프로그램의 실제 메모리 주소가 아니라 가상주소로 401000번인 것이다. [본문으로]
  2. 플래그 레지스터 [본문으로]
  3. 실제 C에서 레이블은 숫자로 시작할 수 없다. [본문으로]
728x90
반응형

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

OpenSecureLab#1_Release.exe  (0) 2018.09.26
crackme2.exe  (0) 2018.09.15
리버싱 - crackme1.exe  (0) 2018.09.13
Ollydbg 기본 단축키  (0) 2018.09.13
Comments