got overwrite 예제

Uncategorized by nrhpadmin

이 일이 일어나는 것을 볼 수있는 방법은 ASLR (아래 예제에서 WinRAR)을 지원하는 실행 작업을 연결하는 것입니다. OllyDbg에 연결하고 메모리 탭 (ALT + M)으로 이동합니다. 경우에 따라 문자열(예: null 바이트)에 문자가 추가됩니다. 이것은 당신이 EIP의 낮은 2 바이트를 덮어 쓰려고 할 때 0xAABBXXYY 대신 0xAA00XXYY가되는 것처럼 이전 기술을 엉망으로 합니다. 이렇게 하면 적절한 명령을 찾을 수 있지만 단일 바이트로 도망칠 수 있습니다. 2) G1이 `%eax, 0x5D5B04C4(%ebx)` 작동인 이유는 무엇입니까? GOT 역참조 섹션의 가젯 1이 `addl-0x0B8A008(%ebx)`이어야 하지 않겠습니까? 또는 수동 상단 가젯 검색 섹션이 참조가 아닌 GOT 덮어쓰기를 수행하는 수동 방법입니까? 예: DLL은 0xABB0000으로 로드되며, 하위 2바이트만 덮어쓰면(작은 엔디언스 덕분에) 기본적으로 EIP를 제어하여 0xABb0000에서 0xAABBXXY로 이동할 수 있습니다. 아래의 모든 예제는 x86 Linux 플랫폼에 있지만 개념은 모두 x86-64에 동일하게 적용됩니다. (그리고, 나는 개념이 ELF 연결 및 glibc와 관련이 있기 때문에 리눅스의 다른 아키텍처라고 가정하지만, 나는 확인하지 않았다.) 다른 한편으로는.got.plt 섹션은 기본적으로 함수 포인터의 거대한 배열입니다! 어쩌면 우리는 이들 중 하나를 덮어 쓰고 거기에서 실행을 제어 할 수 있습니다. 팀 테소의 2001년 논문에 설명된 바와 같이 이것은 매우 일반적인 기술입니다. (이봐, 나는 이 기술이 새로운 것이라고 말한 적이 없다.) 기본적으로 임의(공격자가 제어하는) 주소에 쓸 수 있는 메모리 손상 기본 항목은 GOT 항목을 덮어쓸 수 있습니다. 그래서이 말도 안되는 모든 무엇입니까? 음, 모든 시스템에 바이너리의 두 가지 유형이있다: 정적 연결 및 동적으로 연결. 정적으로 연결된 바이너리는 단일 파일 내에서 실행하는 데 필요한 모든 코드를 포함하는 자체 포함이며 외부 라이브러리에 의존하지 않습니다.

동적으로 연결된 바이너리(gcc 및 대부분의 다른 컴파일러를 실행할 때 기본값)는 많은 함수를 포함하지 않지만 시스템 라이브러리에 의존하여 기능의 일부를 제공합니다. 예를 들어 바이너리가 printf를 사용하여 일부 데이터를 인쇄하는 경우 printf의 실제 구현은 시스템 C 라이브러리의 일부입니다. 일반적으로 현재 GNU/Linux 시스템에서는 현재 GNU Libc 라이브러리의 이름인 libc.so.6에서 이 작업을 제공합니다. EIP를 제어하기 때문에 덮어쓰려는 EIP의 양도 제어할 수 있습니다. 이미 언급 했듯이 ASLR은 상위 2 바이트만 무작위로 지정하므로 이를 사용하고 하위 2 바이트만 덮어 쓸 수 있다면 어떨까요? 의 디레퍼티를 확인하고 jmp를 따르십시오. 포인터는 위에서 설명한 대로 .got.plt 섹션에 있습니다. 잠깐, 그 가리키는 곳은 어디입니까? 그것은 ld.so 데이터 세그먼트에 첫 번째 포인트를 밝혀, 그리고 실행 영역으로 2 번째: 좋아, 지금 우리는 우리가이 모든 작동 하는 방법을 알고 생각, 어떻게 pwner로, 이것을 사용할 수 있습니까? 음, pwning일반적으로 프로그램의 실행의 흐름을 제어하는 것을 포함한다.