1619, 1/81 회원가입  로그인  
   우느님
   [자작] 왜 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 : 9043     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  
     [공지] 강좌를 올리실 때는 말머리를 달아주세요^ㅡ^ [29] 멍멍 02/27 22706
1618   realip_finder(asm ver)     해킹잘하고싶다
02/05 1572
1617   realip_finder     해킹잘하고싶다
02/05 1489
1616   리눅스 커널&운영체제 개론 (1)     해킹잘하고싶다
11/02 1909
1615   stack overflow 사이트 번역     해킹잘하고싶다
07/09 2151
1614   [L.O.B 원정대] - troll     해킹잘하고싶다
07/08 2697
1613   [L.O.B 원정대] - orge     해킹잘하고싶다
07/07 2640
1612   [L.O.B 원정대] - darkelf     해킹잘하고싶다
07/07 2590
1611   [L.O.B 원정대] - wolfman     해킹잘하고싶다
07/03 2530
1610   [L.O.B 원정대] - orc     해킹잘하고싶다
07/03 2152
1609   [L.O.B 원정대] - goblin     해킹잘하고싶다
07/02 2639
1608   [L.O.B 원정대] - cobolt     해킹잘하고싶다
07/02 2873
1607   [L.O.B 원정대] - gremlin     해킹잘하고싶다
07/02 2425
1606   [L.O.B 원정대] - gate     해킹잘하고싶다
07/02 2344
1605   ARP 스푸핑 - Part.1 -     해킹잘하고싶다
04/20 2814
1604   http 스니퍼 구현     해킹잘하고싶다
04/20 2342
1603   pcap으로 패킷 스니퍼 구현하기     해킹잘하고싶다
04/20 2217
1602   해커스쿨 만화의 자동으로 스캔하는 프로그램     해킹잘하고싶다
02/18 2547
1601   시스템 콜 추적 확장판[2]     해킹잘하고싶다
01/19 2780
1600   간단한 시스템 콜 추적 프로그램 만들기     해킹잘하고싶다
01/18 2797
1 [2][3][4][5][6][7][8][9][10]..[81]

Copyright 1999-2026 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org