본문 바로가기

Security/Reversing

리버싱 핵심원리 6장

6장 abex'crackme #1 분석

 

간단한 crackme 샘플을 분석하여 실습하기. 단순히 크랙이 목표가 아니라 디스어셈 코드와 디버깅에 익숙해지기.

 

abexcrackme를 디버거로 키면 코드가 앞에서 했던 HelloWorld와는 다르게 매우 짧은데 이것은 어셈블리언어로 만들어진 실행파일이기 때문임. VC++, VC, Delphi등 개발툴을 사용하면 자신이 작성한 소스코드 외에 컴파일러가 stub code를 추가시키기 때문에 디스어셈을 하면 복잡하게 보임. 하지만 어셈블리 언어로 소스코드를 작성하면 어셈 코드가 곧 디스어셈 코드가 되기 때문에 굉장히 직관적인 코드(EP에 main함수가 바로 나타남)가 됨.

 

코드를 살펴보면 MessageBoxA와 GetDriveTypeA가 먼저 보인다. 메세지를 출력하고 드라이브의 타입에 따라 값을 얻어와서 EAX에 리턴값이 저장된다. 제작자의 목적은 드라이브 타입을 CD-ROM으로 인식하게 만들어서 프로그램을 통과시키는 것이다. 이후 분기문에서 EAX와 ESI의 값을 비교해서 틀리면 오류 메세지로 분기하는데 이것을 패치해주면 성공한다.

 

*스택에 파라미터를 전달하는 방법

리버싱에서 중요한 개념이다. 위의 코드에서 MessageBoxA()함수 호출 시 스택에 파라미터(매개변수)를 전달하는 방법은 4번의 push 명령어를 사용해 필요한 파라미터(매개변수)를 역순으로 입력한다. 이 이유는 스택은 LIFO(last in First out), FILO(first in last out)구조이기 때문이다. 파라미터를 꺼내서 사용하는 함수 입장에서는 스택에 파라미터의 순서대로 들어 있는 것이 되는 것이다.

'Security > Reversing' 카테고리의 다른 글

리버싱 핵심원리 8장  (0) 2023.03.27
리버싱 핵심원리 7장  (0) 2023.03.27
리버싱 핵심원리 5장  (0) 2023.03.27
리버싱 핵심원리 4장  (0) 2023.03.27
리버싱 핵심원리 3장  (0) 2023.03.27