Ret2esp / Ret2reg
Last updated
Last updated
AWS 해킹을 배우고 실습하세요: HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹을 배우고 실습하세요: HackTricks Training GCP Red Team Expert (GRTE)
ESP (스택 포인터)가 항상 스택의 맨 위를 가리키기 때문에, 이 기술은 EIP (명령어 포인터)를 jmp esp
또는 call esp
명령의 주소로 대체하는 것을 포함합니다. 이렇게 하면 쉘코드가 덮어쓰인 EIP 바로 뒤에 배치됩니다. ret
명령이 실행될 때 ESP는 쉘코드가 저장된 정확한 다음 주소를 가리킵니다.
만약 **주소 공간 레이아웃 무작위화 (ASLR)**가 Windows 또는 Linux에서 비활성화되어 있다면, 공유 라이브러리에서 찾은 jmp esp
또는 call esp
명령을 사용할 수 있습니다. 그러나 ASLR이 활성화된 경우, 취약한 프로그램 자체에서 이러한 명령을 찾아야 할 수 있습니다 (PIE를 우회해야 할 수도 있습니다).
또한, 쉘코드를 EIP 손상 이후에 배치할 수 있는 능력은 함수의 작동 중간이 아닌 스택의 끝에 두어 push
또는 pop
명령이 쉘코드에 간섭하지 않도록 합니다. 이러한 간섭은 쉘코드가 함수 스택의 중간에 배치된 경우 발생할 수 있습니다.
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우 (아마도 몇 바이트뿐이라면), 초기 jmp
쉘코드를 작성하세요:
이 기술의 예시를 다음에서 찾을 수 있습니다: https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp와 같이 최종 악용은 다음과 같습니다:
다른 예시를 https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html에서 확인할 수 있습니다. NX가 활성화되지 않은 버퍼 오버플로우가 있으며, $esp
주소를 줄이기 위해 가젯을 사용하고 나서 jmp esp;
를 사용하여 셸코드로 이동합니다:
마찬가지로, 우리가 함수가 셸코드가 저장된 주소를 반환하는 것을 알고 있다면, call eax
또는 jmp eax
명령어를 활용할 수 있습니다 (ret2eax 기술로 알려져 있음), 우리의 셸코드를 실행하기 위한 또 다른 방법을 제공합니다. eax와 마찬가지로, 흥미로운 주소를 포함하는 다른 레지스터도 사용할 수 있습니다 (ret2reg).
여기에서 몇 가지 예시를 찾을 수 있습니다:
**strcpy
**는 셸코드가 저장된 버퍼의 주소를 **eax
**에 저장하고 **eax
**가 덮어써지지 않았기 때문에 ret2eax
를 사용할 수 있습니다.
ARM64에서는 SP 레지스터로 점프하는 명령어가 없습니다. SP를 레지스터로 이동시키고 그 레지스터로 점프하는 가젯을 찾을 수 있을 수도 있지만, 제 칼리의 libc에서는 그와 같은 가젯을 찾을 수 없었습니다:
내가 발견한 유일한 것은 sp가 복사된 레지스트리의 값을 변경하여 그곳으로 점프하기 전에 (그래서 무용지물이 될 것임) :
레지스트리에 흥미로운 주소가 있다면 적절한 명령을 찾아 그곳으로 점프할 수 있습니다. 다음과 같은 것을 사용할 수 있습니다:
ARM64에서는 함수의 반환 값을 저장하는 것이 **x0
**입니다. 따라서 x0이 사용자가 제어하는 버퍼의 주소를 저장하고 쉘코드를 실행할 수 있습니다.
예제 코드:
함수의 어셈블리어를 확인하면 버퍼의 주소 (bof에 취약하며 사용자가 제어)가 버퍼 오버플로우에서 반환하기 전에 x0
에 저장된 것을 볼 수 있습니다:
또한 do_stuff
함수에서 br x0
가젯을 찾을 수 있습니다:
PIE가 없이 컴파일된 바이너리를 사용하기 때문에 해당 가젯을 사용하여 이동할 것입니다. 패턴을 사용하면 버퍼 오버플로우의 오프셋이 80임을 확인할 수 있으므로 exploit은 다음과 같을 것입니다:
만약 fgets
대신에 **read
**와 같은 것을 사용했다면, br x0;
명령으로 돌아가기 위해 리턴 어드레스의 마지막 2바이트만 덮어쓰는 것으로 PIE를 우회할 수도 있었을 것입니다. 완전한 주소를 알 필요 없이 동작합니다. fgets
를 사용하면 끝에 널 (0x00) 바이트가 추가되기 때문에 동작하지 않습니다.
NX: 스택이 실행 불가능하면 셸코드를 스택에 배치하고 실행하기 위해 점프해야 하므로 도움이 되지 않습니다.
AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)