티스토리 뷰

리버싱

리버스 엔지니어링 바이블-0320

삼전동해커 2022. 3. 21. 00:56

C++클래스와 리버스 엔지니어링

 

C++은 C와 달리 이 부분이 변수 선언이고 클래스 인지 구분이 쉽지않다. 이를 확인하기 위해선 메모리 사용량과 함수의 구조적인 부분을 살펴보면서 판단해야 한다.

 

#include "windows.h"
#include "stdio.h"
#include "tchar.h"

class Employee
{
public:
	int number;
	char name[128];
	long pay;
	void ShowData();
	void Test();
};

void Employee::ShowData()
{
	printf("number: %d\n", number);
	printf("name: %s\n", name);
	printf("pay: %d\n", pay);

	Test();
	return;
}

void Employee::Test()
{
	printf("Test fuction\n");
	return;
}

// Employee kang;
int main(int argc, char* argv[])
{
	Employee kang;

	printf("size: %X\n", sizeof(Employee));

	kang.number = 0x1111;
	_tcscpy(kang.name, _T("강병탁"));
	kang.pay = 0x100;
	kang.ShowData();
	return 0;
}

 

위 코드는 간단히 고용인 클래스를 만들고 클래스의 멤버 변수에 다양한 값을 넣었다.

 

먼저 어셈블리를 확인하기 위해서는 main함수가 어디인지, 함수들의 시작부분이 어딘지 알아야 분석을 할 수 있다.

가장 간단한 부분은 print문 같이 문자열이 확실히 보이는 string을 찾아 main문을 찾는 방법이다.

하지만 main문에서 그저 함수만 호출하고 string을 print하지 않는 경우도 있다. 이럴 땐 컴파일의 순서를 생각해야 한다.

물론 지금처럼 간단한 코드의 경우엔 처음에 헤더를 호출하고 바로 main문으로 넘어가지만 복잡한 경우엔 main문을 도달하기 전에 많은 과정을 거친다. 

'리버싱' 카테고리의 다른 글

PinTool Opcode(XOR,AND,SFT) 출력 구현  (0) 2022.04.10
리버싱 엔지니어링 바이블-0311  (0) 2022.03.11
리버싱 엔지니어링 바이블 - 0307  (0) 2022.03.07
PinTool BBL 개수 출력  (0) 2022.02.15
Taint Analysis란  (0) 2022.02.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함