第一关:分析1号进程。本关较为简单,跟着左边的教程走一遍即可通过
先设置版本1内核为分析对象,打开gdb调试,在155行设置断点并跳转(因为1号进程在155行调用了函数output_char)
(gdb)b 155
(gdb)c
第一问 函数output_char对应的第一条汇编指令的地址是多少?
反汇编即可查看
(gdb)x/6i $eip
第二问 mynext变量所在的段地址和段内偏移是多少?该段地址对应几号描述符?存放在哪个断描述符表中(GDT/LDT)?
&mynext即为其段内偏移,段地址存储在ds寄存器中
段地址是16位,高13位化为十进制即为对应的描述符序号,倒数第3位为0表示存放在GDT中,为1表示存放在LDT中
(gdb)p &mynext
(gdb)p/x $ds
0x17高13为化为十进制为2,倒数第3位为1,因此对应2号描述符,存放在LDT中
第三问 ldt数组的起始地址是多少?其中1号和2号描述符里存放的段起始地址分别是多少?
查找ldt的起始地址有两种方法:
法一:直接p ¤t->ldt即可查看
(gdb)p ¤t->ldt
法二 :查找gdt的第7项断描述符,计算出ldt起始地址(注意低32位在前,高32位在后)
(gdb)x/16wx gdt
查看ldt的内容即可计算1号和2号描述符存放的段起始地址
(gdb)p/x current->ldt
对于2号描述符存放的段起始地址,可以直接查看当前进程控制块的start_code成员(前述可知对应2号描述符)
(gdb)p/x current->start_code
第四问 mynext变量所在的的线性地址是多少?
用段起始地址0x4000000和段内偏移0x2282c相加即得:0x402282c
第二关分析0号进程,过完全类似,唯一不同的在于断点应设置在172行,在此就不再赘述了