SROP - Sigreturn-Oriented Programming
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Sigreturn
é uma syscall especial que é usada principalmente para limpar após a execução de um manipulador de sinal. Sinais são interrupções enviadas a um programa pelo sistema operacional, frequentemente para indicar que uma situação excepcional ocorreu. Quando um programa recebe um sinal, ele pausa temporariamente seu trabalho atual para lidar com o sinal usando 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 sigreturn
entra em cena. Ele ajuda o programa a retornar do manipulador de sinal e restaura o estado do programa limpando o quadro de pilha (a seção da memória que armazena chamadas de função e variáveis locais) que foi usado pelo manipulador de sinal.
A parte interessante é como 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
remove esses valores da pilha, efetivamente redefinindo os registradores da CPU para seu estado antes do 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 dos registradores que gostaríamos que ele carregasse na pilha torna possível controlar todos os valores dos registradores e, portanto, chamar por exemplo a syscall execve
com /bin/sh
.
Note como isso seria um tipo de Ret2syscall que torna muito mais fácil controlar parâmetros para chamar outras Ret2syscalls:
Se você está curioso, esta é a estrutura sigcontext armazenada na pilha para recuperar os valores posteriormente (diagrama de aqui):
Para uma melhor explicação, confira também:
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 daqui onde o binário já estava chamando sigreturn
e, portanto, não é necessário construir isso com um ROP:
Binário em Assembly que permite escrever na pilha e depois chama a syscall sigreturn
. É possível escrever na pilha 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 na pilha e depois chama a syscall sigreturn
. É possível escrever na pilha um ret2syscall via uma estrutura sigreturn (o binário tem a string /bin/sh
).
64 bits, sem relro, sem canário, nx, sem pie. Simples buffer overflow 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ção alarm
para definir eax como 0xf
para chamar um SROP e executar um shell.
Programa em Assembly de 64 bits, sem relro, sem canário, nx, sem pie. O fluxo permite escrever na pilha, controlar vários registradores e chamar uma syscall e depois chama exit
. A syscall selecionada é um sigreturn
que irá definir registradores e mover eip
para chamar uma instrução de syscall anterior e executar memprotect
para definir o espaço binário como rwx
e definir o ESP no espaço binário. Seguindo o fluxo, o programa chamará read
novamente para o ESP, mas neste caso o ESP estará apontando para a próxima instrução, então passar um shellcode irá escrevê-lo como a próxima instrução e executá-lo.
SROP é usado para dar privilégios de execução (memprotect) ao local onde um shellcode foi colocado.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)