我有一些调用函数的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;
}
答案 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中看到代码的反汇编。