기술나눔

iOS 동적링크 기능의 호출 위치에 대한 정적 검색

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

iOS 동적링크 기능의 호출 위치에 대한 정적 검색

실행 파일 형식 mach-O는 Apple 운영 체제인 macOS 및 iOS에서 사용되는 바이너리 파일 형식입니다.

일부 iOS 보안 검색에서는 사용자가 취약점을 보다 정확하게 찾을 수 있도록 안내할 수 있는 기능의 특정 호출 위치를 확보해야 할 수도 있습니다.
이제 NSLog 함수를 예로 들어 macho에서 동적 링크 함수의 특정 호출 위치를 정적으로 검색하세요.

표적

macho 애플리케이션에서 NSLog 함수가 호출되는 특정 위치를 검색합니다.

아이디어

전체 검색 프로세스는 마초 파일을 구문 분석하고 바이너리 데이터를 적절한 데이터 구조로 구문 분석하는 프로세스입니다.
마초의 여러 부분이 사용됩니다.
스트링 테이블
심볼 테이블
동적 심볼 테이블
제64조(텍스트,스텁)
제64조(텍스트,텍스트)

특정 단계

1. 먼저 macho 파일에서 Symbol Talbe와 String Table의 위치를 ​​찾습니다.

로드 명령에서 LC_SYMTAB를 찾으면 StringTable의 오프셋과 크기를 확인할 수 있고 기호 테이블의 오프셋과 개수도 찾을 수 있습니다.

기호 테이블 오프셋은 0x18c478입니다.
기호 수는 0x9a2d입니다.
문자열 테이블 오프셋은 0x2273b0입니다.
문자열 테이블 크기는 0x108d58입니다.

각 심볼 데이터 길이는 16바이트, 즉 0x10이므로,

따라서 Symbol Table의 크기는 0x9a2d*0x10 = 0x9A2D0 입니다.
Symbol Table의 시작 주소는 0x18c478입니다.
끝 주소는 0x18c478 0x9A2D0 = 0x226748입니다.

스트링 테이블의 시작 주소는 0x2273b0입니다.
끝 주소는 0x2273b0 0x108d58 = 0x330108 입니다.
문자열의 길이가 고정되어 있지 않기 때문에 String Table의 각 데이터 길이도 고정되어 있지 않습니다.
문자열 테이블 데이터를 바이너리로 읽을 때 'x00'을 문자열 구분 기호로 사용할 수 있습니다.

2. 스트링 테이블을 탐색하여 _NSLog를 찾습니다.

먼저 macho에서 문자열 테이블 데이터를 읽고 'x00'을 구분 기호로 사용하여 문자열 배열을 생성할 수 있습니다.
문자열 배열을 탐색하여 각 데이터 조각이 "_NSLog"와 같은지 확인합니다.

_NSLog는 0x23331b에서 발견되었으며, 기계어 코드 "5F4E534C6F6700"은 "_NSLogn" 문자열입니다.

49003(16진수로는 0xBF6B)은 현재 문자열의 인덱스 번호로, strTab_index = 49003으로 잠정 결정됩니다.
인덱스 번호 49003은 스트링 테이블의 시작 주소 0x2273b0, 49003번째 바이트에서 계산되며,
0x2273b0 49003 = 0x23331B, 이는 _NSLog의 시작 주소입니다.

3. 2단계의 49003(0xBF6B)에 따라 SymbolTable에서 해당 기호를 검색할 수 있습니다.

MachOView에서는 0x00224988 주소가 _NSLog에 해당하는 것을 볼 수 있습니다.

인덱스 번호 49003을 통해 일치하는 심볼 테이블 데이터를 찾는 방법은 무엇입니까?
1단계에서 알려진 내용:
Symbol Table의 시작 주소는 0x18c478이고,
심볼 테이블의 끝 주소는 0x226748이다.
이 마초에서는 단일 심볼 테이블의 데이터 크기가 0x10입니다.

심볼 테이블의 38993번째 데이터의 처음 4바이트 값은 0xBF6B, 즉 49003입니다.
스트링 테이블의 _NSLog 문자열 인덱스 번호와 동일하므로 이 데이터는 "_NSLog"에 해당합니다.

38993은 심볼 테이블에 있는 현재 데이터의 인덱스 번호이며, 임시적으로는 SymTab_index = 38993입니다.
0x18c478 38993 * 0x10 = 0x224988이 바로 현재 데이터의 주소입니다.

4. Dynamic Symbol Table의 SymTab_index를 기반으로 데이터 찾기

간접 기호의 위치는 Macho의 Load Commands 아래 LC_DYSYMTAB에서 확인할 수 있습니다.

시작 주소: 0x226748, 794개의 데이터가 있고, 각 데이터의 크기는 0x4입니다.
간접 기호의 각 데이터 조각을 탐색합니다. 111번째 데이터 조각은 38993을 저장합니다.
따라서 이 데이터는 "_NSLog"에 해당하며 dySymTab_index = 111로 설정합니다.
0x226748 111*0x4 = 0x226904