2014-07-06 10 views
1

이 게시물을 만들기 전에 이전의 QA를 시도했지만 읽지는 않았지만 정확한 질문에는 대답하지 않는 것 같습니다. .EIP를 ESP 주소로 지정하고 ESP에 내 쉘 코드를 넣었지만 SIGSEGV, Segmentation 오류가 발생했습니다

아래 링크의 가이드를 참고하기도하지만 중요한 것을 놓치고 있습니다.

https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/

다음은이 프로그램의 버퍼 오버 플로우는 내가 EIP와 EBP의 오프셋 (사용 MSF 도구)를 파악, 내가 지금까지 무슨 짓을했는지. 그것은 각각 267과 263입니다.

첫 번째 입력으로 "42"를 입력해야하는 경우 A * 264에 버퍼 오버 플로우를 줄 수있는 다른 질문이 표시됩니다. 아래는 내가 사용하고있는 페이로드입니다. 문자열 42, NOP 썰매 (정확하게 263 개), EBP 값 보존, ESP 메모리 오프셋 (0xbffff480)을 EIP와 쉘 코드에 덮어 씁니다.

http://pastebin.com/g4kK2pC8

I 실행 후에 상기, GDB에서 I는 ESP 및 EIP 값, 즉 동일하다 보면 0xbffff480 내 쉘 코드 넣어하고 EIP이 가리키는 곳이다

. 하지만, 왜 내 쉘 코드가 실행되지 않습니까? "프로그램 수신 신호 SIGSEGV, 세그먼트 오류"로 실패합니다.

어디서 잘못 가고 있는지 잘 모르겠습니다. ESP 값으로 EIP를 가리키거나 겹쳐 쓰는 것에 대한 나의 생각은 잘못 되었습니까? 아니면 내 셸 코드와 관련이 있을까요? 예를 들어 무언가를 출력하거나 실행이 진행되고 있는지 확인하는 간단한 쉘 코드/페이로드를 작성하려면 어떻게해야합니까?

는 업데이트 :

나는 이진은 NX가 내가 가진 출력은 아래의 활성화 여부를 확인하기 위해 checksec.sh 스크립트를 사용했다.

RELRO   STACK CANARY  NX   PIE    RPATH  RUNPATH  FILE 
Partial RELRO No canary found NX enabled No PIE   No RPATH No RUNPATH output 

내 쉘 코드를 실행할 수 없다는 뜻입니까? NX를 우회하거나 우회하는 데 집중해야합니다. - 부분 릴로가 어떤 차이를 낳습니까?

+0

바이너리가 DEP 또는 ASLR을 사용할 수 있습니까? – drum

+0

또한 쉘 코드가 제대로 작동합니까? – drum

+0

빠른 응답을 주셔서 감사합니다 @ 드럼. 어떻게 활성화되어 있는지 확인할 수 있습니까? 또한 어떻게 쉘 코드를 테스트 할 수 있습니까? msfpayload를 사용하여 생성했습니다. 'code'msfpayload linux/x86/exec CMD =/bin/sh R | msfencode -b \ x00 \ xff -t c> 쉘 코드 – h4xorhead

답변

1

편집 : 당신이 컴파일해야합니다, 그래서 난 그냥, 당신의 checksec 출력을 발견 :

gcc -z execstack 

그것은 디버거의 메모리를 보지 않고 어려운,하지만 문제 수 있습니다 당신의 쉘 코드 자체를 디코딩 할 공간이 더 필요합니다.

인코딩 된 쉘 코드 (msfencode로이 작업을하고있는 것을 볼 수 있습니다)는 원하는 페이로드 (linux/x86/exec의 경우)를 실행하기 전에 제 위치에서 디코딩해야합니다. 디코딩 프로세스는 일반적으로 메모리 공간의 일부를 덮어 씁니다. 따라서 쓰기 공간이 충분하지 않으면 문제가 발생할 수 있습니다 (즉, 세그먼트 화 오류). 그래서 아래의 예제에서 우리는 디코더가 0x00000008 이상의 메모리를 덮어 쓰는 것을 보게 될 것입니다 (내가 어디에서 pastebin을 볼 수 없으므로 버퍼와 비슷한 것이 없다면 사과하십시오).

0x0400001C 41 41 41 41 
0x04000018 41 41 41 41 
0x04000014 41 41 41 41 
0x04000010 41 41 41 41 
0x0400000C 55 55 55 55 <-- Return address 
0x04000008 12 34 56 78 <-- Start of shellcode 
0x04000004 90 12 34 56 
0x04000000 78 90 12 34 

인터럽트 ("\ XCC")와 쉘 코드를 붙이는 시도하고 다음 일어나는 것을보기 위해 GDB에서 쉘 코드를 단계별로.

그런 다음 반환 주소와 쉘 코드 시작 사이에 일부 NOP ("\ x90")를 추가 할 수 있습니다. 32 시부 터 시작하는 것이 좋습니다.

이 문제가 발생하면 알려주십시오.

1

당신은 작업을 만들려면 다음 단계를 수행해야 악용 : 1 결정 오프셋 사용 pattern_create/offset.rb 3가 끝 후 일부 NOP를 넣어 덮어 쓰기 EIP 예 : "BBBB"와 같은 아무것도 2 4 NOP 뒤에 쉘 코드 넣기 "jmp esp"또는 "call esp"와 같은 프로그램에서 명령 검색 (https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/ 읽을 수 있음) 6- 주소의 eip를 덮어 쓰십시오. 명령 7- 붐! 쉘 코드 실행