【发布时间】:2016-06-22 05:11:32
【问题描述】:
edi 是 argc,rsi 是 argv
0x0000000000400535 <+8>: mov %edi,-0x4(%rbp)
0x0000000000400538 <+11>: mov %rsi,-0x10(%rbp)
这里我得到了 argv 指针
(gdb) x/8x $rbp-0x10
0x7ffdb7cac380: 0xb7cac478 0x00007ffd 0x00000000 0x00000003
0x7ffdb7cac390: 0x00000000 0x00000000 0x1f130b45 0x00007ff3
指针 0x7ffdb7cac478
所以我的 argv[2] 在这里:
(gdb) x/8x 0x7ffdb7cac478+16
0x7ffdb7cac488: 0xb7cacd8a 0x00007ffd 0x00000000 0x00000000
在地址 0x7ffdb7cacd8a
我需要得到argv[2]的地址,所以我想写这个汇编代码:
伪代码:
x - 从地址 $rbp-0x10 加载 8 个字节 //(指向 argv 的指针)
y - 从 x 值+16 加载 8 个字节 //(指向 argv[2] 的指针)
我需要稍后跳转到 y。
如何在汇编器 x64 中编写代码? x 和 y 可以使用哪个寄存器?
我希望这是可以理解的。我是初学者。
我在这里问是因为我不知道从哪里开始研究。
更新:
试过这个:
bits 64
ldr r8, rbp, #0x10
ldr r9, r8, #0x10
jmp r9
但它甚至无法编译......我正在使用 nasm。
我猜上面是针对 ARM 架构的,对于下面的 amd64 (x64) 应该这样做。对吗?
更新 2:
bits 64
lea r8, [rbp-0x10]
lea r9, [r8+0x10]
jmp r9
更新 3:
也不行……
bits 64
lea r8, [rbp-0x10]
mov r9, [r8]
mov r10, [r9+0x10]
jmp r10
【问题讨论】:
-
没有什么比从您最喜欢的汇编程序参考中阅读有关寄存器和程序流程的信息更好的了。对于
x and y使用哪些寄存器,您可以使用任意两个通用寄存器。对于“我该怎么做”,答案是尝试,如果遇到困难,请发布您的进度。 -
这些是我的第一个汇编步骤,没有任何喜欢的参考。你能指点一下吗?一个很大的帮助是至少告诉哪个指令将 x 个字节加载到一个地址?是 ldr,ldi 吗?我应该搜索什么?
-
添加了我尝试过的代码...甚至无法编译:/
-
添加了另一个代码...这可以编译,但不确定它是否正确
标签: assembly