2011-12-17 5 views
0

스택을 제어하여 교육용으로 C 코드의 취약점을 악용하고 싶습니다. 쉘 코드가 실행되어야하는 주소로 리턴 주소를 겹쳐 쓰는 간단한 스택 기반 버퍼 오버 플로우. 이 코드는 인수로 버퍼를 사용하고 버퍼를 고정 크기로 strcpy()으로 시도하는 간단한 함수입니다. main에서 주어진 매개 변수는 argv[1]입니다. 그래서 만약 내가 정확한 메모리 양을 찾으면 나는 단지 입력으로 문자열을 \x90 (NOP 명령) 다음에 쉘 코드와 마지막으로이 버퍼의 주소로 구성하여 줄 수 있다고 생각한다. 이것이 첫 번째 인수이기 때문에 주소는 $ebp+8이고 gdb을 실행하여 찾을 수 있습니다. 함수의 시작 부분에 중단 점을 설정하고 i args을 입력하면 인수로 전달되는 문자열의 주소가 제공됩니다. 그래서 만약 내가 n 바이트를 덮어 쓰고 주소 값을 주면 리턴 주소를 정확히 덮어 쓴다는 것을 알았다. 그래서 저는 다음과 같은 의견을 가지고 있습니다 :ret 주소가 오버플로 된 후 함수의 인수로 주어진 문자열의 주소가 변경된 이유는 무엇입니까?

perl -e print(\x90 x n-sizeof(shellcode) . shellcode . address)' 

나는 그 이유를 이해하려고 노력했습니다. gdb으로 프로그램을 실행합니다. strcpy() 함수 앞에 중단 점을 두었습니다. 그 시점에서 필자는 필자의 입력을 가리키는 문자열 포인터 인 인수를 가지며 그 주소는 문자열 입력의 끝 부분에 주어진 주소와 동일합니다. 앞으로 한 명령 밟았습니다. 나는 스택을 조사했다. 이제 argv[1] 끝에 주어진 주소의 값을 가진 저장된 eip ($ebp + 4)이 예상 된 동작입니다 (즉, 첫 번째 인수의 값인 ret 주소보다 다른 다른 주소를 덮어 쓰지 않음을 의미 함)). 이상한 것은 이제 $ebp+8의 내용이 "주소"가 아니라 다른 것인가? 그러나 저장된 eip의 내용은 부름을 이용하는 내 문자열을 가리키는 주소입니다. 그러나 ret addr이 해당 주소의 내용을 실행하는 것처럼 보이지는 않습니다.

+1

확실히 컴파일러가 buf를 어디에 두어야하는지 알고 싶습니까? –

+0

장소를 알아야하는 이유는 무엇입니까? 크기와 어떤 관계가 있습니까? – curious

+0

스택에서 어디서 쓰는 지 알아야하기 때문에. –

답변

1

스택 프레임 구성 방법은 ABI의 일부입니다. Linux가 x86-64에서 사용하는 ABI에 대한 설명은 here입니다. 당신은 당신이 필요로하는 모든 것을 발견 할 것입니다. 스택 프레임 구성은 3.2 절을 참조하십시오.