1580, 5/79 회원가입  로그인  
   twinz
   - 어셈블리어 1

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=813 [복사]


1. 어셈블리어란 무엇인가?

어셈블러는 흔히들 저급 언어(low-level Language)라고 부른다. 기본적으로 어셈블러는 기계적 명령어과 1:1대응으로 이루어져 있다. 이때문에 어셈블리어는 다른 언어에 비해서 빠르다. 처음 컴퓨터가 개발되었을때 프로그래밍은 기계어로 해야만 했으며 그것은 절대로 쉬운일이 아니었다. 그래서 프로그래밍을 쉽게 하려는 이유로 어셈블리어가 만들어지게 된것이다.


2. 왜 어셈블리어를 사용해야 하는가?

이 글을 읽는 사람 대부분이 Reverse Engineering을 하려고 읽을것이다. 하지만 어셈블리어는 기계어와 1:1대응을 이루고 있기때문에 고급언어(High-level Language)보다 배우기가 어렵다. 하지만, 저급언어(low-level Language)인 어셈블리어를 알면 가질 수 있는 장점이 있다. 프로그램 크기도 작고, 빠르다는것과 엄청난 제어기능과 유연성을 제공한다. 참고로, 어셈블리어는 하드웨어에 종속적이므로 프로세서마다 문법과 명령어가 틀리다(우리는 80486이후 프로세서를 중심으로 본다).


3. 어떻게 이 튜토리얼을 만들게 되었는가?

나는 사실 학생에게 가르치기 위해서 만들게 되었다. 어셈블리어 튜토리얼 자체가 대부분 영어로 되어있고, 학생이 영어가 조금 부족하기에.. 어쨋든 한글로 된 매뉴얼이 있으면 조금이라도 다른 학생들이 이런 분야에 관심을 갖게되지 않을까 싶어서 쓰게 되었다.



4. Registers


4-1. Data Registers


Register란 CPU내부에 있는 기억장치로 CPU가 빠른 연산을 하기 위해 중간값을 저장하려고 고안된 장치이다. 보통 사용하는 것들은 이렇다:



   EAX(Extended AX) - 누산기(Accumlator). AX가 확장된 것이 EAX이고, AX는        다시 AH와 AL로 나뉘어진다. 주로 산술계산과 입출력 연산을 위해 사용된다.

   EBX(Extended BX) - the Base. BX가 확장된 것이 EBX이고, BX는 다시 BH와 BL로 나뉘어진다. 주로 주소지정시 베이스로 사용할 수 있는 레지스터이다.

   ECX(Extended CX) - the Counter. CX가 확장된 것이 ECX고, CX는 다시 CH와 CL로 나뉘어진다. 주로 스트링(String)이나 루프(Loop)에서 반복되는 숫자를 카운트하기위해 사용된다.

   EDX(Extended DX) - Data Register이다. DX가 확장된 것이 EDX고, DX는 다시 DH와 DL로 나뉘어진다.

이 Register들은 특별한 목적을 위해 고안된것이다. 그리고 이 레지스터들은 32bit로 이루어져있다. 32비트로 이루어져있다는 것은 2의 32승비트를 저장할 수 있다는 뜻인데 이말은 부호없는 정수로 0부터 4294967296까지 저장할 수 있다는 말이다. 또한 부호있는 정수 -65536 부터 65536까지 저장할 수 있다. 16진수로 보면, 레지스터들의 값의 범위는 EAX는 0h-FFFFFFFFh까지이며, AX는 0h-FFFFh, AH와 AL은 0h-FFh이다(참고로 h는 Hex를 의미하며 16진수를 말한다).
부가적으로 EAX AX AH AL을 설명하자면 아래 그림과 같다(EBX,ECX 등등 도 마찬가지이다).



EAX(32bit)
|-----------------------------------------------------------------|
                                                  AX(16bit)
                                                |---------------------------------|
                                                 AH(8bit)           AL(8bit)
                                                |----------------|----------------|

  위 그림을 설명하지면, EAX는 32bit Register이다. 그중 하위 16bit는 AX라 불리우며 AX중 상위 8bit는 AH, 하위 8bit는 AL이 되는것이다. 예를 들어서, EAX=1234ABCDh라는 값을 가지고 있다면, AX=ABCDh, AH=ABh, AL=CDh이다. 이 방식은 다음에 나올 Segment Register에도 적용이 된다.

4-2. Segment Registers

이 레지스터들을 정확하게 설명하려면 이런 간단한 것으로는 해결되지 않을 것이다. 자세한 내용은 따로 다루기로 하고, 일단은 겉핥기식으로 간단한 내용만 살펴보자.

    ECS(Extended Code Segment) - 프로그램의 실제 코드를 기록하고있는 메모리의 시작 주소를 가르킨다. ECS를 기준으로 변위(Offset)값은 EIP(Extended Instruction Pointer)를 사용한다(이것에 대한 설명은 뒤로 미루겠다).

    EDS(Extended Data Segment) - 프로그램의 데이터를 저장하고있는 장소의 시작번지를 가르킨다.

    EES(Extended Extra Segment) - 여분의 세그먼트이다. 주로 문자열을 다루거나 비디오 등을 처리할때 주로 사용된다.

    ESS(Extended Stack Segment) - 함수가 호출될경우 원래 호출된 곳으로 돌아가기 위한 반환점을 지정하고있다. 주의깊게 살펴봐두자.


4-3. Pointer and Index Registers

Pointer Register는 SP(Stack Pointer)와 BP(Base Pointer)로 구성되는데, 스택을 운용하기 위해서 사용된다. 그리고 Index Register는 SI(Source Index)와 DI(Destination Index)로 구성되는데, 주로 큰 데이터나 문자열등을 처리할때 쓰인다.

   ESP(Extended SP) - Stack의 가장 윗부분을 가르킨다.

   EBP(Extended BP) - Stack의 가장 아랫부분, 즉 Base를 가르킨다.

   ESI(Extended SI) - 메모리 등을 이동하려 할때 원본 주소를 가르킨다.

   EDI(Extended DI) - ESI와 마찬가지로 목적지 주소를 가르킨다.

  EIP(Extended Instruction Pointer) - 다음 실행할 명령의 주소를 기억하고 있다.


4-4. Flag Register

프로그램의 상태를 나타내기위해 사용되는 비트들로는 총 5개가 있다.

O(Overflow) 부호있는 산술연산시에 최대 크기를 넘었을 경우 Set된다.
S(Sign) 값이 음수이면 Set이다.
Z(Zero) 연산 결과가 0일경우 Set이다.
C(Carry) 부호없는 산술연산시에 하위비트에서 상위비트로 자리올림이 발생했을경우 Set된다.
A(Auxiliary Carry) 부호없는 산술연산시에 상위비트에서 하위비트로 자리내림이 발생했을경우 Set된다.
P(Parity) 연산결과에서 1이 짝수개면 Set, 데이터 전송시 주로 사용된다.

이 외에도 많은 Flag Register들이 있지만 ReverseEngineering에서 다루는것은 매우 한정적이므로 이만큼만 다루도록 하겠다..


** 이 글의 저작권은 모두 저자에게 있습니다.
   수정, 배포시 저작권을 표시해주시기 바랍니다.
** 오타, 잘못된 내용이 있으면 적극적으로 알려주시기 바랍니다 :)
** 질문사항 또한 적극적으로 받겠습니다.

Copyright (c) NEWMS 2007 All right Reserved.

Posted by newms
Studying Area/Reverse Engineering l

  Hit : 8518     Date : 2007/08/27 08:45



    
오리 우와..ㄷㄷ 어셈대충쓸줄은아는데 이렇게복잡할줄은,./.ㅋ 2007/08/31
1500   - [리눅스팁] 리눅스 자동실행     twinz
08/28 7585
1499   - [보안팁] 프로그래밍 코드보호 (1)     twinz
08/28 9895
1498   - [보안팁] 프로그래밍 코드보호 (2)     twinz
08/28 7477
1497   - [보안팁] 리눅스     twinz
08/28 7272
1496   - [보안노트] 쿠키[4]     twinz
08/28 8590
1495   - [보안노트] 포트스캐닝 (1)     twinz
08/28 7571
1494   - [보안노트] 포트스캐닝 (2)     twinz
08/28 8991
1493   - [보안노트] 봇[1]     twinz
08/28 7210
1492   - 컴퓨터 바이러스의 종류[1]     twinz
08/27 8210
1491   - 다이하드 4.0 파이어세일 현실 가능[2]     twinz
08/25 8202
1490   - 도청 , 해킹 불가능한 세상이온다     twinz
08/25 7543
1489   - 백업명령어의 종류     twinz
08/27 8633
1488   - 무시되는 오프 스탠더드보안     twinz
08/27 6619
1487   - 서버관리자를 위한 50가지 비법     twinz
08/27 8756
1486   - 시스템 보안     twinz
08/27 6633
  - 어셈블리어 1[1]     twinz
08/27 8517
1484   - 어셈블리어 2     twinz
08/27 8360
1483   - 어셈블리어 3[1]     twinz
08/27 6616
1482   0번섹터 베드섹터일경우..[2]     ROK.AF
03/02 7541
1481   1[1]     백민준천재
08/31 4341
[1][2][3][4] 5 [6][7][8][9][10]..[79]

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