오늘 해볼것은 간단하게 보안과, 리버스 엔지니어링에 대해서입니다!
거의 게임쪽? 으로 보면 될 듯 합니다.
우선 나와있는 온라인 게임이나 그런것을 건드릴 수는 없으니,
간단하게 도스창 시뮬레이션 게임을 하나 만들었습니다..
#include <iostream>
#include <vector>
using namespace std;
class game {
private:
int money = 100;
int hp = 100;
int moneyChecker = noMercy(money);
int hpChecker = noMercy(hp);
public:
void doWork() {
hp -= 10;
money += 10;
}
check();
}
void doEat() {
hp += 15;
money -= 10;
}
check();
}
void check() {
cout << "Money : " << money << " HP : " << hp << endl;
}
};
int main() {
game Game;
int command;
while (true) {
cout << "할일을 선택 해 주세요\n 1 - 일하기 2 - 먹기 \n";
cin >> command;
switch (command) {
case 1:
Game.doWork();
break;
case 2:
Game.doEat();
break;
}
}
return 0;
}
간단하게 일하면 hp-10 money +10,
먹으면 hp+15 , money -10
인 게임입니다.
이것을 치트엔진으로 데이터를 변조 해봅시다.
간단한 메모리 탐색으로 돈에 대한 값을 찾아냈습니다.
그럼 이 메모리를 바꾸면 어떻게 될까요?
너무나 쉽게 값이 바뀌어 버렸습니다.
그렇다면 막는 사람 입장에서는 어떻게 해야 할까요?
메모리가 변조 되었는지, 안되었는지를 확인 할 수 있어야 합니다.
그리하여 저는, 값이 변경되기 전, 후를 나누어서
무언가 행동을 했을떄 결과물을 해싱하고,
행동하기 전에 다시 해싱해서, 해싱이 일치하는지 확인하는 방법으로 만들었습니다.
그리하여 class 자체 구조를 조금 바꾸었습니다.
class game {
private:
int money = 100;
int hp = 100;
int moneyChecker = noMercy(money);
int hpChecker = noMercy(hp);
public:
void doWork() {
if (hackCheck(hp, hpChecker)) {
hp -= 10;
hpChecker = noMercy(hp);
}
if (hackCheck(money, moneyChecker)) {
money += 10;
moneyChecker = noMercy(money);
}
check();
}
void doEat() {
if (hackCheck(hp, hpChecker)){
hp += 15;
hpChecker = noMercy(hp);
}
if (hackCheck(money, moneyChecker)){
money -= 10;
moneyChecker = noMercy(money);
}
check();
}
void check() {
cout << "Money : " << money << " HP : " << hp << endl;
}
int noMercy(int a) {
return a*a % 8;
}
bool hackCheck(int a, int b) {
if (a*a % 8 != b) {
cout << " You Used The Bad Tool NOOB!";
return false;
}
return true;
}
};
그럼 이상태로 아까 했던것 처럼 한번 해볼까요?
바로 걸려버립니다.
그러나 이렇게 쉽게 막을 수는 없죠.
이번에는 무언가 행동을 했을때, 받는 돈의 양을 바꿔 보겠습니다.
돈의 메모리 주소를 찾은 후 f5를 눌러봅니다.
그러면 돈의 메모리에 접근 하는 어셈블러들을 확인 할 수 있습니다.
여기서 간단하게 어셈블러가 무슨의미를 뜻하는 건지는 알고 계셔야 합니다.
그리고 각 문장들을 눌러보면, 앞뒤에 무엇을 하고 있는지 보여주는데요
하나하나 눌러보며 대충 무엇을 하고있는지 확인을 해봅시다.
정답은 위에 3번째 제가 클릭 해 놓은 어셈블 언어의 앞뒤에 있는데
무엇을 바꾸어야 할지 혹시 보이셨나요?
정답은 add ecx,0A 였습니다.
0A는 10이니까, 돈에 10을 더하는게 저기있었군요!
그럼 이제 Memorry View 에 들어가서 아무데나 오른쪽 클릭하여
go to adrees 를 눌러, 해당 주소로 가줍시다.
그리고 어셈블리어를 임의로 수정 해봅시다. 간단하게 15(0F) 만 더하게 만들어 볼게요
끝~ 돈이 10원씩 들어오는게 아니라 15원씩 들어오게 됩니다.
오늘은 여기까지만 해보도록 하겠습니다.
들어오는 돈의 양을 바꾸는것도
마찬가지로 해싱으로 막을수 있기에
다음에는 다른 방법으로 찾아