跳回调用者

逆向工程 ollydbg 调试
2021-06-21 04:48:46

我正在 ollydbg 中调试一些应用程序,所以我设置了这两个步骤来开始调试应用程序。

  1. 我使用输入参数从文件菜单加载 exe
  2. 在 msvcr71.printf 函数上设置断点

在这两个初始步骤之后,当我点击 F9 时,应用程序会显示一些使用 printf 函数生成的消息,具体取决于输入参数(现在我正在测试错误的密码,其中显示了有关错误密码的应用程序消息)。所以现在我需要跳转到包含逻辑的代码,即调用 printf 的代码,通过检查传递是好还是坏。当我设置断点时,如何做到这一点?

谢谢

3个回答

这是一种返回呼叫者的方法。下面是一个用于演示的小C++crackme

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
    char code[50];
    char valid[]="12345";
    printf("Enter your password : \n");
    gets(code);
    if(!strcmp(code,valid))
        printf("That's it!!!\n");
    else
        printf("Try again!!!\n");
    getch();    
    return 0;
}

步骤1

现在像往常一样在 OllyDBG 中加载应用程序。现在假设我们对crackme 的内在逻辑一无所知。因此,让我们在控制台上打印的函数上放置一个断点。所以最好的办法是搜索所有的模块间调用。

在此处输入图片说明


第2步

所以你看到它调用了puts。这个函数用于在控制台上显示一个字符串,从 3 个地方调用。因此,让我们在函数本身上放置一个断点,以便我们可以知道从哪里调用它。

现在函数定义在VA 0x75898D04所以在那里放一个断点。

在此处输入图片说明


第 3 步

现在通过按F9直到断点被击中来运行应用程序

在此处输入图片说明

现在查看右下角的堆栈,它显示了puts执行后返回的位置以及传递给此函数的参数。

由于传递的这个参数是要求输入密码的字符串,因此我们可以跳过它,直到到达 badboy 消息字符串为止。因此,继续按F9直到到达传递的参数是 badboy 消息的点。(同时控制台要求输入密码并在那里写一些东西)

所以我们一直跑到这里。


步骤4

在此处输入图片说明

puts将返回到VA 0x401C66并且传递的参数是 badboy 消息。所以让我们去0x401C66在 CPU 窗口中Ctrl+G转到那里。您也可以Enter直接按下堆栈上显示的返回地址。

所以我们降落在这里。

在此处输入图片说明


第 5 步

就在puts调用上方,有一个strcmp调用使用硬编码值检查我们输入的序列。如果你稍微探索一下,你会发现硬编码的值是12345

(您可以在strcmp调用上设置断点并重新启动目标以查看正在与谁进行比较)

所以这就是连续剧,它会跳过坏男孩的信息,让我们看到好男孩的信息。

我不是建议使用Ctrl+F9方法,因为您有时可能会遇到永远不会返回的函数。此类函数专门编码以混淆和阻止静态和动态分析。但是在其他情况下Ctrl+F9方法非常好。

一旦你的断点printf()被击中,按Ctrl+F9告诉 OllyDbg 运行直到printf()函数结束,然后按F7单步返回指令返回调用者。

您的两个屏幕截图都无关应用程序在第一个屏幕截图中已终止,并且它在第二个屏幕截图中位于一些随机的 ZwMapSection 中

你发布了你在 printf 上设置了一个 bp 是断点命中吗?如果它被击中,那么你可以使用 ctrl+k 查看调用堆栈 ollydbg 会告诉你谁调用了 printf

你的屏幕截图没有显示你是否已经休息了,如果你在调用 printf 时被暂停,正如杰森在他的评论中发布的那样

同样使用 ollydbg,您可以使用 runtrace 功能来跟踪可以帮助您隔离逻辑的完整路径,您是否尝试过使用它