got overwrite 예제

예: DLL은 0xABB0000으로 로드되며, 하위 2바이트만 덮어쓰면(작은 엔디언스 덕분에) 기본적으로 EIP를 제어하여 0xABb0000에서 0xAABBXXY로 이동할 수 있습니다. 이 일이 일어나는 것을 볼 수있는 방법은 ASLR (아래 예제에서 WinRAR)을 지원하는 실행 작업을 연결하는 것입니다. OllyDbg에 연결하고 메모리 탭 (ALT + M)으로 이동합니다. 그래서이 말도 안되는 모든 무엇입니까? 음, 모든 시스템에 바이너리의 두 가지 유형이있다: 정적 연결 및 동적으로 연결. 정적으로 연결된 바이너리는 단일 파일 내에서 실행하는 데 필요한 모든 코드를 포함하는 자체 포함이며 외부 라이브러리에 의존하지 않습니다. 동적으로 연결된 바이너리(gcc 및 대부분의 다른 컴파일러를 실행할 때 기본값)는 많은 함수를 포함하지 않지만 시스템 라이브러리에 의존하여 기능의 일부를 제공합니다. 예를 들어 바이너리가 printf를 사용하여 일부 데이터를 인쇄하는 경우 printf의 실제 구현은 시스템 C 라이브러리의 일부입니다. 일반적으로 현재 GNU/Linux 시스템에서는 현재 GNU Libc 라이브러리의 이름인 libc.so.6에서 이 작업을 제공합니다. 2) G1이 `%eax, 0x5D5B04C4(%ebx)` 작동인 이유는 무엇입니까? GOT 역참조 섹션의 가젯 1이 `addl-0x0B8A008(%ebx)`이어야 하지 않겠습니까? 또는 수동 상단 가젯 검색 섹션이 참조가 아닌 GOT 덮어쓰기를 수행하는 수동 방법입니까? 다른 한편으로는.got.plt 섹션은 기본적으로 함수 포인터의 거대한 배열입니다! 어쩌면 우리는 이들 중 하나를 덮어 쓰고 거기에서 실행을 제어 할 수 있습니다. 팀 테소의 2001년 논문에 설명된 바와 같이 이것은 매우 일반적인 기술입니다. (이봐, 나는 이 기술이 새로운 것이라고 말한 적이 없다.) 기본적으로 임의(공격자가 제어하는) 주소에 쓸 수 있는 메모리 손상 기본 항목은 GOT 항목을 덮어쓸 수 있습니다.

아래의 모든 예제는 x86 Linux 플랫폼에 있지만 개념은 모두 x86-64에 동일하게 적용됩니다. (그리고, 나는 개념이 ELF 연결 및 glibc와 관련이 있기 때문에 리눅스의 다른 아키텍처라고 가정하지만, 나는 확인하지 않았다.) 경우에 따라 문자열(예: null 바이트)에 문자가 추가됩니다. 이것은 당신이 EIP의 낮은 2 바이트를 덮어 쓰려고 할 때 0xAABBXXYY 대신 0xAA00XXYY가되는 것처럼 이전 기술을 엉망으로 합니다. 이렇게 하면 적절한 명령을 찾을 수 있지만 단일 바이트로 도망칠 수 있습니다. EIP를 제어하기 때문에 덮어쓰려는 EIP의 양도 제어할 수 있습니다. 이미 언급 했듯이 ASLR은 상위 2 바이트만 무작위로 지정하므로 이를 사용하고 하위 2 바이트만 덮어 쓸 수 있다면 어떨까요? TL;DR: .plt로 시작하는 사람들은 대상으로 이동하는 스텁을 포함하고 . .got.plt는 특히 대상 바이너리가 PIE가 부족하여 .got.plt가 고정 된 주소로 로드되는 경우 printf 형식 문자열 악용 및 기타 임의 쓰기 악용에 대한 매력적인 대상입니다. 전체 RELRO를 활성화하면 GOT에 쓰기를 방지하여 이러한 공격으로부터 보호합니다. 나는 같은 문제가, 당신이 지금 해결책을 찾을 경우, 모르는 경우, 제발 말해, 확인 감사합니다, 우리는 풋을 호출하려고합니다.

호출되는 주소는 .plt 섹션에서 이진에 로컬이므로 puts@plt의 특수 기호 이름이 있습니다. 실제 puts 함수에 도착할 때까지 프로세스를 단계별로 살펴보겠습니다. 예: JMP ESP 명령은 test.dll의 0×12345678에 있으며, 다시 시작하면 주소가 0xABCD5678에 있습니다. 대부분의 악용은 페이로드로 실행을 리디렉션하는 방법이 필요하며, 이 작업은 여러 가지 방법으로 수행할 수 있습니다.