如何在内存中找到返回指令

时间:2015-09-06 14:35:01

标签: c debugging memory opcode

我有一些调用函数的C代码。我正在Windows上的visual studio中编译此代码。有没有直接的方法来查看返回指令(操作码)和返回地址? 我试图在Visual Studio中使用内存窗口,但我只看到我的缓冲区" blie"和一些十六进制解释的内存值。我认为CC可能是一个操作码,但我想有一个方法/软件来清楚地查看返回指令和返回地址。

#include <stdio.h>
#include <stdlib.h>

int foo(char *);

int main(int argc, char *argv[])
{
    if (argc != 1)
        return printf("Supply an argument, dude\n");
    foo(argv[0]);
    return 0;
}

int foo(char *input)
{
    unsigned char buffer[600] = "";

    printf("Adres: %.8X\n", &buffer);
    strcpy(buffer, input);
    return 0;
}

memory view

2 个答案:

答案 0 :(得分:2)

返回地址位于堆栈内存区域(由rsp寄存器指向,假设您处于x86_64),而执行函数返回的代码位于代码存储区中区域。 如果您想查看返回地址,请停止RET指令上的处理并查看堆栈顶部。

如果您只想查看生成的代码,可以使用反汇编程序。在使用Windows时,您可以尝试使用开源x64dbg。存在其他选项,例如IDA Pro,您可以在此问题中查看其他人的列表:https://reverseengineering.stackexchange.com/questions/1817/is-there-any-disassembler-to-rival-ida-pro

答案 1 :(得分:1)

文档摘录:

  

RET指令从当前的过程传输程序控制   执行(被调用的程序)回到调用它的过程(   调用程序)。通过复制返回来完成控制转移   从堆栈到EIP寄存器的指令指针。

正如您所看到的,返回地址位于堆栈中,因此您无法在反汇编中看到它。

关于寻找返回指令 - 不容易。最有可能你使用x86 cpu,它是具有可变长度操作码的CISC(与RISC相比)。这意味着,为了找到任何操作码,您必须首先“找到”所有操作码。

BTW:您可以在VS中看到代码的反汇编。