본문 바로가기

reversing/reversing

C++ 리버싱 연습

SMALL

역분석을 하다 보면 C 말고 C++ 파일을 보게 된다. 그냥 생각없이 동적으로 보면서 이게 이거구나 저게 저거구나...

직관적으로 분석하였는데 정리 해보고자 한다.

기본적인 내용을 알면서 다양한 분석을 통해서 실력을 키워가면 좋을것 같다.


모든 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]

main.cpp



LIST

'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