부트로더 코드 관련

yjc99의 이미지

어셈블리어를 처음으로 공부하고 있는 초보입니다.
아래 부트로더를 분석하는데 이해안되는 몇가지 부분들이 있어서 질문드립니다.
(완전 초보라 질문이 좀 당황스러우실수도 있을지 모르겠습니다.ㅡ.ㅡ;)

1. 아래 ds segment register 를 초기화 한후 move si msg 하는 부분의 역활이 data 영역이 시작되는 주소를 정해주는 역활을 하게되는건가요? (cs:ip는 bios에서 아래부트로더 로딩할때 07c0h:0000h 로 자동적으로 주는것으로 알고요)

2. ds segment register 초기화 부분은 start: label 위에 있는데, 특별한 이유가 있는건가요? 코드시작은 start:가(start는 그냥 label일일뿐) 아니라 처음나오는 코드에서 시작할텐데, 굳이 왜 start: 를 해주고, 그위에 또 코드가 있는것인지 모르겠습니다.

3. 아래 times 512-($-$$)-2 db 0 부분은, 아마 512byte 끝부분에다가 magic number 적어주기위해서 하는것 같은데, 이코드가 정확히 어떻게 이를 계산하게 되는것인가요?(code+data 영역에서 2(magic number) 를 뺀 영역을 0으로 만드는것 같은데, 어떻게 이 계산을 하게 되는건지 해서요.)

; 메인 프로그램
; ---------------------------------------------------------
mov ax, 07c0h
mov ds, ax ; ds segment register 를 초기화.
start:
mov si, msg ; Message를 출력
callputstr

hang: ; 멈추기
jmp hang

; ---------------------------------------------------------
; 부트코드가 사용할 함수 및 변수들
; ----------------------------------------------------------
msg db 'jhbaik boot loader!', 0 ; 화면에 출력할 0으로 끝나는 문자열

putstr:
lodsb ; AL = [DS:SI]
or al,al ; al이 0이면 zero flag을 set
jz putstrd ; zero flag가 0이면 putstrd로
mov bx,0x0007 ; Color
mov ah,0x0E ; Video function 0Eh
int 0x10
jmp putstr ; Load characters until AL=0
putstrd:
retn

times 512-($-$$)-2 db 0
dw 0AA55h
------------------------------------

아시는 분들의 답변 부탁드리겠습니다~

Necromancer의 이미지

1) mov si,msg 앞의 2줄을 보시면 아시겠지만 DS에 0x7c0이 들어갑니다.
그리고 메모리 접근시 세그먼트를 직접지정(세그먼트 오버라이드)하지 않은 경우 DS를
세그먼트 레지스터로 사용합니다. DS와 CS가 같은 값을 갖게 되니

2) 부트로더와 같이 OS의 관할이나 도움 없이 작동하는 프로그램들은 코드의 선두지점을 시작점으로 가정합니다.
실제 메모리로 로드될때는 0x7C00의 주소로 로드되고 bios에서 jmp 명령으로
직접 0x07c0:0x0000 넘어갑니다.

그리고 start 라벨은 다른 jmp 명령 등에서 사용하지 않는 이상은 아무 의미 없습니다.
어셈블러 에러 막을려고 일부러 넣었을 수도 있고, 어디 다른 곳에서 사용할 일이 있어서
넣얼 수도 있습니다.

3) 512바이트 맞출려고 한 것입니다.

$-$$가 현위치를 오프셋으로 나타낸 것인데,
NASM에서는 $는 위치하는 곳의 메모리주소, $$는 위치하는 곳의 세그먼트 주소가 됩니다.
예를 들어 seg:off=0x1000:0x1000의 지점에서 $와 $$의 값은 $의 경우 0x1000:0x1000,
$$는 0x1000:0 의 주소입니다. M$ MASM은 $ 하나만 써도 충분합니다.
고로 $-$$는 현재 위치하는 곳의 오프셋(세그먼트 제외)이 되는거고요.

512에서 현 위치만큼 뺀 값만큼 db로 변수를 추가했다면 그 크기는 512바이트가 됩니다.
그리고 위 코드에서 2를 더 뺀건 뒤에 0xAA55라는 값 때문이죠. 이 값은 부트로더 코드가
있다는 것을 알리는 신호입니다.

부트로더 같은 것을 만들 때는 보통 선두 부분을 offset 0으로 하는 바이너리로 만들죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

yjc99의 이미지

자세한 설명 감사합니다.^ 많은 도움이 되었습니다.
그런데 한가지 더 궁금한게 있는데요.
보통 code 영역과 data 영역이 구분되는것으로 알고 있었는데요.. 아래와 같이요.
------
code
------
data
------
bss
-----
그런데 위의 부트로더 코드를 보면 처음에 code가 있다가 중간에 db 지시어로 data 부분이 들어가 있고, 그 이후에 다시 code 부분이 있는식으로 혼합되어 들어가 있는데, 이런식으로 들어가도 상관없는것인가요? 그렇다면 code와 data 영역이 나누어져서 메모리에 세팅되는것이 실질적으로 큰 의미는 없는것 아닌가 생각이 들어서요.

Necromancer의 이미지

부트로더류의 바이너리 코드는 코드와 데이터간의 명시적인 구분은 없습니다.
다만 각각의 변수와 명령어들이 실제 메모리에 올라왔을 때 어느 주소에 위치하느냐가 더 중요합니다.
(특히 파티션 테이블들... 끝의 dw 0xaa55 바로 앞 64바이트 영역을 차지하죠.)

EXE같은 실행파일들은 OS에 의해 로드되면서 각 세그먼트를 배치하는 재배치 과정을
거치는데, 그때 위에서 말한 code, data, bss 등등의 정보가 필요하기 때문에
써 주지만 부트로더는 재배치가 없습니다. 그냥 특정 메모리 주소에 올린 뒤에
jmp로 실행권을 넘깁니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

yjc99의 이미지

^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.