본문 바로가기

reversing/reversing

C++ 리버싱 연습 [2] -이론

SMALL

C++ 분석 정리


x86에서 c++ 분석과 관련된 내용을 정리 해놓는다.


사전 지식

thiscall 호출 규약

ECX에 인스턴스 주소를 기억한 후 함수를 호출하는 방법


바인딩(bindding)

정적바인딩 : 컴파일 시점에 호출될 함수를 결정하는 함수

동적바인딩 : 함수 호출이 실제로 일어나는 시점에 함수를 결정하는 방법 


가상함수(virtual function)
        상속을 받은 클래스에서 재정의가 가능한 멤버 함수

        가상함수는 동적 바인딩을 사용하므로, 가상 함수 테이블에서 실제 함수 주소를 찾아야함 


분석방법

1. 클래스 찾기

1-1. ecx를 이용한 함수 호출 등 발생 여부를 확인한다.

1-2. 생성자와 소멸자

지역 객체

지역 변수로서 객체를 선언하고 사용하는 것을 말한다.

생성자 - 지역 객체가 선언하는 시점에서 호출

소멸자 - 해당 지역 객체가 선언된 함수의 코드가 끝이 나는 순간에 호출 됨


동적 객체

new(malloc) 함수에 의해서 객체가 동적으로 할당 됨

생성자는 동적 공간 할당 결과로 얻은 버퍼 주소를 this 포인터로 받고 delete 연산자가 free로 할당 해체


2. 클래스 구조 파악

2-1. 클래스와 구조체 동일점 : 클래스의 크기는 멤버 변수가 결정

2-2. 상속을 사용하는 클래스 : 부모 클래스의 멤버 변수 + 자식 클래스의 멤버 변수의 크기만큼 차지

생성자 하나를 호출하고 그 안에서 부모 클래스의 상속했던 친구들이 사용된다.

        자식 생성자 —> 부모 생성자
                          -->  부모 생성자

        멤버 변수 메모리 구조
               vtable
                grand mother [ecx]
                mother            [ecx+12]
                딸                    [ecx+24]


2-3. 가상함수를 사용하는 클래스 : 객체의 최상단에 가상함수 테이블 (vtable)포인터가 들어감

 가상함수 테이블

        클래스가 호출해야 할 함수의 주소 정보를 담고 있는 테이블
         
        객체를 여러개 생성 하더라도 테이블은 하나만 존재

        객체는 ‘가상 함수 테이블 포인터’만 가지고 있음

        상속 함수에서 재정의한 함수의 주소, 재정의 하지 않았다면 기존의 클래스 함수의 주소를 포함 


ps.

해당 클래스에서 사용하는 함수를 찾을때 고려할 내용

클래스는 변수와 해당 변수에서 작업하는 기능(함수)를 묶어 놓은 개념

그렇기 때문에 해당 변수[멤버변수]에 접근할 수 밖에 없음. 해당 변수에 Access BP를 설정해놓으면

클래스에서 사용하는 함수를 찾을수 있음



[출처] 인프런 리버싱 3

LIST

'reversing > reversing' 카테고리의 다른 글

python gdb 백업  (0) 2018.04.01
gdbserver script  (0) 2018.03.28
SMT - z3[sudoku]  (0) 2018.01.24
inline function hooking  (0) 2017.05.12
[Project] 디버거 만들기 [Python]  (0) 2017.03.30