Crack_me [1] 리버싱입니다.
- x64dbg : 올리디버거와 같은 디버깅 툴입니다. 올리디버거는 업데이트가 끊킨듯 하여 x64dbg를 사용하였고 gui 환경도 더 깔끔한 편입니다.
<x64dbg>
- PEview : 윈도우 PE 파일의 구조를 보기위한 툴입니다. 핵사값으로 PE 파일의 구조가 들어있습니다.
<PEview>
- crack me [1]은 '컴퓨터에서 하드디스크를 CD-ROM으로 인식하게 만들어라' 라는 파일입니다. 먼저 해당 파일을 리버싱 하기위해 'x64dbg'에서 열어주고 'EntryPoint'를 찾아야 합니다. 'EntryPoint'는 프로그램의 시작위치로 디버거로 파일을 열었을 때 자동으로 중단점(Brack Point)를 잡아줄 때도 있지만 없을 때도 있습니다. 그럴 때 프로그램의 시작 위치를 찾는 여러 방법이 있는데 그 중에서 이번엔 'PEview'를 이용한 시작점을 찾아보겠습니다.
<PEview EntryPoint Address>
- 프로그램의 시작 주소를 알기위한 방법으로 'PEview'를 'crack me [1]'으로 실행을 시켜주고 IMAGE_NT_HEADERS > IMAGE_OPTIONAL_HEADER 안에 있는 [Address of Entry Point]와 [Image Base]의 주소의 합이 프로그램의 시작 주소 입니다.
=> [Address of Entry Point] + [Image Base] == 00001000 + 00400000 = 00401000
- 프로그램의 시작 주소는 '00401000'이 됩니다. 'x64dbg' 에서 확인 하겠습니다.
<x64dbg EntryPoint Address>
- 왼쪽 위에 빨간점의 주소를 확인하면 앞에서 확인 주소와 같은 '00401000'인 것을 확인할 수 있습니다. 빨간점은 중단점을 의미 합니다.
* 중단점 : 디버깅 중 실행 시킬 때 해당 포인트에서 멈추게 만들 수 있는 중단점 입니다. '리버싱 핵심 원리' 책에서 표현한 중단점은 베이스캠프로 디버깅을 진행중 여러번 확인을 해야할 부분은 베이스캠프 즉, 중단점을 설정하여 편하게 오고갈 수 있는 상황을 만드는 것이 좋습니다.
<Crackme [1] 실행>
- 해당 파일을 실행시키면 나오는 결과 입니다. 하드를 CD-ROM으로 인식하지 않습니다. 이번 리버싱에서는 해당 결과를 OK! 로 바꿔보는 방법을 알아보겠습니다.
- 두가지 방법을 생각해 봤습니다. 첫번째는 점프 명령어를 바꿔버리는 것 두번째는 'CMP' 비교 바로 직후 부분에 중단점을 두어 실행을 잠시 멈추고 'Flag' 레지스터를 바꿔버리는 방법을 해보겠습니다.
<JE abexcm1.40103D>
- 'JE' 명령어 부분을 확인하면 'JE' 바로 위 'cmp' 명령을 통해 'eax, esi' 의 값을 비교하고 해당 값에 따라 'Flag'가 변경됩니다. 'JE' 명령은 'cmp'결과 두 값이 같으면 해당 주소로 'Jump'하게 만드는 명령어 입니다. 'cmp' 결과가 같다는 의미는 eax - esi = 0 입니다. 즉 ZF(Zero Flag)가 '1' 일때 점프를 한다는 의미인데 첫번째로 시도하려는 점프 명령어를 바꿔버리는 방법을 시도하겠습니다. 비교 후 점프를 무조건 'abexcm1.40103D'로 하게 만들기 위해 'JE'명령을 'JMP'명령으로 바꿔 버리겠습니다.
<JUM [주소]로 변경>
- 변경 방법은 바꾸고싶은 명령어를 더블클릭하면 변경이 가능합니다.
<변경 후>
- 변경 후 상태입니다. 아까 'JE' 상태였던 부분을 'JMP'로 변경해서 실행하면 바로 OK 메시지를 띄우는 부분으로 넘어갈 것입니다.
<결과[1]>
- OK 성공입니다.
- 이번엔 두번째 방법으로 시작하겠습니다. 'JE' 부분에 중단점을 걸어서 실행을 멈춘 후 플레그 값을 변경하여 통과시키는 방법으로 진행하겠습니다.
<중단점 추가>
- 중단점을 추가한 상태로 실행을 쭉 시키면 'JE'부분에서 멈출 것입니다.
<Flag 값>
- 'CMP' 명령을 통과한 직후 'JE' 부분에서 중단점으로 인해 멈췄습니다. 해당 부분에서의 'Flag' 값의 상태입니다. 'ZF'가 0으로 되어있습니다. 즉, 'CMP'로 비교한 결과 둘은 다르다 라고 판단된 것입니다. 'ZF'부분을 변경해보겠습니다. 'ZF'의 숫자를 더블클릭하면 숫자가 변경이 가능합니다.
<Flag 변경 후>
- 'ZF'를 변경하였습니다. 실행을 시작합니다.
<결과[2]>
- 변경후 OK 성공입니다!
'System' 카테고리의 다른 글
메모리 시스템(Memory System) (0) | 2021.01.02 |
---|---|
CPU, GPU, RAM - CPU Instruction Cycle, Bus System (0) | 2021.01.02 |
코드에서 프로그램 과정 및 CPU [Reversing] (0) | 2020.02.07 |
범용레지스터 [Reversing] (0) | 2020.02.07 |
Flag 레지스터 [Reversing] (0) | 2020.02.07 |