2012-07-15 10 views
0

exploit_notesearch 프로그램에 관한 질문이 있습니다.착취 기술 - exploit_notesearch.c

이 프로그램은 마지막으로 system() 함수로 호출하여 버퍼 오버플로 취약점이있는 notesearch 프로그램을 악용하는 명령 문자열을 만드는 데만 사용됩니다. commandstr은 다음과 같습니다. ./notesearch Nop-block | shellcode | repeated ret (nop 블록에서 점프합니다).

지금 실제 질문 : RET-ADRESS가 선으로 exploit_notesearch 프로그램 계산 :

RET = (부호 INT) & I 오프셋;

는 왜 우리는 넘치는 버퍼에 저장됩니다 RET 주소를 계산하기 위해 exploit_notesearch 프로그램의 메인 StackFrame을 하단에 아주이다 I-변수의 주소를 사용할 수 있습니다 notesearch 프로그램 자체에서는 이 완전히 다른 스택 프레임에 있고, nop 블록 (동일한 버퍼에 있음)에 주소를 포함해야합니다.

답변

0

이 스택은 최후 외출 방식으로 할당됩니다. 변수의 위치는 상단의 어딘가에 있으며 0x200이라고 가정 할 수 있으며 반환 주소는 더 낮은 주소 0x180에 있으므로 반환 주소를 넣을 위치를 결정할 수 있으며 아직 쉘 코드에서 공격자는 0x200 - 0x180 = 0x80 (128) 인 차이점을 가져와야하므로 다음과 같이 중단합니다. ++, 리턴 주소는 4 바이트이므로 도달하기 전에 남은 길이는 48 바이트입니다 세그먼트 화. 그것이 계산되는 방법이며 위치는 대략적인 기준점을 제공합니다.

1
완전히 다른 StackFrame을 너무 상기 notesearch 프로그램 자체가 넘쳐 버퍼에 저장 될

만큼 시스템의 가상 메모리를 사용하는 등의 다른 처리가 위해 system() 의해 생성 될

취약점이있는 프로그램이 있고 스택 무작위 화가 없다고 가정하면 두 프로세스는 공격을받은 시스템에서 공격이 컴파일 된 경우 해당 main() 함수가 시작될 때 (및 offset)과 거의 동일한 값을 갖게됩니다 (예 : 취약한 메모 검색).
변수 i의 주소는 프레임 기본 위치에 대한 아이디어를 제공하기 위해 선택되었습니다. 우리는 대신을 사용할 수 있습니다 변수 iesp에서 상대적으로 일정한 거리에 위치 할 것이기 때문에, 우리는 esp 대신 &i을 사용할 수 있습니다

unsigned long sp(void)   // This is just a little function 
{ __asm__("movl %esp, %eax");} // used to return the stack pointer 

int main(){ 

esp = sp(); 
ret = esp - offset; 

//the rest part of main() 

} 

, 그것은별로 중요하지 않습니다.

시스템에서 가상 메모리를 사용하지 않은 경우 ret에 대한 대략적인 값을 얻는 것이 훨씬 더 어려울 것입니다.