2017-11-18 30 views
0

버퍼 오버플로 익스플로잇을 이해하려고합니다.보다 구체적으로 어떻게 자신의 코드를 실행하는 데 사용할 수 있습니까? 우리 자신의 악의적 인 응용 프로그램이나 비슷한 것을 시작합니다.버퍼 오버플로 익스플로잇을 사용하여 자체 코드 실행

gets() 함수를 사용하여 버퍼 오버플로 문제를 이해하고 있지만 (충분히 긴 문자열로 반환 주소를 덮어 쓰고 그 주소로 건너 뛰기) 이해할 수있는 몇 가지 사항이 있습니다. 실제 응용 프로그램에서는 다음과 같습니다 :

  • 반환 코드 바로 뒤에있는 문자열에 내 코드를 넣을 수 있습니까? 그렇다면 점프 할 주소를 어떻게 알 수 있습니까? 그리고 그렇지 않다면 어디서 뛰어 오르고 실제 코드는 어디에 있습니까?

  • 코드를 실행하는 실제 페이로드는 실행중인 소프트웨어이고 다른 프로그램은 페이로드에 제공된 모든 지침입니까? 또는 더 구체적으로, 버퍼 오버플로 익스플로잇 구현은 실제로 어떻게 생겼습니까?

  • 주소 (또는 명령어)에 0이 포함되어 있으면 어떻게해야합니까? gets() 함수는 0을 읽었을 때 읽기를 멈추므로이 문제를 어떻게 해결할 수 있습니까? 숙제로

은, 난 그냥() (ASLR은 해제) 도착으로 입력을 요청하는 매우 간단한 프로그램을 이용하려고하고 다음을 인쇄하고 있습니다. 함수를 호출하는 함수의 메모리 주소와 리턴 값을 찾을 수는 있지만 실제로 익스플로잇을 구현하는 방법을 알 수는 없습니다.

+0

일반적으로 공유 라이브러리 중 하나에서 jmp에서 rsp와 같은 명령어를 찾습니다. 공유 라이브러리는 항상 알려진 주소에로드되므로 외부에서 이러한 함수의 주소를 확인할 수 있습니다. –

+0

이것은 [Sec.SE] (https://Security.stackexchange.com) – SmokeDispenser

답변

0

반송 주소를 변경하면 임의의 위치로 이동할 수있는 방법을 알고 있습니다.

그러나 올바르게 식별 했으므로 실행할 코드를 어디에로드했는지 알 수 없습니다. 방금 로컬 버퍼에 복사했습니다 (스택의 대부분은 일부였습니다).

그러나 항상이 스택을 가리키며 스택 포인터 레지스터입니다. (x64로 가정하면 %rsp이됩니다).

맞춤 코드가 스택의 맨 위에 있다고 가정합니다. (그것은 상쇄 될 수 있지만 비슷하게 관리 될 수 있습니다).

이제 지침이 필요합니다. 1. esp 으로 점프 할 수 있습니다. 2. 고정 주소에 있습니다.

그래서 대부분의 바이너리는 일종의 공유 라이브러리를 사용합니다. 창문에는 kernel32.dll이 있습니다. 이 라이브러리가로드 된 모든 프로그램에서 항상 동일한 주소에 매핑됩니다. 따라서이 라이브러리의 모든 명령어의 정확한 위치를 알 수 있습니다.

jmp *%rsp // or a sequence of instructions that lets you jump to an offset 

같은 명령어를 하나의 라이브러리를 분해하면된다 찾아해야하는 것은 그런 다음이 명령의 주소는 복귀 주소가 있어야하는데 위치를 배치 할 것입니다. 이 함수는 리턴 한 다음 스택으로 점프합니다 (물론 실행 스택이 필요합니다). 그런 다음 임의의 코드가 실행됩니다.

악용 실행 방법을 혼란스럽게하는 희망.

은 다른 질문에 대한 답변 -

예 직접 버퍼에 코드를 배치 할 수 있습니다. 또는 (다시 공유 라이브러리에서) 실행하고자하는 정확한 코드를 찾을 수 있다면 간단하게 그 코드로 건너 뛸 수 있습니다.

예, gets\n과 0에서 멈출 것입니다.하지만 보통 이러한 바이트를 전혀 사용하지 않는 코드를 작성하기 위해 지침을 약간 변경하면 빠져 나갈 수 있습니다.

다른 지침을 시도하고 조합 된 바이트를 확인하십시오.

+0

과 매우 잘 어울릴 수있었습니다. ESP로 점프 할 수 있다는 사실을 깨닫게 해 주셔서 감사합니다. 버퍼)가 갑자기 나를 어떻게 도울 수 있는지 알게되었습니다. – Cerpin