Stack Shellcode
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)
스택 셸코드는 바이너리 익스플로잇에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 명령 포인터 (IP) 또는 **확장 명령 포인터 (EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되도록 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 pwntools를 사용하여 해당 익스플로잇을 작성하는 방법입니다.
간단한 취약한 C 프로그램의 예로 시작해 보겠습니다:
이 프로그램은 gets()
함수를 사용하여 버퍼 오버플로우에 취약합니다.
이 프로그램을 다양한 보호 기능을 비활성화하여 컴파일하려면 (취약한 환경을 시뮬레이션하기 위해) 다음 명령어를 사용할 수 있습니다:
-fno-stack-protector
: 스택 보호를 비활성화합니다.
-z execstack
: 스택을 실행 가능하게 만들어, 스택에 저장된 shellcode를 실행하는 데 필요합니다.
-no-pie
: 위치 독립 실행 파일을 비활성화하여, 우리의 shellcode가 위치할 메모리 주소를 예측하기 쉽게 만듭니다.
-m32
: 프로그램을 32비트 실행 파일로 컴파일하여, 익스플로잇 개발의 단순성을 위해 자주 사용됩니다.
다음은 pwntools를 사용하여 ret2shellcode 공격을 수행하는 익스플로잇을 Python으로 작성하는 방법입니다:
이 스크립트는 NOP 슬라이드, 쉘코드로 구성된 페이로드를 생성한 다음, EIP를 NOP 슬라이드를 가리키는 주소로 덮어써서 쉘코드가 실행되도록 합니다.
NOP 슬라이드(asm('nop')
)는 정확한 주소에 관계없이 실행이 우리의 쉘코드로 "슬라이드"될 가능성을 높이기 위해 사용됩니다. p32()
인수를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하여 NOP 슬라이드에 도달하도록 합니다.
ASLR 는 비활성화되어야 실행 간에 주소가 신뢰할 수 있도록 하며, 함수가 저장될 주소가 항상 동일하지 않기 때문에 win 함수가 로드된 위치를 파악하기 위해서는 어떤 leak이 필요합니다.
스택 카나리도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다.
NX 스택 보호는 스택 내에서 쉘코드의 실행을 방지합니다. 해당 영역은 실행 가능하지 않기 때문입니다.
64비트, 스택 주소 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
32비트, 스택 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기
32비트, 스택 leak가 있는 ASLR, exit() 호출을 방지하기 위한 비교, 변수에 값을 덮어쓰고 쉘코드를 작성하고 점프하기
arm64, ASLR 없음, 스택을 실행 가능하게 만드는 ROP 가젯 및 스택 내 쉘코드로 점프하기
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)