Eu estava olhando algumas técnicas anti-desmontagem e me deparei com o seguinte trecho
push 0x33
call $+5
add [esp+0x10+var_10], 5
retf
next instruction here
Resumindo, isso pularia imediatamente para a instrução logo após o RETF, mas atrapalharia os desmontadores de 32 bits. Ainda não está claro para mim por que isso acontece
Agora, me disseram que o RETF retorna para um segmento de 64 bits e, portanto, depurar isso em um depurador de 32 bits produziu a desmontagem errada. Ao executar este trecho em um depurador de 64 bits (no meu caso, windbg), ele produz o resultado correto.
Minha pergunta aqui é: há algo especial no push 0x33? 0x33 é algum tipo de valor especial?
retf
em si não significa "retornar a um segmento de 64 bits". Significa "retornar ao segmento e endereço especificados", em oposição aoret
significado próximo "retornar ao endereço especificado sem alterar os segmentos". É0x33
o segmento para o qual retornar, que é o segmento usado para código de 64 bits. (0x23
é o segmento de 32 bits.)