배경 : 특정 클래스에 속하는 Obj-C 인스턴스 메소드를 뒤집을 것입니다. 여기브레인 스토밍 : 메모리 주소를 작은 정수와 비교하는 이유
aMethod
분해
[0x0] mov edi, [ebp+arg_0] ## put self into edi
[0x2] mov edx, [edi+20h] ## put self._integer into edi
[0x3] cmp edx, 1
[0x4] jl end_of_method ## if (self._integer < 1) return;
[0x5] lea eax, [edx-0Ch] ## put &self._myStruct into eax
[0x6] cmp eax, 3
[0x7] ja end_of_method ## if (&self._myStruct > 3) return;
// other stuff
제 6 라인의 단편은 3
와 메모리 어드레스 (&self._myStruct
) 사이 comparaison 보여준다된다 : 여기 클래스
@interface myClass : NSObject
{
// aStructure contains a lot of function pointers
struct aStructure **_myStruct; // ivar offset: 0x14
int _integer; // ivar offset: 0x20
}
- (void)aMethod;
@end
문제의 인터페이스이다.
질문 : 메모리 주소를 int로 비교하는 이유는 무엇입니까? 메모리 주소가 항상> 3이 될 것이므로 나에게 의미가 없으므로이 경우 항상 메서드가 종료됩니다.
일반적으로 산술 계산인지 아니면 실제 실제 주소로드인지 식별하는 방법이 있습니까? 다음 지시 사항을 확인하여 논리적인지 확인하십시오. – b1onic
그래, 유일한 방법은 계산 결과가 나중에 주소로 사용되는지 확인하는 것입니다. –
오, 나는 lea eax, [edx-0ch]가 lea eax, [edi + 20h-0Ch]를 의미하는 반면, lea eax, [value_of_self._integer-0Ch]'를 의미한다고 생각했다. 당신의 설명에 감사드립니다. – b1onic