| cd80 |
질문 위에 버퍼오버플로우를 정의하신부분이 약간 애매한것같아 다시 써보자면
버퍼오버플로우는 메모리의 복사가 일어날 때 복사한 데이터를 써넣는 영역을 넘어선 크기의 데이터가 복사될경우 일어납니다
스택버퍼오버플로우의 경우 스택에 존재하는 변수들의 데이터를 덮어씌우거나 리턴어드레스를 변조할 수 있고
리턴어드레스를 변조함으로써 프로그램의 실행을 조작할 수 있습니다
이를 이용해 현재 실행되고 있는 프로그램의 권한을 획득하는것이구요
ftz level11을 예로 들어보겠습니다
int main(int argc, char **argv){
,,,,,,,,char buf[256];
,,,,,,,,strcpy(buf, argv[1]);
,,,,,,,,return 0;
}
이 프로그램의 실행권한을 제어할 수 있는 이유는
strcpy에 의해 buf에 argv[1]이 제한없이 데이터가 들어가
main함수를 call 할때 스택에 들어간 리턴어드레스가 덮어씌워지고
main함수 마지막 ret명령에서 덮어씌워진 리턴어드레스가 eip로 들어가기 때문입니다
따라서 main함수의 스택프레임 레이아웃은 아래처럼 생겼습니다
ret
sfp
-------------- <- ebp
|,,,,,,,,,f,,,,,,,,,,|
|,,,,,,,,,u,,,,,,,,,|
|,,,,,,,,,b,,,,,,,,,|
-------------- <- esp
strcpy에 의해 buf의 처음부터 데이터가 들어가고
buf[256] + sfp[4] + ret[4] = 264바이트를 argv[1]에 넣게되면
strcpy로 buf[256]에 264바이트가 들어가게 되어 리턴어드레스가 덮어씌워지게됩니다
1. 프로세서 계열에 따라 다르지만 인텔 프로세서는 리틀엔디안 방식을 사용합니다
2. 당연한 말이지만 버퍼의 크기를 넘어서는 데이터를 넣어주시면 됩니다
gdb 등으로 확인하실 수 있습니다
3. 쉘코드는 쉘을 실행하는 코드라 해서 쉘코드라 부릅니다
보통 시스템콜을 이용하고
어셈블리어로 작성하셔도 되고 C로 작성해서 쓸수있는 형태로 만드셔도됩니다
쉘코드 작성은 어셈블리어로 하시는게 더 편합니다
에그쉘은 쉘코드를 작성해주는 프로그램이 아니라
환경변수에 쉘코드를 넣고 환경변수상에서 쉘코드가 위치하는 주소를 알려주는 프로그램입니다 |
2014/02/01 |
|