Basic Stack Binary Exploitation Methodology
ELF 기본 정보
어떤 것을 악용하기 전에 ELF 바이너리의 구조 일부를 이해하는 것이 흥미로울 수 있습니다:
ELF Basic Information악용 도구
Exploiting Tools스택 오버플로우 방법론
다양한 기술이 있기 때문에 각 기술이 언제 유용할지 알 수 있는 체계를 갖는 것이 좋습니다. 동일한 보호 기능이 다른 기술에 영향을 미칠 수 있음을 유의하십시오. 각 보호 기능 섹션에서 보호 기능을 우회하는 방법을 찾을 수 있지만 이 방법론에서는 다루지 않습니다.
흐름 제어
프로그램의 흐름을 제어하는 여러 방법이 있습니다:
스택 오버플로우: 스택에서 반환 포인터 또는 EBP -> ESP -> EIP를 덮어쓰기.
오버플로우를 유발하기 위해 정수 오버플로우를 악용할 수 있음
또는 임의 쓰기 + 실행할 내용이 있는 위치로 쓰기
포맷 문자열:
printf
를 악용하여 임의의 내용을 임의의 주소에 쓰기.배열 인덱싱: 제어할 수 있는 배열을 얻기 위해 잘못 설계된 인덱싱을 악용.
오버플로우를 유발하기 위해 정수 오버플로우를 악용할 수 있음
bof to WWW via ROP: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있음.
Write What Where to Execution 기술은 다음에서 찾을 수 있습니다:
https://github.com/HackTricks-wiki/hacktricks/blob/kr/binary-exploitation/arbitrary-write-2-exec/README.md영원한 루프
일반적으로 취약점의 단일 악용만으로는 성공적인 악용을 실행하는 데 충분하지 않을 수 있음을 고려해야 합니다. 특히 일부 보호 기능을 우회해야 하는 경우가 있습니다. 따라서 단일 취약점을 동일한 이진 실행에서 여러 번 악용할 수 있는 옵션을 고려하는 것이 흥미로울 수 있습니다:
ROP 체인에
main
함수의 주소 또는 취약점이 발생하는 주소를 쓰기적절한 ROP 체인을 제어하면 해당 체인에서 모든 작업을 수행할 수 있음
exit
주소를 GOT에 쓰기 (또는 종료 전에 이진 파일에서 사용되는 다른 함수)하여 취약점으로 돌아가기.fini_array에서 설명한대로 여기에 2개의 함수를 저장하여 취약점을 다시 호출하고
.fini_array
에서 함수를 다시 호출하는**__libc_csu_fini
** 함수를 호출할 수 있음.
악용 목표
목표: 기존 함수 호출
ret2win: 호출해야 하는 코드에 플래그를 얻기 위해 호출해야 하는 함수가 있음 (특정 매개변수와 함께).
PIE가 있는 bof의 경우 우회해야 함
canary가 있는 bof의 경우 우회해야 함
ret2win 함수를 올바르게 호출하려면 여러 매개변수를 설정해야 하는 경우:
충분한 가젯이 있는 경우 ROP 체인을 사용하여 모든 매개변수를 준비할 수 있음
SROP (이 시스템 호출을 호출할 수 있는 경우)을 사용하여 많은 레지스터를 제어할 수 있음
Write What Where를 통해 다른 취약점 (bof가 아닌)을 악용하여
win
함수를 호출할 수 있음.포인터 리다이렉팅: 스택에 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열의 포인터가 포함되어 있는 경우 해당 주소를 덮어쓸 수 있음.
초기화되지 않은 변수: 알 수 없음.
목표: RCE
nx가 비활성화되어 있거나 셸코드와 ROP를 혼합하는 경우:
(스택) 셸코드: 스택에 셸코드를 저장하고 반환 포인터를 덮거나 덮은 후에 점프하여 실행하는 데 유용함:
일반 bof에서 canary가 있는 경우 우회(유출)해야 함
ASLR가 있는 경우 ret2esp/ret2reg와 같은 기술을 사용하여 점프할 수 있음
이는 셸코드를 ROP 체인과 혼합하는 것입니다.
시스콜을 통해
Ret2syscall: 임의의 명령을 실행하기 위해
execve
를 호출하는 데 유용합니다. 특정 시스콜을 매개변수와 함께 호출하는 가젯을 찾을 수 있어야 합니다.SROP은 ret2execve를 준비하는 데 유용할 수 있습니다.
libc를 통해
Ret2lib: 주로 **
libc
**에서 **system
**과 같은 함수를 호출하는 데 유용하며 일부 준비된 인수(예:'/bin/sh'
)로 호출합니다. 호출하려는 함수가 있는 라이브러리를 바이너리가 로드해야 합니다(libc 일반적으로).정적으로 컴파일되고 PIE가 없는 경우,
system
및/bin/sh
의 주소가 변경되지 않으므로 정적으로 사용할 수 있습니다.ASLR가 비활성화되어 있고 로드된 libc 버전을 알고 있는 경우,
system
및/bin/sh
의 주소가 변경되지 않으므로 정적으로 사용할 수 있습니다.ret2dlresolve
를 사용하여system
의 주소를 해결하고 호출합니다ASLR를 우회하고 메모리에서
system
및'/bin/sh'
의 주소를 계산합니다.ASLR 및 PIE가 모두 활성화되어 있지만 libc를 모르는 경우: 다음을 수행해야 합니다:
PIE 우회
사용된
libc
버전 찾기 (몇 가지 함수 주소 누출)계속하기 위해 ASLR과 관련된 이전 시나리오 확인
EBP/RBP를 통해
Stack Pivoting / EBP2Ret / EBP Chaining: 저장된 EBP를 통해 ESP를 제어하여 스택에서 RET를 제어합니다.
오프 바이 원 스택 오버플로우에 유용
EIP를 제어하는 대체 방법으로 유용하며, EIP를 남용하여 메모리에서 페이로드를 구성한 다음 EBP를 통해 그것으로 이동하는 방법
기타
포인터 리다이렉팅: 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 이어지는 함수를 가리키는 포인터가 스택에 포함되어 있는 경우 해당 주소를 덮어쓸 수 있습니다.
초기화되지 않은 변수: 알 수 없습니다
Last updated