Basic Stack Binary Exploitation Methodology

HackTricks 지원

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: 호출해야 하는 코드에 플래그를 얻기 위해 호출해야 하는 함수가 있음 (특정 매개변수와 함께).

  • PIEcanary가 없는 일반 bof에서는 스택에 저장된 반환 주소에 주소를 쓰기만 하면 됨.

  • PIE가 있는 bof의 경우 우회해야 함

  • canary가 있는 bof의 경우 우회해야 함

  • ret2win 함수를 올바르게 호출하려면 여러 매개변수를 설정해야 하는 경우:

  • 충분한 가젯이 있는 경우 ROP 체인을 사용하여 모든 매개변수를 준비할 수 있음

  • SROP (이 시스템 호출을 호출할 수 있는 경우)을 사용하여 많은 레지스터를 제어할 수 있음

  • ret2csuret2vdso의 가젯을 사용하여 여러 레지스터를 제어할 수 있음

  • Write What Where를 통해 다른 취약점 (bof가 아닌)을 악용하여 win 함수를 호출할 수 있음.

  • 포인터 리다이렉팅: 스택에 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열의 포인터가 포함되어 있는 경우 해당 주소를 덮어쓸 수 있음.

  • ASLR 또는 PIE가 주소에 영향을 줄 수 있음.

목표: RCE

nx가 비활성화되어 있거나 셸코드와 ROP를 혼합하는 경우:

  • (스택) 셸코드: 스택에 셸코드를 저장하고 반환 포인터를 덮거나 덮은 후에 점프하여 실행하는 데 유용함:

  • 일반 bof에서 canary가 있는 경우 우회(유출)해야 함

  • ASLRnx가 없는 경우 스택 주소로 점프할 수 있음

  • ASLR가 있는 경우 ret2esp/ret2reg와 같은 기술을 사용하여 점프할 수 있음

  • nx가 있는 경우 ROP를 사용하여 memprotect를 호출하여 페이지를 rwx로 만든 다음 거기에 셸코드를 저장(예: read 호출)한 후 거기로 점프해야 함.

  • 이는 셸코드를 ROP 체인과 혼합하는 것입니다.

시스콜을 통해

  • Ret2syscall: 임의의 명령을 실행하기 위해 execve를 호출하는 데 유용합니다. 특정 시스콜을 매개변수와 함께 호출하는 가젯을 찾을 수 있어야 합니다.

  • 만약 ASLR 또는 PIE가 활성화되어 있다면, 바이너리나 라이브러리에서 ROP 가젯을 사용하기 위해 이를 우회해야 합니다.

  • SROPret2execve를 준비하는 데 유용할 수 있습니다.

  • ret2csuret2vdso에서 여러 레지스터를 제어하기 위한 가젯

libc를 통해

  • Ret2lib: 주로 **libc**에서 **system**과 같은 함수를 호출하는 데 유용하며 일부 준비된 인수(예: '/bin/sh')로 호출합니다. 호출하려는 함수가 있는 라이브러리를 바이너리가 로드해야 합니다(libc 일반적으로).

  • 정적으로 컴파일되고 PIE가 없는 경우, system/bin/sh주소가 변경되지 않으므로 정적으로 사용할 수 있습니다.

  • ASLR비활성화되어 있고 로드된 libc 버전을 알고 있는 경우, system/bin/sh주소가 변경되지 않으므로 정적으로 사용할 수 있습니다.

  • ASLR가 있지만 PIE가 없는 경우, libc를 알고 있고 바이너리가 system을 사용하지 않는 경우:

  • ret2dlresolve를 사용하여 system의 주소를 해결하고 호출합니다

  • ASLR를 우회하고 메모리에서 system'/bin/sh'의 주소를 계산합니다.

  • ASLRPIE가 모두 활성화되어 있지만 libc를 모르는 경우: 다음을 수행해야 합니다:

  • PIE 우회

  • 사용된 libc 버전 찾기 (몇 가지 함수 주소 누출)

  • 계속하기 위해 ASLR과 관련된 이전 시나리오 확인

EBP/RBP를 통해

  • Stack Pivoting / EBP2Ret / EBP Chaining: 저장된 EBP를 통해 ESP를 제어하여 스택에서 RET를 제어합니다.

  • 오프 바이 원 스택 오버플로우에 유용

  • EIP를 제어하는 대체 방법으로 유용하며, EIP를 남용하여 메모리에서 페이로드를 구성한 다음 EBP를 통해 그것으로 이동하는 방법

기타

  • 포인터 리다이렉팅: 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 이어지는 함수를 가리키는 포인터가 스택에 포함되어 있는 경우 해당 주소를 덮어쓸 수 있습니다.

  • ASLR 또는 PIE가 주소에 영향을 줄 수 있습니다.

  • 초기화되지 않은 변수: 알 수 없습니다

Last updated