Compartilhamento de tecnologia

Pesquisa estática para chamar o local da função de link dinâmico do iOS

2024-07-11

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

Pesquisa estática para chamar o local da função de link dinâmico do iOS

O formato de arquivo executável mach-O é um formato de arquivo binário usado nos sistemas operacionais macOS e iOS da Apple.

Em algumas verificações de segurança do iOS, pode ser necessário obter o local de chamada específico de uma função, o que pode orientar os usuários a localizar vulnerabilidades com mais precisão.
Agora pegue a função NSLog como exemplo e pesquise estaticamente o local de chamada específico da função de link dinâmico em macho.

Alvo

Procure o local específico onde a função NSLog é chamada no aplicativo macho.

Ideias

Todo o processo de pesquisa é um processo de análise de arquivos machos e de análise de dados binários em estruturas de dados apropriadas.
Várias partes de macho são usadas:
Mesa de Cordas
Tabela de Símbolos
Tabela de Símbolos Dinâmicos
Seção64(TEXTO,tocos)
Seção64(TEXTO,texto)

Etapas específicas

1. Primeiro encontre a localização de Symbol Talbe e String Table no arquivo macho.

Encontre LC_SYMTAB em Load Commands, você pode determinar o deslocamento e o tamanho de StringTable e também pode encontrar o deslocamento e o número da tabela de símbolos:

O deslocamento da tabela de símbolos é 0x18c478
O número de símbolos é 0x9a2d
O deslocamento da tabela de strings é 0x2273b0
O tamanho da tabela de strings é 0x108d58

Como cada comprimento de dados de símbolo é de 16 bytes, que é 0x10,

Portanto, o tamanho da tabela de símbolos é 0x9a2d*0x10 = 0x9A2D0
O endereço inicial da Tabela de Símbolos é 0x18c478
O endereço final é 0x18c478 0x9A2D0 = 0x226748

O endereço inicial da tabela de strings é 0x2273b0
O endereço final é 0x2273b0 0x108d58 = 0x330108
Como o comprimento da string não é fixo, o comprimento de cada dado na tabela de strings não é fixo.
Ao ler dados da tabela de strings em binário, você pode usar 'x00' como delimitador de string.

2. Percorra a tabela de strings e encontre _NSLog

Você pode primeiro ler os dados da tabela de strings em macho e usar 'x00' como separador para gerar uma matriz de strings.
Percorra a matriz de strings e determine se cada dado é igual a "_NSLog".

_NSLog foi encontrado em 0x23331b e o código de máquina "5F4E534C6F6700" é a string "_NSLogn".

49003 (0xBF6B em hexadecimal) é o número de índice da string atual, que é provisoriamente determinado como strTab_index = 49003.
O número de índice 49003 é calculado a partir do endereço inicial 0x2273b0 da tabela de strings, o 49003º byte,
0x2273b0 49003 = 0x23331B, que é o endereço inicial de _NSLog.

3. De acordo com 49003 (0xBF6B) na etapa 2, você pode procurar o símbolo correspondente na SymbolTable

No MachOView você pode ver que o endereço 0x00224988 corresponde a _NSLog.

Como encontrar dados correspondentes da tabela de símbolos por meio do número de índice 49003?
Conhecido na etapa 1:
O endereço inicial da Tabela de Símbolos é 0x18c478,
O endereço final da tabela de símbolos é 0x226748.
Neste macho, o tamanho dos dados de uma única tabela de símbolos é 0x10.

O valor dos primeiros quatro bytes do 38993º dado na Tabela de Símbolos é 0xBF6B, que é 49003.
É igual ao número de índice da string _NSLog na Tabela de Strings, portanto este dado corresponde a "_NSLog":

38993 é o número de índice dos dados atuais na Tabela de Símbolos, provisoriamente symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 é exatamente o endereço dos dados atuais.

4. Encontre dados com base em symTab_index na tabela de símbolos dinâmicos

A localização dos símbolos indiretos pode ser determinada em LC_DYSYMTAB em Load Commands in Macho:

Endereço inicial: 0x226748, existem 794 dados e o tamanho de cada dado é 0x4.
Percorra cada dado em Símbolos Indiretos. O 111º dado armazena 38.993.
Portanto, esses dados correspondem a "_NSLog", defina dySymTab_index = 111
0x226748 111*0x4 = 0x226904