1579, 1/79 회원가입  로그인  
   우느님
   [자작] 왜 Little Endian 인가 ?

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&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 : 5482     Date : 2012/03/09 04:30
[불법/스팸글로 신고하기]



    
supershop 잘 읽었습니다 :)
궁금했었는데 덕분에 궁금증 풀고 갑니다 ^^
2012/03/09  
cd80 좋은 강의네요 감사합니다 2012/03/10  
junhyung7 학원에서도 들을수 없었던 강의 내용 감사드려요!!!! 2012/03/10  
멍멍 좋은 정보 감사합니다, 이 내용을 참고해서 해쿨 BOF 강좌에 추가해도 될까요? 2012/03/13  
우느님 읽어주셔서 감사합니다 !

멍멍// 넵ㅎ 그러셔도 됩니다.
2012/03/13  
kokai 컴구조시간에 엔디안 배우면서 실제예는 몰랐는데 참고하고 가요 ^^ 2012/03/14  
1579     [re] 추가 설명[9]     暴走天使
09/11 8688
1578   부산에서 같이 공부 할 분 있어요?ㅋㅋ[4]     연산동고래
01/16 6560
1577   [자작] C언어 War Game Release 04.01 < Solution > 10진수      우느님
04/12 5731
1576   [자작] C언어 War Game Release 04.01 < 상금 : 50000원 >[11]     우느님
04/01 5621
1575   [자작] C언어 War Game Release 04.01 < Solution > 16진수     우느님
04/11 5378
1574   [자작]c언어 <포인터> 캐쉽게 설명해드려요~ 3 (수정)[8]     우느님
01/07 5235
1573   [자작]c언어 <포인터> 캐쉽게 설명해드려요~ 2[5]     우느님
01/07 5222
1572   [자작]적절한 네트워크 정리[1]     우느님
01/03 5573
1571   [자작]c언어 <포인터> 캐쉽게 설명해드려요~[6]     우느님
01/07 5302
  [자작] 왜 Little Endian 인가 ?[6]     우느님
03/09 5481
1569   하드웨어와 소프트웨어...그리고 불가능한일?[16]     아이프리드
01/11 7942
1568   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 3[16]     아이프리드
02/03 11086
1567   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 2     아이프리드
02/03 8087
1566   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 1[11]     아이프리드
02/03 9881
1565   #01 Protel CAD - 서문     아이프리드
11/21 8887
1564   [자작] C언어 변수 이해하기[9]     싫어 내가할꺼야
02/13 7203
1563   C언어로 만든 그래픽 프로그램[11]     승리의박성환
04/22 16558
1562   리눅스 설치 + Windows설치(생초보에게 좋은 강좌)!![3]     승리의박성환
04/15 12720
1561   밑에 제가 올린 API 소스에 대해서.........     승리의박성환
10/02 6988
1560   NET SEND 명령강좌[8]     서덕진
09/23 5379
1 [2][3][4][5][6][7][8][9][10]..[79]

Copyright 1999-2021 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com