api 리버싱 2 - RtlNumberGenericTableElements, RtlIsGenericTableEmpty

2015. 1. 27. 12:20Security ★ Development/Reversing

반응형

이번에는 RtlNumberGenericTableElements라는 함수를 보겠습니다.

앞의 것은 이전과 같으니 건너뛰고

MOV EAX, DWORD PTR DS : [EAX+14]

이것만 보겠습니다.

EAX는 구조체에서 14 의 오프셋을 가진 위치입니다.

이 위치를 eax에 넣고 eax는 리턴됩니다.  retn이 4인걸로 봐서 리턴 값은 하나이고 함수의 이름을 보면 테이블 요소의 개수를 뜻하므로 이 수를 리턴하는 것으로 추측할 수 있습니다.  그런데 이 수는 eax에 저장되어 있고 이는 eax+14의 값이었으므로 앞의 구조체는 다음과 같이 수정 될 수 있습니다.

struct TABLE{    

UNKNOWN Member1;

UNKNOWN_PTR Member2;  

UNKNOWN_PTR Member3;

UNKNOWN_PTR Member4;

UNKNOWN Member5;

ULONG NumberOfElements;  //구조체 내에서 14의 오프셋을 가진 멤버입니다.

UNKNOWN Member7;

UNKNOWN Member8;

UNKNOWN Member9;

UNKNOWN Member10;

}


다음은 RtlIsGenericTableEmpty입니다.

조금씩 함수의 내용이 보이기 시작합니다.  구조체의 값을 ECX에 넣고 EAX는 0으로 초기화합니다.  그리고 이 둘을 비교합니다.  

SETE AL

- SETE는 비교한 두 값이 동일하다면 레지스터를 1로 셋팅합니다.

그리고 이 값을 반환합니다.  전형적인 Empty 판단 함수입니다.

struct TABLE{    

UNKNOWN_PTR Member1;  //테이블이 비어있지 않으면 0외의 값을 반드시 가지고 있습니다.

UNKNOWN_PTR Member2;  

UNKNOWN_PTR Member3;

UNKNOWN_PTR Member4;

UNKNOWN Member5;

ULONG NumberOfElements; 

UNKNOWN Member7;

UNKNOWN Member8;

UNKNOWN Member9;

UNKNOWN Member10;

}

'Security ★ Development > Reversing' 카테고리의 다른 글

리버스엔지니어링 문제 1  (0) 2015.03.22
보안 취약점  (0) 2015.03.16
무분기 로직  (0) 2015.03.09
api 리버싱 3 - RtlGetElementGenericTable  (0) 2015.03.07
api 리버싱 1 - RtInitializeGenericTable  (0) 2015.01.26