2015. 1. 27. 12:20ㆍSecurity ★ 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 |