직관적으로 분석하였는데 정리 해보고자 한다.
기본적인 내용을 알면서 다양한 분석을 통해서 실력을 키워가면 좋을것 같다.
모든 C++ 문법을 다 해보는건 아니지만 그래도 적당히 분석에 필요한 내용을 알아본다.
밑의 첨부한 코드는 C++문법에 사용되는 이것 저것 들을 넣어 보았다.
해당 코드를 최적화 하지 않고 컴파일하여 IDA를 이용하여 분석해본다.
[그림-1]
위의 [그림-1]은 IDA를 통해 본 main 함수 부분이다.
첫 줄에 보이는 v8 = operator new(28u); 부분을 확인하면 28 size만큼 공간을 할당한다.
해당 size를 통해서 객체의 변수와 함수 포인터 들의 총 합 크기를 구할수 있다. --> 구조체 분석과 거의 같다.
해당 부분을 그냥 malloc(28)과 같이 생각하는데 차이점이 궁금해서 검색해 보았다.
[참고]http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free
위의 링크에 자세한 설명이 있다. 할당되는 영역이랑 return type이 다르다, 생성자, 소멸자 내용등의 차이가 있다.
[그림-2]
위의 정리 내용을 [그림-2]와 같이 설명 할 수있다.
이제 Creator_sub_401070 생성자 부분을 확인 해보려고 한다. 생성자의 인자로는 아까 객체의 할당 받은 pointer를 넣어 준다.
[그림-3]
var_this 구조체? 배열을 해당 부분에서 파악 할 수 있다. 파악하는게 가장 중요한거 같다. 파악 후 구조체를 만들어주면 분석하기에 편하다.
*(_DWORD *)var_this = &off_402198;
처음 가리키는 this의 4바이트에는 0x402198 주소가 들어간다.
해당 부분은 가상 함수들의 주소를 가지고 있는 table이다. 가상 함수 테이블 개념이다.
[그림-4]
해당 주소에 가면 함수의 주소들이 나열되어 있는데, 하나만 있어서 하나밖에 없다. 그리고 sub_4011f0 함수를 확인해 보면 가상 함수를 구현한 부분인걸
확인 할 수있다.
[그림-5]
*((_DWORD *)var_this + 1) = 20;
위와 같은 내용은 var_this+4byte 위치에 4바이트 변수에 20을 넣는다는 말이다.
strcpy_s((char *)var_this + 8, 4u, "red");
위와 같은 내용은 var_this+8byte 위치부터 해서 4바이트 만큼 red문자열을 복사한다.
뒤 내용은 이제 포인터 값을 리턴 하는 내용이다. 이제 초기화 부분을 통해서 구조체를 어느정도 그려 볼수있다.
[4byte vtable] [4byte int] [4byte red\0] [16byte undefined]를 구성 할 수있다. [그림-6]은 해당 내용을 IDA Structure 만들어 놓았다.
[그림-6]
그리고 [그림-7]처럼 만든 구조체 포인터를 얖선 this 포인터로 정의 해주면 분석하기 좋게 변형한다.
[그림-7]
이로서 처음 생성자를 마무리 지었다. 코드를 알고 있어서 나머지 16바이트 전부 char 배열인걸 알지만... 일단 모르고 분석 할때는 저런식으로 조각 모음
그리고 이제 파악한 내용을 토대로 main함수를 분석하면 [그림-8]과 같이 분석하기 편하게 된다.
[그림-8]
'reversing > reversing' 카테고리의 다른 글
MIPS Instruction[Assembly] (0) | 2017.03.29 |
---|---|
ARM Handray (0) | 2016.12.06 |
get physical address (0) | 2016.11.29 |
call[opcode 0xe8] 사용 (0) | 2016.11.20 |
Cheat Engine (0) | 2016.11.18 |