我正在 ollydbg 中调试一些应用程序,所以我设置了这两个步骤来开始调试应用程序。
- 我使用输入参数从文件菜单加载 exe
- 在 msvcr71.printf 函数上设置断点
在这两个初始步骤之后,当我点击 F9 时,应用程序会显示一些使用 printf 函数生成的消息,具体取决于输入参数(现在我正在测试错误的密码,其中显示了有关错误密码的应用程序消息)。所以现在我需要跳转到包含逻辑的代码,即调用 printf 的代码,通过检查传递是好还是坏。当我设置断点时,如何做到这一点?
谢谢
我正在 ollydbg 中调试一些应用程序,所以我设置了这两个步骤来开始调试应用程序。
在这两个初始步骤之后,当我点击 F9 时,应用程序会显示一些使用 printf 函数生成的消息,具体取决于输入参数(现在我正在测试错误的密码,其中显示了有关错误密码的应用程序消息)。所以现在我需要跳转到包含逻辑的代码,即调用 printf 的代码,通过检查传递是好还是坏。当我设置断点时,如何做到这一点?
谢谢
这是一种返回呼叫者的方法。下面是一个用于演示的小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;
}
现在像往常一样在 OllyDBG 中加载应用程序。现在假设我们对crackme 的内在逻辑一无所知。因此,让我们在控制台上打印的函数上放置一个断点。所以最好的办法是搜索所有的模块间调用。
所以你看到它调用了puts
。这个函数用于在控制台上显示一个字符串,从 3 个地方调用。因此,让我们在函数本身上放置一个断点,以便我们可以知道从哪里调用它。
现在函数定义在VA 0x75898D04
。所以在那里放一个断点。
现在通过按F9直到断点被击中来运行应用程序。
现在查看右下角的堆栈,它显示了puts
执行后返回的位置以及传递给此函数的参数。
由于传递的这个参数是要求输入密码的字符串,因此我们可以跳过它,直到到达 badboy 消息字符串为止。因此,继续按F9直到到达传递的参数是 badboy 消息的点。(同时控制台要求输入密码并在那里写一些东西)
所以我们一直跑到这里。
puts
将返回到VA 0x401C66
并且传递的参数是 badboy 消息。所以让我们去0x401C66
。在 CPU 窗口中按Ctrl+G转到那里。您也可以Enter直接按下堆栈上显示的返回地址。
所以我们降落在这里。
就在puts
调用上方,有一个strcmp
调用使用硬编码值检查我们输入的序列。如果你稍微探索一下,你会发现硬编码的值是12345
(您可以在strcmp
调用上设置断点并重新启动目标以查看正在与谁进行比较)
所以这就是连续剧,它会跳过坏男孩的信息,让我们看到好男孩的信息。
我不是建议使用Ctrl+F9方法,因为您有时可能会遇到永远不会返回的函数。此类函数专门编码以混淆和阻止静态和动态分析。但是在其他情况下Ctrl+F9方法非常好。
一旦你的断点printf()
被击中,按Ctrl+F9告诉 OllyDbg 运行直到printf()
函数结束,然后按F7单步返回指令返回调用者。
您的两个屏幕截图都无关应用程序在第一个屏幕截图中已终止,并且它在第二个屏幕截图中位于一些随机的 ZwMapSection 中
你发布了你在 printf 上设置了一个 bp 是断点命中吗?如果它被击中,那么你可以使用 ctrl+k 查看调用堆栈 ollydbg 会告诉你谁调用了 printf
你的屏幕截图没有显示你是否已经休息了,如果你在调用 printf 时被暂停,正如杰森在他的评论中发布的那样
同样使用 ollydbg,您可以使用 runtrace 功能来跟踪可以帮助您隔离逻辑的完整路径,您是否尝试过使用它