【问题标题】:I can't understand this error message in ARM我无法理解 ARM 中的此错误消息
【发布时间】:2015-04-25 10:54:14
【问题描述】:

我的汇编代码是

00000000 <_start>:
   0:   e28f6001    add r6, pc, #1
   4:   e12fff16    bx  r6
   8:   1b24        subs    r4, r4, r4
   a:   1c20        adds    r0, r4, #0
   c:   4a01        ldr r2, [pc, #4]    ; (14 <_start+0x14>)
   e:   4790        blx r2
  10:   4a01        ldr r2, [pc, #4]    ; (18 <_start+0x18>)
  12:   4790        blx r2
  14:   80047dbc    .word   0x8003f924  ; prepare_kernel_cred
  18:   80047a0c    .word   0x8003f56c  ; commit_creds

当我执行这个汇编代码时,会发生段错误并且错误消息是

1010201d : 4a
1010201e : 90
1010201f : 47
10102020 : 1
10102021 : 4a
10102022 : 90
10102023 : 47
10102024 : 24
10102025 : f9
10102026 : 3
10102027 : 80
10102028 : 6c
10102029 : f5
1010202a : 3
1010202b : 80
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = 82d44000
[00000000] *pgd=63b28831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#16] SMP ARM
Modules linked in: m(PO)
CPU: 0 PID: 660 Comm: test Tainted: P      D W  O 3.11.4 #13
task: 86834b40 ti: 8686c000 task.ti: 8686c000
PC is at 0x10102024
LR is at commit_creds+0x78/0x210
pc : [<10102024>]    lr : [<8003f5e4>]    psr: 20000033
sp : 8686dfa8  ip : 00000000  fp : 00000000
r10: 00000000  r9 : 8686c000  r8 : 8000e348
r7 : 00000000  r6 : 10102019  r5 : 0000001c  r4 : 00000000
r3 : 00000001  r2 : 00000000  r1 : 00000001  r0 : 00000000
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment user
Control: 10c53c7d  Table: 62d4406a  DAC: 00000015
Process test (pid: 660, stack limit = 0x8686c238)
Stack: (0x8686dfa8 to 0x8686e000)
dfa0:                   00000000 0000001c 00000001 00000000 0000001c ffffffff
dfc0: 00000000 0000001c 00000000 00000000 00000000 00000000 76fb0000 00000000
dfe0: 7ec0dd00 7ec0dcf0 00008643 76f3b8f0 20000010 00000001 00000000 00000000
[<8003f5e4>] (commit_creds+0x78/0x210) from [<0000001c>] (0x1c)
Code: 4a01 4790 4a01 4790 (f924) 8003
---[ end trace 1b1bf4ebadf07b63 ]---
Segmentation fault

我认为PC is 0x10102024 表示14: 8003f924 .word 0x80047dbc,因为0x1010204 处的机器码是\x24\xf9\x03\80。 但是我不明白Unable to handle kernel NULL pointer dereference at virtual address 00000000 的意思。 PC 是 0x10102024 但是发生内核 NULL 指针取消引用 为什么?

00000000 <_start>:
   0: e28f6001  add r6, pc, #1
   4: e12fff16  bx  r6
   8: 1b24        subs  r4, r4, r4
   a: 1c20        adds  r0, r4, #0
   c: 4a0a        ldr r2, [pc, #40] ; (38 <shellcode+0x22>)
   e: 4790        blx r2
  10: 4a0a        ldr r2, [pc, #40] ; (3c <shellcode+0x26>)
  12: 4790        blx r2
  14: e7ff        b.n 16 <shellcode>

00000016 <shellcode>:
  16: 0000        movs  r0, r0
  18: e28f6001  add r6, pc, #1
  1c: e12fff16  bx  r6
  20: 4678        mov r0, pc
  22: 300a        adds  r0, #10
  24: 9001        str r0, [sp, #4]
  26: a901        add r1, sp, #4
  28: 1a92        subs  r2, r2, r2
  2a: 270b        movs  r7, #11
  2c: df01        svc 1
  2e: 2f2f        .short  0x2f2f
  30: 2f6e6962  .word 0x2f6e6962
  34: 00006873  .word 0x00006873
  38: 80047dbc  .word 0x80047dbc
  3c: 80047a0c  .word 0x80047a0c

【问题讨论】:

  • 为什么在你最后一个blx之后没有任何返回指令? CPU 应该如何知道您的例程到此结束?
  • 由于最后一个blx之后没有返回指令,PC在0x101020204(_start+0x14)。不过不知道为什么Unable to handle kernel NULL pointer dereference at virtual address 00000000

标签: debugging assembly kernel arm shellcode


【解决方案1】:

在您设法超出正常程序流程并开始执行内存中的随机垃圾的情况下,了解处理器的想法总是有用的 - 如果最后一个 blx 返回,您最终会执行数据。那看起来像什么?好吧,“反汇编”任意原始二进制文件很有趣:

$ echo '24 f9 03 80' | xxd -r -p - hexfile
$ arm-linux-gnueabihf-objdump -bbinary -marm -D -Mforce-thumb hexfile

hexfile:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   f924 8003   vld4.8  {d8-d11}, [r4], r3

好吧,那怎么样。巧合的是,将该地址作为 Thumb 指令执行会导致使用当时恰好为空的基址寄存器进行加载,从而导致页面错误。

【讨论】:

  • 是的,我明白这一点。但是,我的问题是这条消息Unable to handle kernel NULL pointer dereference at virtual address 00000000 的含义。虽然我尝试在最后一个blx r2 之后使用b my_section 指令执行代码,但出现了段错误和Unable to handle kernel NULL pointer dereference at virtual address 00000000 消息。
  • 啊,更新后的代码就是为什么地址不是 0x22 - 内核正在执行仍然是来自r4 地址的加载。 r4 包含 0。
  • 根据我的问题更新的代码,使用 shellcode 部分的程序集应该可以工作。正确的?但是,发生了同样的错误。 Unable to handle kernel NULL pointer dereference at virtual address 00000000PC is at 0x10102028 。 0x10102028 在 shellcode 部分是add r6, pc, #1。为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多