치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 8단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 8단계
나동빈
이번 문제는 다중 포인터(Multi-level Pointer)를 바르게 이해하고 있는지를 물어보는 문제입니다. 지난 번에는 단순히 하나의 포인터만이 사용되었지만 이번 문제에서는 여러 개의 포인터가 중첩되어 있습니다.
문제 요약: 특정한 변수를 가리키는 포인터의 포인터의 포인터의 포인터의 포인터를 찾아내어 값을 5000으로 고정시킵니다.
※ 그림 요약 ※
현재 5중 포인터가 사용되는 상태인데 그 대표적인 예시를 그려보면 다음과 같습니다.
바로 문제를 풀어보도록 합시다. 현재 변수의 값은 2227입니다. 따라서 2227을 값으로 가지는 변수를 검색합니다.
이후에 변수가 발견되면 바로 주소 리스트에 등록합니다.
이후에 어떠한 포인터가 해당 변수를 가리키는지 Find out what accesses this address를 눌러 확인합니다.
이제 값을 바꾸어서 확인해 봅시다.
결과적으로 다음과 같이 mov [esi+18], eax 라는 기계어가 수행되는 것을 확인할 수 있습니다. 이는 esi 레지스터가 가지는 값에 18을 더한 메모리 주소에 eax 레지스터의 값을 넣겠다는 의미입니다. 즉 어떠한 포인터 변수가 esi 값 정보를 저장하고 있는 것입니다.
따라서 위와 같이 레지스터의 값을 어떠한 포인터 변수가 가지고 있는지 확인합시다.
포인터 변수를 위와 같이 발견했으므로 바로 다시 주소 리스트에 추가합니다.
마찬가지로 다시 해당 변수의 주소를 참조하는 포인터 변수를 찾아봅시다.
이번에는 위와 같이 mov, esi, [esi] 라는 어셈블리어를 확인할 수 있습니다. 우리는 이미 포인터 변수의 주소를 다른 포인터 변수가 가지고 있다는 것을 알고 있습니다. 다시 말해서 위 명령어는 이중 포인터를 의미하는 명령어인 것입니다.
따라서 다음과 같이 0173D5D0 이라는 값을 가지는 변수를 검색하면 됩니다.
그러면 결과적으로 다음과 같이 포인터 변수를 확인할 수 있습니다. 마찬가지로 이를 주소 리스트에 추가하고 다시 이를 참조하는 포인터 변수가 있는지 확인할 수 있도록 합니다.
이번에는 다음과 같이 mov esi, [esi+14] 라는 명령어를 확인할 수 있었습니다. 이 또한 마찬가지로 이중 포인터를 의미하는 명령어입니다. 다만 오프셋(Offset)으로 14가 붙어 있는 것을 알 수 있습니다. 즉 특정한 주소에서 14를 더하여 참조한다는 의미입니다.
다시 말해서 현재 주소 값에서 14를 뺀 값을 어떠한 포인터 변수가 가지고 있다는 의미가 됩니다.
따라서 0175D264에서 14를 뺀 값을 찾아봅시다. 계산기를 이용해보니 0175D250이라는 값이 나오네요.
따라서 이렇게 해당 값을 가지는 포인터 변수를 찾아서 다시 주소 리스트에 등록한 뒤에 마찬가지로 또 참조하는 포인터 변수를 찾습니다.
이번에는 오프셋(Offset)이 0C입니다. 따라서 기존의 주소에서 0C를 뺀 값인 016CD478으로 스캔을 수행하면 됩니다.
결과적으로 00601660이라는 시작 포인터 주소를 찾을 수 있었습니다. 일반적으로 시작 포인터 주소는 초록색으로 표시됩니다.
이제 수동으로 주소를 등록하면 됩니다.
다중 포인터 변수는 Add Offset 버튼을 이용해 추가할 수 있습니다. 다음과 같이 오프셋을 이용하여 다중 포인터 값을 색출합니다.
결과적으로 시작 포인터 변수를 주소 리스트에 등록할 수 있었습니다.
이 값을 5000으로 설정하고 Active 체크박스를 클릭하여 값이 고정되도록 해줍니다.
결과적으로 문제를 푼 것을 알 수 있습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진으로 포켓몬스터 파이어 레드 게임 해킹해보기 ① 게임 실행 (0) | 2018.09.03 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 9단계 (0) | 2018.09.02 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 7단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계 (0) | 2018.09.01 |
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 7단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 7단계
나동빈
이번 시간에는 치트 엔진 튜토리얼 7단계 문제를 풀어보도록 하겠습니다. 이번 문제는 코드 인젝션(Code Injection)입니다. 말 그대로 실행 중인 게임의 중간에 우리가 원하는 소스코드를 삽입하여 실행하는 것입니다.
문제 요약: 누를 때마다 변수의 값이 2씩 감소하는 버튼이 있습니다. 버튼을 누를 때마다 변수의 값이 1씩 증가하도록 코드 인젝션을 하면 됩니다.
현재 체력 변수의 값이 100입니다. 이를 99로 바꾼 뒤에 다시 스캔하는 식으로 변수를 찾아냅시다.
이번에는 위 사진과 같이 어떠한 코드가 해당 주소의 값을 변경하는지 확인할 수 있도록 'Find out what writes to this address'를 누릅시다.
이제 값을 변경해보면 위와 같이 어떠한 코드가 값을 변경하는지 추적이 되는 것을 확인할 수 있습니다. 더블 클릭하여 정보를 확인해보면 특정한 메모리 주소의 값에서 1을 빼는 것을 확인할 수 있습니다.
이번에는 다음과 같이 Show disassembler를 눌러 어셈블리어 코드를 확인할 수 있습니다.
이후에 코드 인젝션을 위해 먼저 자동화된 기능인 Auto Assemble를 이용합시다.
이후에 Code Injection 탭을 누르면 자동으로 원래 형태의 기본 코드가 주입됩니다.
보시면 원래 코드(Original Code)로 1을 빼는 부분이 들어가 있는 것을 알 수 있습니다.
따라서 다음과 같이 원래 코드를 지워버리고, 새롭게 할당되는 부분에 2를 더하는 기계어를 작성해주시면 됩니다. ADD는 값을 더하는 목적으로 사용하는 대표적인 어셈블리어입니다.
이후에 실행(Execute)을 누르면 코드 인젝션이 완료됩니다.
그러면 이제 버튼을 누를 때마다 2씩 값이 증가하며 성공적으로 문제가 풀린 것을 알 수 있습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 9단계 (0) | 2018.09.02 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 8단계 (6) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계 (0) | 2018.09.01 |
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계
나동빈
이번 시간에는 치트 엔진 튜토리얼 6단계를 함께 풀어보도록 하겠습니다. 6단계는 포인터(Pointer)를 활용하여 푸는 문제입니다.
※ 포인터의 개념 알아보기 ※
포인터 변수란 컴퓨터 메모리 주소를 저장하는 변수를 의미합니다. 메모리 주소를 저장하는 이유는 나중에 특정 메모리 주소에 빠르게 접근하여 값을 변경하거나 활용할 수 있기 때문입니다. 말 그대로 메모리 주소만 저장하고 있다는 점이 특징입니다.
총 세 개의 변수가 있다고 해봅시다. 포인터 변수가 하나 있고, 정수형 변수가 두 개 있습니다. 포인터 변수는 특정한 변수를 가리키는 역할을 수행한다고 했습니다. 따라서 처음에는 7이라는 값을 가지는 변수의 주소인 0x8A91A983이라는 값을 가지고 있다고 해봅시다.
이 상황에서 7이라는 값을 다른 값으로 변경하지 않고, 어떠한 유의미한 값을 15로 변경하고자 한다면 포인터 변수의 값만 바꾸어주면 될 것입니다. 왜냐하면 현재 15라는 값을 가지고 있는 변수가 따로 존재하니까요.
컴퓨터는 메모리(RAM) 내부의 특정한 주소로 바로 접근할 수 있다는 점에서 이렇게 메모리의 주소 값만 잘 저장해 놓으면 특정한 변수에 빠르게 접근할 수 있습니다. 이게 바로 포인터의 기능인데요. 바로 포인터 변수가 저장하고 있는 값을 0x9B8371AA로 바꾸었다고 해봅시다. 그러면 바로 15라는 값에 접근할 수 있는 것입니다.
결과적으로 7과 15라는 값은 전부 그대로 있는 상태에서, 포인터 변수의 값만 바꾸어서 다양한 처리를 할 수 있는 것입니다.
※ 6단계 문제 풀기 ※
이제 6단계 문제를 풀어봅시다.
문제 요약: 'Change value' 버튼은 포인터가 가리키고 있는 변수의 값을 바꾸는 버튼입니다. 'Change pointer'는 포인터의 값을 바꾸는 버튼입니다.
일단 바로 현재의 값이 100이므로 스캔을 해봅시다.
값을 바꾸어 본 뒤에 다시 스캔하는 방식으로 특정 변수를 찾아서 주소 리스트에 등록해 봅시다.
이제 결과적으로 값을 바꿀 때마다 바로 주소 리스트에 반영되는 것을 알 수 있습니다.
다만 'Change pointer' 버튼으로 포인터의 값을 바꾸는 경우에는 주소 리스트에서 해당 값을 추적하지 못하는 것을 알 수 있습니다.
따라서 일단 다시 한 번 다음과 같이 변수를 찾아봅시다.
이번에는 'Find out what accesses this address'를 눌러 어떠한 포인터 변수가 해당 변수를 참조하고 있는지 확인해보도록 합시다.
값을 변경했을 때 다음과 같이 mov [edx], eax라는 기계어가 색출되는 것을 확인할 수 있습니다.
여기에서 [ 어떠한 값 ]의 형태는 '어떠한 값'이 가르키고 있는 주소의 값에 접근하겠다는 의미입니다. 다시 말해서 edx 레지스터에 저장된 값에 해당하는 메모리 주소에 접근한 뒤에, 그곳에 eax 레지스터에 저장된 값을 넣어주겠다는 소리입니다.
따라서 우리는 '016D5F48' 라는 값을 저장하고 있는 포인터 변수가 있다는 사실을 추측할 수 있습니다.
결과적으로 포인터 변수를 찾은 모습입니다.
포인터 변수를 찾은 뒤에는 'Add Address Manually'를 눌러 수동으로 포인터 변수를 등록할 수 있습니다.
포인터 변수로 생성해줍니다.
그러면 결과적으로 포인터 변수가 가리키는 변수의 값을 성공적으로 추적하는 것을 알 수 있습니다.
이 값을 5000으로 만들어 준 뒤에 'Active' 체크박스를 클릭하여 값을 강제로 고정해봅시다.
그럼 이제 포인터 변수의 값을 바꾸려고 해도 계속해서 동일한 위치를 가리킨다는 점에서 값이 유지되는 것을 알 수 있습니다.
이렇게 6단계까지 풀어보았습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 8단계 (6) | 2018.09.01 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 7단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 3단계 (1) | 2018.09.01 |
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계
나동빈
이번 시간에는 치트 엔진 튜토리얼 5단계를 풀어보도록 하겠습니다. 5단계는 특정한 메모리 주소에 접근하는 기계어를 찾아내는 방법을 알고 있으면 쉽게 해결할 수 있습니다. 문제 내용을 보시면 값을 변경하는 기능을 무효화하여 버튼을 눌러도 값이 변경되지 않도록 하는 것이 목표라는 것을 알 수 있습니다.
초기 값은 100이므로 가장 먼저 100으로 변수를 스캔하시면 됩니다.
이후에 다음과 같이 버튼을 눌러 값을 변경해봅시다.
그러면 값이 변경된 변수를 색출할 수 있습니다. 이제 여기에서 Find out what writes to this address 기능을 눌러 해당 변수에 접근하여 값을 변경하는 기능을 수행하는 기계어를 찾을 수 있도록 합니다.
그러면 다음과 같이 스캔이 진행되고 있는 것을 알 수 있습니다.
이제 이 상태에서 다시 버튼을 눌러 값을 변경할 수 있습니다.
그러면 이제 어떤 기계어가 값을 변경했는지 다음과 같이 색출되는 것을 알 수 있습니다. 바로 대체(Replace) 버튼을 눌러 해당 기계어를 다른 기계어로 대체 해보도록 하겠습니다.
아무 기능도 수행하지 않는 것을 의미하는 명령어 코드는 바로 NOP입니다. 따라서 해당 코드를 NOP로 바꾸어 확인 버튼을 누릅니다.
이후에 다음과 같이 정지(Stop) 및 닫기(Close)를 해서 적용해 줄 수 있도록 합니다.
그럼 다음과 같이 값 변경 버튼을 눌렀을 때 더이상 값이 변경되지 않고 성공적으로 문제를 푼 것을 알 수 있습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 7단계 (0) | 2018.09.01 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 3단계 (1) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 2단계 (0) | 2018.08.31 |
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계
나동빈
이번 시간은 치트 엔진 튜토리얼의 4단계를 풀어 볼 것입니다. 지난 시간에는 문제를 풀 때 자료형이 정수형인 것만 감안하였습니다. 이번 시간에는 찾아야 하는 데이터가 단순히 정수형이 아니라 실수형입니다. C언어 계열의 프로그램에서는 크게 2가지 실수형이 많이 사용됩니다. 작은 크기의 실수형을 나타낼 때 사용하는 Float과 큰 크기의 실수형을 나타낼 때 사용하는 Double입니다.
문제를 확인해보니 Float과 Double의 두 변수가 존재하며 이 두 개의 값을 모두 5000 이상으로 올리면 된다고 합니다.
따라서 바로 치트 엔진에서 해당 튜토리얼 프로그램을 열어 주시고 자료형이 Float이면서 100의 값을 가지는 변수를 스캔해보겠습니다.
(실수형은 정수형보다 수치 정확도가 낮으므로 혹여나 검색이 잘 안 된다면 '범위로 검색'하는 방법도 있습니다.)
이제 Float 변수를 찾기 위해 Hit me 버튼을 클릭해 값을 변경시켜봅시다.
그러면 위와 같이 93.5로 값이 변경된 하나의 변수가 발견됩니다. 우클릭하여 주소 리스트에 추가합니다.
마찬가지로 Double 형을 가지는 변수도 검색 해주시면 됩니다.
마찬가지로 버튼을 누르니 값이 변경되는 군요.
Double형 변수도 스캔이 완료되면 주소 리스트에 추가합니다.
이제 두 값을 모두 5000으로 바꾸어주시면 됩니다.
그러면 다음과 같이 성공적으로 문제를 풀어낸 것을 확인할 수 있습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 6단계 (0) | 2018.09.01 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 3단계 (1) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 2단계 (0) | 2018.08.31 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 1단계 (0) | 2018.08.31 |
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 3단계
치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 3단계
나동빈
이번 시간에는 치트 엔진 튜토리얼 3단계를 풀어보도록 할 것입니다. 이 예제도 실제 게임 해킹에 있어서 매우 매우 많이 사용되는 예제이므로 반드시 튜토리얼을 익히고 넘어가시는 것을 추천드립니다.
3단계 문제 요약: 0부터 500 사이의 숨겨진 변수가 있고, 버튼을 누를 때마다 이 변수의 값이 일정 부분 감소합니다. 이 때 그 변수의 값을 5000으로 만드는 문제입니다.
문제가 다소 길게 쓰여있지만 위에 요약된 내용과 일치합니다.
기본적으로 현재 변수의 값이 정확히 무엇인지 모르므로 'Unknown initial value'로 설정하여 메모리 내에 존재하는 모든 변수를 스캔해야 합니다. First Scan 버튼을 눌러서 스캔을 진행하세요.
※ 팁(Tip) ※
(만약에 이미 어떤 작업을 하고 있던 도중이었다면 'New Scan' 버튼을 눌러서 새롭게 스캔을 시작해야 합니다.)
아무튼 First Scan을 눌러서 전체 변수를 스캔하면 다음과 같이 매우 많은 변수의 개수가 보입니다.
이제 이 상태에서 '감소하는 변수'의 값을 찾아내기 위해 다음과 같이 Hit me 버튼을 클릭합니다.
그러면 일시적으로 총 얼마만큼의 값이 감소했는지 위와 같이 나옵니다. 정확히 2만큼 감소했네요.
그러면 이전과 대비했을 때 2만큼 감소한 변수를 찾기 위해 'Decreased value by'로 설정하고 2를 입력하여 스캔을 진행합니다.
그러면 위와 같이 29개의 변수로 매우 좁혀지는 것을 알 수 있습니다. 이런식으로 반복하여 스캔하면 결국 하나의 변수만이 남게 됩니다.
한 번 더 Hit me를 눌렀을 때 10이 감소하였으므로 다음과 같이 10만큼 줄어든 변수로 이어서 스캔해주시면 됩니다.
결과적으로 저는 01732CDC 주소의 변수가 제가 찾던 변수임을 확인할 수 있었습니다.
해당 변수 라인을 우클릭하여 바로 'Change value of selected addresses'를 눌러 값을 변경하시면 됩니다.
저는 문제에서 요구한 대로 5000이라는 값을 넣어주었습니다.
넣어주자마자 바로 다음과 같이 Next 버튼이 활성화 되며 문제가 풀린 것을 알 수 있습니다.
'게임 해킹을 통해 배우는 정보보안' 카테고리의 다른 글
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 5단계 (0) | 2018.09.01 |
|---|---|
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 4단계 (0) | 2018.09.01 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 2단계 (0) | 2018.08.31 |
| 치트 엔진(Cheat Engine) 튜토리얼(Tutorial) 1단계 (0) | 2018.08.31 |
| 치트 엔진(Cheat Engine)의 개요와 설치 (0) | 2018.08.31 |
