サーバエンジニアになりたい無職の生活

元メジャー通信技術のマイナーエンジニアで今はサーバエンジニアになろうかなと思ってる無職ですが

LinuxのMBRをダンプしたり覗いてみる

「30日でできる! OS自作入門」という本を読んで
MBRブートローダの仕組みが割りと分かったので、LinuxMBRを覗いてみる
覗いてみるだけですが。


環境
CentOS 6.7 64bit
grub 0.97


手順
1. 16進で覗いてみる
2. MBRをダンプする
3. 逆アセンブルしてみる
4. 参考にしたサイト


1. 16進で覗いてみる

hexdumpコマンドで覗いてみる。
0x178からの"GRUB .Geom.Hard Disk.Read. Error"は文字列なんだろうなと思った位。


[root@localhost ~]# hexdump -C -n 512 /dev/sda
00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 03 02 |.........|...t..|
00000040 80 00 00 80 fe 49 08 00 00 08 fa 90 90 f6 c2 80 |.....I..........|
00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......|
00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 f6 c2 80 |. ..@|<.t...R...|
00000070 74 54 b4 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U|
00000080 aa 75 43 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f|
00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.|
000000a0 04 10 00 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 |....D...f.\..D..|
000000b0 70 66 31 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 |pf1..D.f.D..B..r|
000000c0 05 bb 00 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f |...p.}....s.....|
000000d0 84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.|
000000e0 88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |..@f.D.1........|
000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |..@.D.1......f..|
00000100 66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |f.D|f1.f.4.T.f1.|
00000110 66 f7 74 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a |f.t..T..D.;D.}<.|
00000120 54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......l.Z|
00000130 8a 74 0b bb 00 70 8e c3 31 db b8 01 02 cd 13 72 |.t...p..1......r|
00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|`......1.|
00000150 31 ff fc f3 a5 1f 61 ff 26 42 7c be 7f 7d e8 40 |1.....a.&B|..}.@|
00000160 00 eb 0e be 84 7d e8 38 00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0|
00000170 00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G|
00000180 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re|
00000190 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd |ad. Error.......|
000001a0 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 00 00 00 |..<.u...........|
000001b0 00 00 00 00 00 00 00 00 5a 50 0c 00 00 00 80 20 |........ZP..... |
000001c0 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 00 dd |!....?..........|
000001d0 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 70 02 00 00 |.?.........Xp...|
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200


2. MBRをダンプする


[root@localhost ~]# dd if=/dev/sda of=~/mbr.img bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000741461 s, 691 kB/s
[root@localhost ~]# ls -l mbr.img
-rw-r--r--. 1 root root 512 12月 27 15:36 2015 mbr.img


3. 逆アセンブルしてみる

objdumpコマンドを使う

-b binary: 付帯情報がついてないため、フォーマットを指定するらしい
-m i8086: アーキテクチャを指定する
          16bitだと思うのでi8086を指定したけど合ってるのかな(?)
-D: 全て のセクションを逆アセンブルする


[root@localhost ~]# objdump -b binary -m i8086 -D mbr.img

mbr.img: file format binary


Disassembly of section .data:

00000000 <.data>:
0: eb 48 jmp 0x4a
2: 90 nop
3: 10 8e d0 bc adc %cl,-0x4330(%bp)
7: 00 b0 b8 00 add %dh,0xb8(%bx,%si)
b: 00 8e d8 8e add %cl,-0x7128(%bp)
f: c0 fb be sar $0xbe,%bl
12: 00 7c bf add %bh,-0x41(%si)
15: 00 06 b9 00 add %al,0xb9
19: 02 f3 add %bl,%dh
1b: a4 movsb %ds:(%si),%es:(%di)
1c: ea 21 06 00 00 ljmp $0x0,$0x621
21: be be 07 mov $0x7be,%si
24: 38 04 cmp %al,(%si)
26: 75 0b jne 0x33
28: 83 c6 10 add $0x10,%si
2b: 81 fe fe 07 cmp $0x7fe,%si
2f: 75 f3 jne 0x24
31: eb 16 jmp 0x49
33: b4 02 mov $0x2,%ah
35: b0 01 mov $0x1,%al
37: bb 00 7c mov $0x7c00,%bx
3a: b2 80 mov $0x80,%dl
3c: 8a 74 03 mov 0x3(%si),%dh
3f: 02 80 00 00 add 0x0(%bx,%si),%al
43: 80 fe 49 cmp $0x49,%dh
46: 08 00 or %al,(%bx,%si)
48: 00 08 add %cl,(%bx,%si)
4a: fa cli
4b: 90 nop
4c: 90 nop
4d: f6 c2 80 test $0x80,%dl
50: 75 02 jne 0x54
52: b2 80 mov $0x80,%dl
54: ea 59 7c 00 00 ljmp $0x0,$0x7c59
59: 31 c0 xor %ax,%ax
5b: 8e d8 mov %ax,%ds
5d: 8e d0 mov %ax,%ss
5f: bc 00 20 mov $0x2000,%sp
62: fb sti
63: a0 40 7c mov 0x7c40,%al
66: 3c ff cmp $0xff,%al
68: 74 02 je 0x6c
6a: 88 c2 mov %al,%dl
6c: 52 push %dx
6d: f6 c2 80 test $0x80,%dl
70: 74 54 je 0xc6
72: b4 41 mov $0x41,%ah
74: bb aa 55 mov $0x55aa,%bx
77: cd 13 int $0x13
79: 5a pop %dx
7a: 52 push %dx
7b: 72 49 jb 0xc6
7d: 81 fb 55 aa cmp $0xaa55,%bx
81: 75 43 jne 0xc6
83: a0 41 7c mov 0x7c41,%al
86: 84 c0 test %al,%al
88: 75 05 jne 0x8f
8a: 83 e1 01 and $0x1,%cx
8d: 74 37 je 0xc6
8f: 66 8b 4c 10 mov 0x10(%si),%ecx
93: be 05 7c mov $0x7c05,%si
96: c6 44 ff 01 movb $0x1,-0x1(%si)
9a: 66 8b 1e 44 7c mov 0x7c44,%ebx
9f: c7 04 10 00 movw $0x10,(%si)
a3: c7 44 02 01 00 movw $0x1,0x2(%si)
a8: 66 89 5c 08 mov %ebx,0x8(%si)
ac: c7 44 06 00 70 movw $0x7000,0x6(%si)
b1: 66 31 c0 xor %eax,%eax
b4: 89 44 04 mov %ax,0x4(%si)
b7: 66 89 44 0c mov %eax,0xc(%si)
bb: b4 42 mov $0x42,%ah
bd: cd 13 int $0x13
bf: 72 05 jb 0xc6
c1: bb 00 70 mov $0x7000,%bx
c4: eb 7d jmp 0x143
c6: b4 08 mov $0x8,%ah
c8: cd 13 int $0x13
ca: 73 0a jae 0xd6
cc: f6 c2 80 test $0x80,%dl
cf: 0f 84 f0 00 je 0x1c3
d3: e9 8d 00 jmp 0x163
d6: be 05 7c mov $0x7c05,%si
d9: c6 44 ff 00 movb $0x0,-0x1(%si)
dd: 66 31 c0 xor %eax,%eax
e0: 88 f0 mov %dh,%al
e2: 40 inc %ax
e3: 66 89 44 04 mov %eax,0x4(%si)
e7: 31 d2 xor %dx,%dx
e9: 88 ca mov %cl,%dl
eb: c1 e2 02 shl $0x2,%dx
ee: 88 e8 mov %ch,%al
f0: 88 f4 mov %dh,%ah
f2: 40 inc %ax
f3: 89 44 08 mov %ax,0x8(%si)
f6: 31 c0 xor %ax,%ax
f8: 88 d0 mov %dl,%al
fa: c0 e8 02 shr $0x2,%al
fd: 66 89 04 mov %eax,(%si)
100: 66 a1 44 7c mov 0x7c44,%eax
104: 66 31 d2 xor %edx,%edx
107: 66 f7 34 divl (%si)
10a: 88 54 0a mov %dl,0xa(%si)
10d: 66 31 d2 xor %edx,%edx
110: 66 f7 74 04 divl 0x4(%si)
114: 88 54 0b mov %dl,0xb(%si)
117: 89 44 0c mov %ax,0xc(%si)
11a: 3b 44 08 cmp 0x8(%si),%ax
11d: 7d 3c jge 0x15b
11f: 8a 54 0d mov 0xd(%si),%dl
122: c0 e2 06 shl $0x6,%dl
125: 8a 4c 0a mov 0xa(%si),%cl
128: fe c1 inc %cl
12a: 08 d1 or %dl,%cl
12c: 8a 6c 0c mov 0xc(%si),%ch
12f: 5a pop %dx
130: 8a 74 0b mov 0xb(%si),%dh
133: bb 00 70 mov $0x7000,%bx
136: 8e c3 mov %bx,%es
138: 31 db xor %bx,%bx
13a: b8 01 02 mov $0x201,%ax
13d: cd 13 int $0x13
13f: 72 2a jb 0x16b
141: 8c c3 mov %es,%bx
143: 8e 06 48 7c mov 0x7c48,%es
147: 60 pusha
148: 1e push %ds
149: b9 00 01 mov $0x100,%cx
14c: 8e db mov %bx,%ds
14e: 31 f6 xor %si,%si
150: 31 ff xor %di,%di
152: fc cld
153: f3 a5 rep movsw %ds:(%si),%es:(%di)
155: 1f pop %ds
156: 61 popa
157: ff 26 42 7c jmp *0x7c42
15b: be 7f 7d mov $0x7d7f,%si
15e: e8 40 00 call 0x1a1
161: eb 0e jmp 0x171
163: be 84 7d mov $0x7d84,%si
166: e8 38 00 call 0x1a1
169: eb 06 jmp 0x171
16b: be 8e 7d mov $0x7d8e,%si
16e: e8 30 00 call 0x1a1
171: be 93 7d mov $0x7d93,%si
174: e8 2a 00 call 0x1a1
177: eb fe jmp 0x177
179: 47 inc %di
17a: 52 push %dx
17b: 55 push %bp
17c: 42 inc %dx
17d: 20 00 and %al,(%bx,%si)
17f: 47 inc %di
180: 65 6f outsw %gs:(%si),(%dx)
182: 6d insw (%dx),%es:(%di)
183: 00 48 61 add %cl,0x61(%bx,%si)
186: 72 64 jb 0x1ec
188: 20 44 69 and %al,0x69(%si)
18b: 73 6b jae 0x1f8
18d: 00 52 65 add %dl,0x65(%bp,%si)
190: 61 popa
191: 64 00 20 add %ah,%fs:(%bx,%si)
194: 45 inc %bp
195: 72 72 jb 0x209
197: 6f outsw %ds:(%si),(%dx)
198: 72 00 jb 0x19a
19a: bb 01 00 mov $0x1,%bx
19d: b4 0e mov $0xe,%ah
19f: cd 10 int $0x10
1a1: ac lods %ds:(%si),%al
1a2: 3c 00 cmp $0x0,%al
1a4: 75 f4 jne 0x19a
1a6: c3 ret
...
1b7: 00 5a 50 add %bl,0x50(%bp,%si)
1ba: 0c 00 or $0x0,%al
1bc: 00 00 add %al,(%bx,%si)
1be: 80 20 21 andb $0x21,(%bx,%si)
1c1: 00 83 dd 1e add %al,0x1edd(%bp,%di)
1c5: 3f aas
1c6: 00 08 add %cl,(%bx,%si)
1c8: 00 00 add %al,(%bx,%si)
1ca: 00 a0 0f 00 add %ah,0xf(%bx,%si)
1ce: 00 dd add %bl,%ch
1d0: 1f pop %ds
1d1: 3f aas
1d2: 8e fe mov %si,%?
1d4: ff (bad)
1d5: ff 00 incw (%bx,%si)
1d7: a8 0f test $0xf,%al
1d9: 00 00 add %al,(%bx,%si)
1db: 58 pop %ax
1dc: 70 02 jo 0x1e0
...
1fe: 55 push %bp
1ff: aa stos %al,%es:(%di)


4. 参考にしたサイト

Linux徹底詳解再訪 続報・その1 http://memo.wnishida.com/?date=20040429
LinuxにおけるMBRのまとめとバックアップ方法 http://d.hatena.ne.jp/adsaria/20080812
OSを作るときによく使うBIOSファンクション (AT互換機) http://oswiki.osask.jp/?(AT)BIOS
Complete 8086 instruction set