미친해커

[Cheat Engine] Cheat Engine Tutorial Step 8 본문

Cheat Engine Tutorial

[Cheat Engine] Cheat Engine Tutorial Step 8

미친해커 2021. 9. 20. 02:58
반응형

Step 8의 주제는 Multilevel pointers이다. Step 6의 포인터를 다중으로 설정해둔 문제이다. 간단하게 설명하자면 Step 6의 Pointer(포인터)는 1중 포인터로 주소를 한 번만 참조하면 원본 주소를 가리켜 값을 바꿀 수 있었지만 Step 8에서는 다중 포인터로 여러 번 참조해야 값을 바꿀 수 있는 문제이다. 

위 그림과 같이 여러 주소를 거치는 것을 다중 포인터라고 부른다. 1994라는 값에 도달하기까지 총 4번의 주소를 참조해야만 주소가 바뀌어도 값을 변경할 수 있다.

위 그림과 같이 값을 찾아서 리스트에 저장해준다.

리스트에 저장되어 있는 값을 마우스 우클릭하여 Find out what writes to this address을 클릭하고 Chnage value 버튼을 눌러주면 위 그림과 같이 로그가 하나 남게 된다.

Instruction(인스트럭션)을 클릭해주고 More Information(더보기)를 클릭해주면 Change value 버튼을 누르고 값이 변경될 때의 자세한 정보를 보여준다. 간단히 해석하자면 포인터 [rsi+0x18] 주소에 eax의 값을 넣는다고 볼 수 있다. 현재 값이 저장되어 있는 주소는 0x0014BC58이다. 이 주소를 가지고 있는 주소는 rsi의 주소로부터 0x18 만큼 더한 주소에 존재한다. (rsi+0x18 이기 때문) 그렇다면 rsi의 주소를 가지고 있는 주소를 찾으면 된다. (rsi 및 지금부터 나오는 주소들은 사람마다 다를 수 있다. 다르다면 다른 값을 기준으로 진행하면 된다.)

More Information에서 확인했던 정보를 바탕으로 포인터를 검색하면 된다. rsi의 값인 0x0014BC40를 가지고 있는 주소를 검색한다. (검색하기 전 New Scan을 눌러 검색을 초기화하고 앞에 Hex에 체크하는 것을 잊지 말자) 검색하면 0x0014BC40를 값으로 가지고 있는 0x000CEA70 주소를 찾을 수 있다.

위 그림과 같이 이번에도 0x000CEA70 값을 가지고 있는 주소를 검색하기 위해 Find out what accesses this address 기능을 사용한다. 그럼 2개의 Instruction이 기록되는 것을 확인할 수 있다. 여기서 두 번째 Instruction의 정보를 확인한다. (첫 번째 Instruction은 cmp 이기 때문에 확인할 필요가 없다)

위 정보를 확인해보면 mov rsi, [rsi] rsi 주소에 있는 값을 rsi로 옮기는 작업을 수행한다. 여기서 rsi 값을 확인해보면 0x0014BC40으로 0x00CEA70 주소에 존재하는 값이 들어가 있는데 이 경우에는 mov rsi, [rsi]의 작업이 끝난 후의 정보를 보여주는 것이다. 즉 여기서 우리는 rsi의 값이 0x00CEA70 이였다는 것을 추측할 수 있다. 이해가 되지 않는다면 아래 더보기를 누르면 자세한 내용이 나온다.

더보기

rsi의 값이 0x0014BC40으로 나와있고 우리가 찾고 싶은 주소는 0x000CEA70을 값으로 가지고 있는 주소이다. 그렇다면 여기서 rsi가 0x000CEA70을 값으로 가지고 있는 주소여야 하는데 이미 mov rsi, [rsi]가 실행되어 rsi의 값이 바뀐 상태이다. 그렇기 때문에 rsi에 0x0014BC40이 들어가려면 그전에 rsi의 값은 0x0014BC40을 가지고 있는 주소인 0x000CEA70이라는 의미가 된다. 그렇기 때문에 0x000CEA70을 그대로 검색하면 0x000CEA70을 가지고 있는 주소를 찾을 수 있다.

(주소를 검색할 때는 Hex를 체크해야 하는 것을 잊지 말자) 위와 같이 검색하면 0x00CEA70을 주소로 가지고 있는 0x0014BBD8을 찾을 수 있다. 이 주소를 리스트에 저장하고 아까와 같은 방법으로 또 찾아본다.

이번에도 아까와 같이 2개의 Instruction이 기록됐다. 이번에도 아까와 같이 cmp 하나와 mov 하나가 기록되었는데 역시 두 번째 Instruction의 정보를 확인한다.

이번에 rsi 값도 0x000CEA70으로 이미 mov rsi, [rsi+0x18] 명령이 실행된 후 이다. 이번에 0x000CEA70 값은 rsi+0x18 주소에 0x000CEA70 값이 저장되어 있다는 것이다. 그렇다면 0x0014BBD8에서 -0x18 한 주소를 검색하면 된다. 자세한 설명은 더보기에...

더보기

mov rsi, [rsi+0x18] 명령을 실행한 후의 rsi 값이 0x000CEA70이라면 그 전의 rsi 값이 rsi-0x18 값 이라는 말이 된다. 왜냐하면 rsi+0x18 된 주소에 0x000CEA70 값이 들어가 있기 때문에 0x000CEA70 값을 가지고 있는 0x0014BBD8 주소가 rsi+0x18 된 주소이기때문에 0x0014BBD8에서 -0x18한 0x0014BBC0가 해당 명령을 실행하기 전 rsi 값이된다.

위 그림과 같이 0x00166700 주소를 찾을 수 있다. 이 주소를 리스트에 저장하고 또 이 주소를 저장하고 있는 주소를 찾는다. 지금 Find out what accesses this address 기능을 이용하여 찾은 포인터만 4개이다. 그래도 아직까지 고정주소 영역이 아니기 때문에 계속 찾아야한다. 

이번에도 cmp와 mov가 나왔으니 mov의 정보를 확인한다.

이번에는 설명을 건너뛰기로 하겠다. 같은 설명은 2번이면 이해했으리라 믿고 이번 명령(어셈블리)를 확인해보면
mov rsi, [rsi+0x10] 이다. 0x00166700-0x10 주소가 전 rsi 값이다. 이 값을 검색해보자

이번에 찾은 0x100306B00 주소는 고정주소이다. 지금까지 찾은 주소들은 스택이나 힙(언제든 바뀔 수 있는)의 주소이지만 0x100306B00는 프로그램 내의 고정되어 있는 주소이기때문에 이 주소를 참조하여 0x0014BC58까지 참조하면 주소가 바뀌어도 값을 바꿀 수 있다. 지금까지 찾은 포인터를 연결하면 다음과 같은 모양이 된다.

Add Address Manually 버튼을 클릭해 지금까지 찾은 포인터들을 추가해준다. 

이제 Change pointer 버튼을 눌러주고 3초 안에 아까 등록한 포인터를 이용하여 값을 5000으로 변경해주면 Next 버튼이 활성화 되는 것을 확인할 수 있다.

반응형
Comments