본문 바로가기

교육/ASSEM

어셈블리어 기초3


1. CPU에 대한 이해
2. C에 대한 더 높은 이해 - advenced C
  • C에서 이해할 수 없었던 것을 정확히 알기위해서 (C로도 알 수 없었던 것을)
3. ARM Boot Code




Windbg사용 - 윈도우 디버그의 준말


  • output을 실행해서 EIP(명령어의 주소를 담고있는 레지스터)의 주소가 바뀌고 prompt1이 출력된다.


  • input이 실행되면서 키보드로 데이터를 입력받는다. 
  • 1234567890을 입력했는데 &number1의 Memory를 보면 숫자가아닌 아스키코드로 입력된걸 알 수 있음
  • 그래서 40개의 메모리중 1234567890을 제외한 30bit는 00으로 채워져있다.


  • atod 함수(문자형을 정수형으로 바꾸어주는 책저작자가 만든 함수)실행
  • EAX의 주소가 바뀜 -> 1234567890(10진수를) 499602D2(16진수)로 바뀐게 EAX에 입력된다. (atod 때문에)

  • mov함수 실행 (nember = eax로 해석)

  • output명령어 실행 prompt2를 출력한다.

  • input명령어 실행 키보드로 값을 입력받는다. (255를 입력해주었음)
  • string덮어씀 00(자동 Null값) 0a(엔터값) 67890 ....(40bit)

  • atod명령으로 255를 문자형(16진수)으로 바꿔서 EAX에 집어넣는다.

  • mov명령어 실행 (number2 = eax로 해석)

  • mov eax, direct형식의 기계어는 A1을 포함 direct의 주소가 5bit가 된다. 그렇기 때문에 EIP에 저장된 주소 4010AA로시작해서
  • 5bit까지가 number1의 주소 a1 00 40 40 00

  • mov명령어 실행 (eax = number1으로 해석)

  • add eax, direct 형식의 기계어는 03을 포함 direct의 주소가 6bit가 된다.(bytes가 2+되어있기 때문에 기계어 코드가 2개 이상이라는 뜻) 그렇기 때문에 EIP에 저장된 주소 4010AF로시작해서6bit까지가 number2의 주소 03 05 04 40 40 00


디버깅

ml /c /coff /Zi example.asm - 컴파일 방법
     디버그하기위한 정보를 추가하기위해 Zi를 붙인 컴파일을한다.
     -일반 컴파일과의 용량차이가 난다.
  • /c - 컴파일만 하라는 뜻
  • /coff - 윈도우에서 사용하는 obj파일을 만들라는 뜻 (단 coff형식으로 만듬)

link /debug /subsystem:console /entry:start /out:example.exe example.obj io.obj kernel32.lib - 링크방법
     디버깅에 대한 정보를 업데이트 하기위한 링크방법
     - 일반 링크와 용량차이가 난다.
  • /subsystem:console - console 에서 사용할 거라고 알려줌, 링크는 어디에서 사용할 것인지 알려 주어야한다.
  • /entry:start - start 함수를 기본적으로 가지고있다. (C의 main함수와 비슷한 개념)
  • /out:example.exe - 꼭 생성할 exe파일
  • lib - obj 모음파일


.dll 확장자 - dynamic Link Library(동적 링크 라이브러리)

  • dynamic  < - 반대개념 - >  static

dynamic은 계속 바뀌기 때문에 시대가 지나면서 사용을 못할 수도있는데 static은 계속 고정되어있다.


lst확장자 파일에서 기계어와 아스키코드를 같이 보여주고 있음




H - 16진수
 B - 2진수
 O, Q - 8진수
 none(아무것도 없을때) - 10진수