2016-03-08 90 views
0

EDI是ARGC,RSI则argv的获取汇编64的argv [2]地址

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 

在地址0x7f fdb7cacd8a

我需要得到的argv地址[2],所以我想写这汇编代码:

伪代码:

X - 负荷地址$ 8个字节RBP-0x10的//(指针的argv)

ý - 负载从x值的8个字节+ 16 //(指针的argv [2])

我需要稍后JMP为y。

如何在汇编器x64中编写?我可以用于x和y的哪个寄存器?

我希望这是可以理解的。我是一名初学者。

我问这里,因为我不知道从哪里开始做我的研究。

UPDATE:

试过这样:

bits 64 
ldr r8, rbp, #0x10 
ldr r9, r8, #0x10 
jmp r9 

但它甚至不编译....我使用NASM。

我想上面是ARM arch,对于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 
+0

没有什么比阅读关于您最喜爱的汇编程序的参考寄存器和程序流程。对于用于'x和y'的寄存器,您可以使用任意两个通用寄存器。对于“我如何做到这一点”,答案是尝试,然后发布你的进展,如果你卡住了。 –

+0

这些是我的第一个汇编程序步骤,没有任何最喜欢的参考。你可以指向任何?一个很大的帮助是至少告诉哪个指令将x字节加载到一个地址?是ldr,ldi吗?我应该搜索什么? –

+0

添加我的代码我试过...甚至没有编译:/ –

回答

1

你写main()_start

如果您正在编写main,这是一个正常的函数,它的参数在rdi,rsi之后,遵循常规调用约定。请参阅标记wiki以获取指向x86-64 ABI的链接。

如果您正在编写_start,则数据位于堆栈上,如ABI的进程启动部分所述。

rbp是没有意义的,除非你初始化它。它具有来电者留下的任何内容。


你的代码片段也很愚蠢:你永远不会初始化rbp。你应该假设它在进程输入时保存垃圾。只有rsp保证有用。

lea只是一个转变&添加使用有效地址语法/编码的指令。 mov是加载/存储的助记符。

bits 64 
    lea r8, [rbp-0x10]  ; r8 = rbp-0x10 
    mov r9, [r8]   ; should have just done mov r9, [rbp-0x10] 
    mov r10, [r9+0x10] 
    jmp r10     ; jump to argv[2]??? 

你把机器码字节放在argv[2]

当然,由于rbp未初始化,因此实际上并未访问argv[2]


; get argc and argv from the stack, for x86-64 SysV ABI 
global _start 
_start: 
    mov ecx, [rsp]    ; load argc (assuming it's smaller than 2^32) 

    cmp ecx, 3 
    jb .argc_below_3 

    mov rsi, [rsp+8 + 0x10] ; argv[2] (the 3rd element) 
    mov al, [rsi]    ; first char of argv[2] 

    ; if you stop here in a debugger, you can see the character from the second arg. 

.argc_below_3: 
    xor edi, edi 
    mov eax, 231     ; exit_group(0) 
    syscall