Ret2syscall
Informações Básicas
Isso é semelhante ao Ret2lib, no entanto, neste caso não estaremos chamando uma função de uma biblioteca. Neste caso, tudo será preparado para chamar a syscall sys_execve
com alguns argumentos para executar /bin/sh
. Esta técnica é geralmente realizada em binários que são compilados estaticamente, então pode haver muitos gadgets e instruções de syscall.
Para preparar a chamada para a syscall, é necessária a seguinte configuração:
rax: 59 Especificar sys_execve
rdi: ptr para "/bin/sh" especificar arquivo a ser executado
rsi: 0 especificar nenhum argumento passado
rdx: 0 especificar nenhuma variável de ambiente passada
Então, basicamente, é necessário escrever a string /bin/sh
em algum lugar e depois realizar a syscall
(ciente do padding necessário para controlar a pilha). Para isso, precisamos de um gadget para escrever /bin/sh
em uma área conhecida.
Outra syscall interessante para chamar é mprotect
que permitiria a um atacante modificar as permissões de uma página na memória. Isso pode ser combinado com ret2shellcode.
Gadgets de Registro
Vamos começar encontrando como controlar esses registradores:
Com esses endereços, é possível escrever o conteúdo na pilha e carregá-lo nos registradores.
Escrever string
Memória gravável
Primeiro, você precisa encontrar um lugar gravável na memória.
Escrever String na memória
Então você precisa encontrar uma maneira de escrever conteúdo arbitrário neste endereço.
Automatizar cadeia ROP
O seguinte comando cria uma cadeia ROP completa sys_execve
dado um binário estático quando há gadgets write-what-where e instruções syscall:
32 bits
64 bits
Gadgets em Falta
Se você está sem gadgets, por exemplo, para escrever /bin/sh
na memória, você pode usar a técnica SROP para controlar todos os valores dos registradores (incluindo RIP e registradores de parâmetros) a partir da pilha:
Exemplo de Exploit
Outros Exemplos & Referências
64 bits, sem PIE, nx, escrever em alguma memória um ROP para chamar
execve
e pular lá.64 bits, nx, sem PIE, escrever em alguma memória um ROP para chamar
execve
e pular lá. Para escrever na pilha, uma função que realiza operações matemáticas é abusada.64 bits, sem PIE, nx, canário BF, escrever em alguma memória um ROP para chamar
execve
e pular lá.
Last updated