여러 가지 스타일의 버퍼 오버플로를 검토 중이며 문제가 발생하여 그 이유가 기억 나지 않습니다.Linux 버퍼 오버플로 환경 변수
#include <stdio.h>
void func(char *buff){
char buffer[5];
strcpy(buffer, buff);
printf("%s\n", buffer);
}
int main(int argc, char *argv[]){
func(argv[1]);
printf("I'm done!\n");
return 0;
}
프로그램의 핵심 개념은 매우 간단합니다, 그냥 func()
의 반환 주소를 덮어 버퍼 오버 플로우를 다음과 같이 코드는 내가에 버퍼 오버 플로우를 수행하려고 시도 오전 프로그램입니다. 그게 모든 프로그램의 <_fini>
일이 0x0804850c
같은 주소를 줄 때 위대한 작품. 해당 주소로 오버플로를 구현할 때 최종 결과는 프로그램이 종료되지 않고 "정상적으로"종료됩니다. I'm done!
. 내가 지금 실행하고있는 문제는 반환 주소를 무언가로 리디렉션하려고 할 때 환경 변수가 0xbfffd89
에 위치 할 때입니다.
해당 환경 변수에있는 셸 코드는 hello
이라고 말한 후 프로그램을 종료해야합니다. 그러나 그것이 발생하지 않습니다, 프로그램은 단순히 결함을 seg하고 그게 전부입니다. 쉘 코드는 쉘 코드를 테스트하기 위해 작성한 이전 프로그램에서 작동하는 것으로 이미 확인되었습니다. 누구나 이것이 왜 작동하지 않는지 알 수 있습니다. Thx
gdb에서 실행하여 segfault를 트리거하는 항목을 확인하십시오. 내 추측 : 환경 변수는 읽을 수는 있지만 실행 가능하지 않은 메모리 영역에 있습니다[email protected] EugeneMayevski'EldoSCorp : 여기에 "쉘 코드"란 쉘과 일부 외부 명령을 실행하는 기계어에 대한 전문 용어로, 일반적으로 악용하려는 작업입니다. 이 경우 실제 쉘이 실행되지 않는 것처럼 들리지만. – Celada
@Celada GDB를 사용하여 환경 변수가 읽기 전용인지 확인하는 방법에 대한 제안. 또한 쉘 코드에 대해서도 정확합니다. – Blackninja543
@ EugeneMayevski'EldoSCorp 일반적으로 정의 된 쉘 코드는 바이너리의 바이트 코드입니다. 이 경우 나는 x86 ASM에서 원하는 것을 작성하여 쉘 코드를 생성했다. 함수의 리턴 주소를 리다이렉트 할 때 새로운 명령어 세트가 들어있는 메모리 영역으로 전달한다. – Blackninja543