首页 文章

ARM反汇编 - 混淆“LDR r7,[pc,#0x14]”

提问于
浏览
0

我正在尝试学习ARM组装 . 我决定反汇编“读取”功能,这就是我得到的 . 从它的外观来看,似乎是使用R7寄存器作为系统调用号进行系统调用(svc#0) .

mov ip, r7            # save R7
ldr r7, [pc, #0x14]   # get system call number and put it into R7 ??
svc #0                # make system call
mov r7, ip            # restore R7
cmn r0, #0x1000
bxls lr
rsb r0, r0, #0        # R0 = 0
b #2976848216

我有点困惑,虽然它为什么加载系统调用号码(“LDR r7,[PC,#0x14]”) . 这不就是在C代码中执行r7 = *(pc 0x14)吗?我查看了其他可能也使用系统调用的函数(例如kill,wait等),并且它们使用了非常相似的约定(即LDR R7,[PC,#0x14]) .

这是在Android上,如果它有帮助的话 .

谢谢!

1 回答

  • 1
    mov ip, r7            @# save R7
    ldr r7, [pc, #0x14]   @# get system call number and put it into R7 ??
    svc #0                @# make system call
    mov r7, ip            @# restore R7
    cmn r0, #0x1000       @
    bxls lr               @
    rsb r0, r0, #0        @# R0 = 0
    .word 0x1234
    .word 0xABCD
    

    你几乎遗漏了最重要的部分,所以不得不即兴发挥

    00000000 <.text>:
       0:   e1a0c007    mov ip, r7
       4:   e59f7014    ldr r7, [pc, #20]   ; 20 <.text+0x20>
       8:   ef000000    svc 0x00000000
       c:   e1a0700c    mov r7, ip
      10:   e3700a01    cmn r0, #4096   ; 0x1000
      14:   912fff1e    bxls    lr
      18:   e2600000    rsb r0, r0, #0
      1c:   00001234    andeq   r1, r0, r4, lsr r2
      20:   0000abcd    andeq   sl, r0, sp, asr #23
    

    是的,它正在做你说它正在做的事情,它在进行系统调用之前在r7中加载一些值,现在它是什么值为什么它使用pc相对负载(可能是一个不适合作为一个直接的常量) ,和/或链接时间解析值而不是编译时间)并且不同的系统调用有不同的值,r7是否为参数?那么你没有提供足够的信息来讨论这个问题 . 一旦你有/看到那些信息,那么这些答案应该是非常明显的......如果这些是你的问题 .

相关问题