SROP - Sigreturn-Oriented Programming
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
**Sigreturn
**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 syscall입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, 신호를 처리하기 위해 신호 처리기라는 특별한 기능을 사용하여 현재 작업을 일시 중지합니다.
신호 처리기가 끝난 후, 프로그램은 아무 일도 없었던 것처럼 이전 상태로 복귀해야 합니다. 여기서 **sigreturn
**이 작용합니다. 이는 프로그램이 신호 처리기에서 반환하고 신호 처리기에 의해 사용된 스택 프레임(함수 호출 및 지역 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
흥미로운 점은 **sigreturn
**이 프로그램의 상태를 복원하는 방법입니다: 이는 모든 CPU의 레지스터 값을 스택에 저장함으로써 이루어집니다. 신호가 더 이상 차단되지 않으면, sigreturn
은 이 값을 스택에서 팝하여 CPU의 레지스터를 신호가 처리되기 전의 상태로 효과적으로 재설정합니다. 여기에는 현재 스택의 맨 위를 가리키는 스택 포인터 레지스터(RSP)가 포함됩니다.
ROP 체인에서 syscall **sigreturn
**을 호출하고 로드할 레지스터 값을 스택에 추가하면 모든 레지스터 값을 제어할 수 있으며, 따라서 예를 들어 syscall execve
를 /bin/sh
로 호출할 수 있습니다.
이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 Ret2syscall의 한 유형이라는 점에 유의하십시오:
궁금하다면, 이는 나중에 값을 복구하기 위해 스택에 저장된 sigcontext 구조체입니다 (다이어그램은 여기에서 가져옴):
더 나은 설명을 위해 다음도 확인하세요:
여기에서 ROP를 통해 signeturn 호출이 구성된 예시를 찾을 수 있습니다 (rxa에 값 0xf
를 넣음), 비록 이것이 최종 익스플로잇입니다:
Check also the exploit from here where the binary was already calling sigreturn
and therefore it's not needed to build that with a ROP:
스택에 쓰기를 허용하고 sigreturn
시스템 호출을 호출하는 어셈블리 바이너리. 스택에 ret2syscall을 sigreturn 구조체를 통해 쓸 수 있으며, 바이너리의 메모리 안에 있는 플래그를 읽을 수 있습니다.
스택에 쓰기를 허용하고 sigreturn
시스템 호출을 호출하는 어셈블리 바이너리. 스택에 ret2syscall을 sigreturn 구조체를 통해 쓸 수 있으며 (바이너리는 문자열 /bin/sh
를 포함합니다).
64비트, relro 없음, 카나리 없음, nx, pie 없음. 가젯이 부족한 gets
함수를 악용한 간단한 버퍼 오버플로우로 ret2syscall을 수행합니다. ROP 체인은 /bin/sh
를 .bss
에 쓰고, 다시 gets
를 호출하여 alarm
함수를 악용하여 eax를 0xf
로 설정하여 SROP을 호출하고 셸을 실행합니다.
64비트 어셈블리 프로그램, relro 없음, 카나리 없음, nx, pie 없음. 흐름은 스택에 쓰고 여러 레지스터를 제어하며 시스템 호출을 호출한 후 exit
를 호출할 수 있습니다. 선택된 시스템 호출은 sigreturn
으로, 레지스터를 설정하고 eip
를 이전 시스템 호출 명령어를 호출하도록 이동시켜 memprotect
를 실행하여 바이너리 공간을 rwx
로 설정하고 바이너리 공간에서 ESP를 설정합니다. 흐름을 따라 프로그램은 ESP에 다시 읽기를 호출하지만, 이 경우 ESP는 다음 명령어를 가리키므로 셸코드를 전달하면 다음 명령어로 작성되고 실행됩니다.
SROP는 셸코드가 배치된 위치에 실행 권한 (memprotect)을 부여하는 데 사용됩니다.
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)