【问题标题】:ARM Assembly - what does it mean to add something to the SP(stack pointer)?ARM 汇编 - 向 SP(堆栈指针)添加内容是什么意思?
【发布时间】:2014-09-15 21:20:32
【问题描述】:

基本上,我正在尝试反击 dlyb hack,它为我的游戏中的黑客提供了一些优势。其中有一个在开始时执行此操作的 injectHack 函数:

//This is the function: injectHack(char*, int, char*, int)
push {r4, r5, r6, r7, lr} //Pushes args in reverse order + the link register
add r7, sp, #0xc //What is it doing here? Adding r7(the first char*) to the stack pointer? And what is #0xc?

还有一些行存储一些固定地址,如下所示:

ldr r0, [r0]
str r0, [r7, #0xffffffbc]
ldr r0, [r0]

我不明白,它无缘无故地从r0 加载到r0 两次?这个地址会不会是他们要挂钩的函数?

【问题讨论】:

  • add r7, sp, #0xc 将堆栈指针的当前值和立即数 0xc(十进制的 12)相加,并将结果存储在 r7
  • 另外,r4-r7 不包含函数参数; r0-r3 做。推送r4-r7 的原因是函数必须保留这些寄存器的值。
  • 所以堆栈的顶部值增加了 12?最后推送的东西不是链接寄存器吗?那么函数又回到了不同的点?
  • 不,add r7, sp, #0xc 不会更改堆栈上的任何内容,也不会更改堆栈指针本身。它获取堆栈指针的值(即当前堆栈顶部的地址),将值 12 添加到它并将结果放入不同的寄存器(r7)。
  • 第二部分类似于struct node { struct node *next; ...},带有'C'代码struct node *n = root; local = n; n = n->next;。即,ldr r0, [r0] 正在遍历一些指针列表/结构。

标签: assembly arm reverse-engineering cracking


【解决方案1】:

arm 架构参考手册很好地解释了伪代码。

是的,实际上寄存器以相反的数字顺序被推送,最大数字的寄存器(r14)首先被推送,然后是 r7,依此类推。

arm 调用约定使用 r0-r3 作为参数,除了一个例外,你不能在不保留它们的情况下弄乱其他寄存器,所以在这种情况下,r4-r7 和 lr 一样被保留,这个函数可能会调用另一个函数.请注意,奇数个寄存器被压入,所以这是一个较旧的调用约定,当前的总是保持堆栈指针 64 位对齐。

add r7 并没有修改 sp,它只是在堆栈中创建一个指针。第四个字 0x00 (r4) 0x04 (r5) 0x08 (r6) 0x0C (r7)

所以他们正在创建一个指向 r7 中的任何值的指针,这很奇怪,但可能是你正在寻找的任何值。

注意从地址r0加载r0,修改r0,pointer = *pointer;然后该地址将保留在 r7 - 0x44 中的地址处,无论它指向什么。他们使用 r0 中的指针进行另一个间接级别,指针 = *指针。

这就是您向我们提供的全部内容,但如果您想从 infocenter.arm.com 获得 arm 架构参考手册,您只需查找说明并阅读伪代码即可。完全理解每一条指令。

ARM 体系结构过程调用标准 (AAPCS) 在适当命名的 "Procedure Call Standard for the ARM Architecture" 文档中进行了描述。还有另一个文档描述了 64 位 ARM 架构 (AAPCS64) 的过程调用标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多