|
http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Board&no=9866 [복사]
===============================================================================
> char shellcode[] =
> "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
> "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
> "\x80\xe8\xdc\xff\xff\xff/bin/sh";
>
>void main() {
> int *ret;
>
> ret = (int *)&ret + 2;
> (*ret) = (int)shellcode;
>
>}
>
> 이렇게 c언어를 만들면 프로그램이 실행이 되잖아요.
> 왜 실행이 되는건가요. 그냥 포인터 선언만 해놓은거 아닌가요.
===============================================================================
간단하게 설명드리자면..
프로그램 내에서 int 형 포인터 변수 ret하나만 선언하므로
이 변수의 위치는 스택상에서 ebp 바로 아래에 위치합니다.
(물론 컴파일러 버전에 따라 약간의 차이가 생길수도...)
ret = (int *)&ret + 2;
그리고 이 코드가 ret이라는 포인터가 가리키는 주소를
자기 자신의 주소 +2로 바꾸는데, 여기서 +2는 int형은 4바이트이므로
8바이트 상위 주소를 가리키도록 합니다
따라서 ret의 8바이트 상위주소는 ebp+4, 즉 프로그램의 리턴어드레스죠.
이 위치에 shellcode의 주소를 저장함으로써
프로그램이 종료되면서 shellcode가 실행되게 합니다.
정상적인 쉘코드라면 쉘이 실행되겠죠. |
Hit : 12488 Date : 2007/12/12 03:16
|