|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1971 [복사]
인터넷에서 쉽게 구할 수 있는 Buffer OverFlow [BOF] '강좌'문서들을 보면
처음공부하시는분들은 버퍼에 저장된 데이터값이 거꾸로 쓰여있는 것을 보고 생각합니다.
' 이거 머지???ㅠ 왜 거꾸로지??ㅠ 그냥 편하게 순서대로 쓰면 안되나??ㅠ '
검색 or 강좌에 설명된 내용을 통해 little endian 방식이기때문에 그렇다는것을 알게됩니다.
하지만,
>> 왜 little endian방식을 사용하는 것 일까요?? <<
예를 들어, 버퍼에 저장될 데이터가 0x00000037 이라고 해봅시다.
그럼 Big Endian , Little Endian 에 따라 다음과 같이 저장되겠죠.
( 주소는 임의로 쓴 것이니 신경쓰지마세요. )
Big Endian - Data(데이터) Addr(주소) Data(데이터) - Little Endian
----- -------- -----
0x00 0x100 0x37
----- -------- -----
0x00 0x101 0x00
----- -------- -----
0x00 0x102 0x00
----- -------- -----
0x37 0x103 0x00
----- -------- -----
0x00000037 은 '7' 입니다.
이제 다음과 같은 C 코드를 생각해 봅시다.
#include <stdio.h>
void main()
{
int Number = 7;
long *lp = (long *) &Number;
char *cp = (char *) &Number;
//이하 생략, ( 포인터가 이해안되신다면 곤란합니다... )
}
자, 이제 한번 더 생각해보져.
만약 버퍼에 저장되는 방식이 Big Endian 방식이라면,
다음과 같은 식이 성립할까요?
Number == *lp == *cp == 7
답은 "그렇지 않다." 입니다.
C language 에서,
int 형은 4byte 크기의 자료형입니다.
long 형은 4byte 크기의 자료형입니다.
그러나 " char 형은 1byte 크기의 자료형입니다. "
char 형은 데이터을 가져올때 1byte크기만을 가져오겠죠. ( 위의 스택 그림에서 제일 윗부분의 한칸만 )
즉, Big Endian 방식이라고 가정한다면 위 코드에서 *cp 가 가르키는 값은 ' 0 ' 이라는 것 입니다.
이와 같은 상황때문에 Little Endian 방식을 사용하는 것 입니다.
위의 스택 그림을 보시면 Little Endian 방식은 스택의 제일 윗 부분에 낮은 자리 수의 값이 들어가게 됩니다.
그러므로 스택의 Push & Pop 방식에서 ( 데이터를 차곡차곡 쌓아놓고, 제일 위에 것 부터 꺼내오는 방식 )
예제와 같은 상황이 발생하지 않게 됩니다.
즉, char형이 데이터를 가져올때 1byte 크기만을 가져오더라도 제일 낮은 자리 수의 값이 스택의 제일 위에 저장
되므로 예제와 같은 상황이 발생하지 않는겁니다. ( 저장된 데이터가 엄청 커진다면 짤리겠지만 )
이러하기 때문에
x86, Dec Alpha , 등등,, 에서는 Little Endian 방식을 사용합니다.
그럼 Big Endian 방식은 어디서 사용되느냐?
네트워크 패킷
( 패킷이 오는 족족 해석해야 하니까 Big Endian 방식이어야 겠죠? 패킷이 거꾸로 뒤집힌채로 전송되어 온다면 패킷분석할때 멘붕할듯,,, )
Java
( 디버깅할때 편합니다. )
등등,,,에서 사용됩니다.
오랜만에 강좌글 쓰네요 ㅎ
하지만 제 강좌글은 제가 나중에 까먹었을때 기억하기 쉽게 하기 위한 글이라 대충 설명한 부분도 있다는 것을
알아주세요 ㅠ-ㅠㅋ
읽어주셔서 감사합니다. |
Hit : 8975 Date : 2012/03/09 04:30
|