Por que o endereço do PE ImageBase muda na memória?

Aug 17 2020

Estou revertendo um executável x86 do Windows de 32 bits malicioso. Revisando estaticamente os cabeçalhos PE em Ghidra, vejo que ImageBaseestá definido 0x400000como esperado. No entanto, quando o binário é carregado na memória, o RVA inicial não corresponde ao ImageBasedefinido no arquivo. Por exemplo, eu vi o endereço básico na memória definido como 0x4B0000e 0x900000. Esse comportamento ocorre em uma VM limpa e durante a depuração com Immunity e x32dbg, bem como com IDA Free.

Meu entendimento é que o carregador do Windows lê ImageBasee usa esse deslocamento para começar a mapear seções no espaço de endereço virtual. Como o código do sistema lida com o carregamento e meu sistema está limpo na primeira execução, suponho que o incomum ImageBaseé um sintoma de uma nuance do carregador em vez de violação. Nunca encontrei esse cenário e gostaria de receber qualquer insight.

MD5: 1f63d04ee95ea041f2f6b1e818d94a7c

SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1


ImageBasedefinido como 0x400000ao visualizar cabeçalhos PE em Ghidra:


ImageBaseno cabeçalho PE mapeado em memória ( 0x4B0000) não corresponde ao ImageBasedefinido no arquivo estático:


Seções PE mapeadas na memória com ImageBaseem0x4B0000

Respostas

7 PawełŁukasik Aug 17 2020 at 12:44

Este é apenas um endereço preferencial. O Windows pode carregar o binário em quase qualquer endereço e realocá-lo para este novo local.

ImageBase: O endereço preferencial do primeiro byte da imagem quando carregado na memória; deve ser um múltiplo de 64 K. O padrão para DLLs é 0x10000000. O padrão para EXEs do Windows CE é 0x00010000. O padrão para Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 e Windows Me é 0x00400000.

Fonte: MSDN