SROP - Sigreturn-Oriented Programming
Informações Básicas
Sigreturn
é uma syscall especial usada principalmente para limpar após a conclusão da execução de um manipulador de sinal. Sinais são interrupções enviadas a um programa pelo sistema operacional, frequentemente para indicar que alguma situação excepcional ocorreu. Quando um programa recebe um sinal, ele pausa temporariamente seu trabalho atual para lidar com o sinal com um manipulador de sinal, uma função especial projetada para lidar com sinais.
Após o manipulador de sinal terminar, o programa precisa retomar seu estado anterior como se nada tivesse acontecido. É aqui que o sigreturn
entra em ação. Ele ajuda o programa a retornar do manipulador de sinal e restaura o estado do programa limpando o quadro da pilha (a seção da memória que armazena chamadas de função e variáveis locais) que foi usada pelo manipulador de sinal.
A parte interessante é como o sigreturn
restaura o estado do programa: ele faz isso armazenando todos os valores dos registradores da CPU na pilha. Quando o sinal não está mais bloqueado, sigreturn
retira esses valores da pilha, efetivamente redefinindo os registradores da CPU para seu estado antes de o sinal ser tratado. Isso inclui o registrador do ponteiro da pilha (RSP), que aponta para o topo atual da pilha.
Chamar a syscall sigreturn
de uma cadeia ROP e adicionar os valores do registro que gostaríamos que ele carregasse na pilha é possível controlar todos os valores dos registradores e, portanto, chamar por exemplo a syscall execve
com /bin/sh
.
Observe como isso seria um tipo de Ret2syscall que facilita muito o controle de parâmetros para chamar outros Ret2syscalls:
pageRet2syscallSe você estiver curioso, esta é a estrutura sigcontext armazenada na pilha para posteriormente recuperar os valores (diagrama de aqui):
Para uma melhor explicação, confira também:
Exemplo
Você pode encontrar um exemplo aqui onde a chamada para signeturn é construída via ROP (colocando em rxa o valor 0xf
), embora este seja o exploit final a partir daí:
Verifique também o exploit a partir daqui onde o binário já estava chamando sigreturn
e, portanto, não é necessário construir isso com um ROP:
Outros Exemplos e Referências
Binário em assembly que permite escrever no stack e em seguida chama a syscall
sigreturn
. É possível escrever no stack um ret2syscall via uma estrutura sigreturn e ler a flag que está dentro da memória do binário.Binário em assembly que permite escrever no stack e em seguida chama a syscall
sigreturn
. É possível escrever no stack um ret2syscall via uma estrutura sigreturn (o binário contém a string/bin/sh
).64 bits, sem relro, sem canary, nx, sem pie. Estouro de buffer simples abusando da função
gets
com falta de gadgets que realiza um ret2syscall. A cadeia ROP escreve/bin/sh
na.bss
chamando gets novamente, abusa da funçãoalarm
para definir eax como0xf
para chamar um SROP e executar um shell.Programa em assembly de 64 bits, sem relro, sem canary, nx, sem pie. O fluxo permite escrever no stack, controlar vários registradores, chamar uma syscall e então chamar
exit
. A syscall selecionada é umsigreturn
que irá definir registros e movereip
para chamar uma instrução de syscall anterior e executarmemprotect
para definir o espaço binário comorwx
e definir o ESP no espaço binário. Seguindo o fluxo, o programa chamará read no ESP novamente, mas neste caso o ESP estará apontando para a próxima instrução, então passar um shellcode escreverá como a próxima instrução e o executará.SROP é usado para conceder privilégios de execução (memprotect) ao local onde um shellcode foi colocado.
Last updated