如何执行此指令:`mov qword ptr [rbp-0x30], 0x4020c5`

逆向工程 部件 x86 x86-64
2021-07-06 17:34:29

以下是我拥有的代码片段(部分显示):

q = strrchr(resolved, '/');     /* given /home/misha/docs.txt, q now pts to the last slash */
    if (q != NULL) {
      p = q + 1;                   /* p points to docs.txt */

      if (q == resolved)
        q = "/";
      else {
        do {
          --q;
        } while (q > resolved && *q == '/');

使用 objdump 生成带有 -S 标志的输出:

401789:       e8 7a fb ff ff          call   401308 <strrchr>
  40178e:       48 89 45 d0             mov    QWORD PTR [rbp-0x30],rax
    if (q != NULL) {
  401792:       48 83 7d d0 00          cmp    QWORD PTR [rbp-0x30],0x0
  401797:       0f 84 12 01 00 00       je     4018af <fb_realpath+0x22d>
      p = q + 1;                   /* p points to docs.txt */
  40179d:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4017a1:       48 83 c0 01             add    rax,0x1
  4017a5:       48 89 45 d8             mov    QWORD PTR [rbp-0x28],rax

      if (q == resolved)
  4017a9:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4017ad:       48 3b 85 e0 fe ff ff    cmp    rax,QWORD PTR [rbp-0x120]
  4017b4:       75 0a                   jne    4017c0 <fb_realpath+0x13e>
        q = "/";
  4017b6:       48 c7 45 d0 c5 20 40    mov    QWORD PTR [rbp-0x30],0x4020c5
  4017bd:       00
  4017be:       eb 33                   jmp    4017f3 <fb_realpath+0x171>
      else {
        do {
          --q;
  4017c0:       48 83 6d d0 01          sub    QWORD PTR [rbp-0x30],0x1
        } while (q > resolved && *q == '/');
  4017c5:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4017c9:       48 3b 85 e0 fe ff ff    cmp    rax,QWORD PTR [rbp-0x120]
  4017d0:       76 0b                   jbe    4017dd <fb_realpath+0x15b>
  4017d2:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4017d6:       0f b6 00                movzx  eax,BYTE PTR [rax]
  4017d9:       3c 2f                   cmp    al,0x2f
  4017db:       74 e3                   je     4017c0 <fb_realpath+0x13e>

现在,我有一个关于q = "/";教学的问题q被定义为 achar*并且从这个例子中可以看出,它包含一个由strrchrfucntion返回的值然后它被分配给一个字符串 -q = "/";在代码中进一步。现在,代表汇编的指令是 - mov QWORD PTR [rbp-0x30],0x4020c5我很难理解这个指令。现在,我的理解是,它应该将字符串“/”移动到q. 但是它怎么知道指向的位置q呢?rbp-0x30是堆栈上q存储的位置这个位置应该包含q指向的对象的地址但是,我将其解释mov QWORD PTR [rbp-0x30],0x4020c5为将字符串移动0x4020c5rbp-0x30即的地址q. 这就是我感到困惑的地方,因为该位置应该包含地址而不是字符串。

感谢您的阅读,感谢您的帮助。

2个回答

mov QWORD PTR [rbp-0x30],0x4020c5确切地说是“移动0x4020c5到内存位置rbp-0x30并将此数字视为 qword”(8- 字节数)。

但是q位于内存位置rbp - 0x30,因此您写入该地址的任何内容都将写入q. 因此,该数字0x4020c5被写入q. 该数字0x4020c5本身不是字符串 - 它是字符串的内存地址(只是一个指针)。Soq指向一个字符串0x4020c5,因此q[0] == '/'q[1] == NULL

这就是我们期望从指令中得到的行为q = "/"——它不会改变q指向的内存,而是改变它q本身。

你可以在你的源代码中添加一些变量调试帮助的打印地址来掌握这些地址

请参阅下面粘贴中第 5 行的拆卸

#include <stdio.h>

int main (void) {
    char * q;
    q = "/";
    printf("%p\n",&q);
}

拆卸

slashaddr!main:
    3 01141000 55              push    ebp
    3 01141001 8bec            mov     ebp,esp
    3 01141003 51              push    ecx
    5 01141004 c745fc90011801  mov     dword ptr [ebp-4], (01180190)