忆魂丶天雷 发表于 2023-3-26 21:28

一个字符串禁止Ollydbg调试

本帖最后由 忆魂丶天雷 于 2023-3-26 22:48 编辑


#前言
---
好,成功把你骗进来来了,其实我是个标题党别往下看了(猫猫头保命😹~)
#正文
---
##OllyDebug久远的历史与现状
OD作为一款Ring3级的调试器,他的地位与名声想必大家都有所耳闻,在前些年它还是最流行的调试工具(为什么说前些年?当然是因为开源的X64dbg的崛起)......而今虽然逐渐败落,但是使用人数依旧很多,这得当然得益于各种强大的OD插件和各位大牛二改版本,使得OD强行续命残喘至今,但是因为其本身作为一款`闭源`软件,又加之`年久失修无人维护`,存在在很多致命的缺点,比如不支持64位应用调试(据说作者有开发OD2.0但是....有兴趣可以自行搜索),又比如今天的主题,一个`字符干掉OllyDebug`.

##从一种老掉牙过时的反调试手段说起
相信如果有学习反调试的朋友应该都有见过或则听说过一种针对OllyDebug。
名为`OD漏洞攻击`的反调试方法。
演示代码如下:
```
#include <Windows.h>
int main(int argc, char* argv[])
{
      MessageBox(NULL, TEXT("程序开始运行!"), NULL, MB_OK);
      OutputDebugStringA(TEXT("%s%s%s"));                      //
      MessageBox(NULL, TEXT("程序正常运行!"), NULL, MB_OK);
}
```

原理如下:
> 程序调用OutputDebugString()会产生一个特殊标志的软件异常,如果程序正在被调试那么调试器线程的WaitForDebugEvent函数会将此异常捕获并转化为OUTPUT_DUBGU_STRING_EVENT调试事件,OD在捕获此调试事件后会接着调用Sprintf()将OutPutDebugString中的字符串打印出来。而Springf函数并不会对参数进行检查,如果OutputDebugStringA(TEXT("%s%s%s")),OD中是Springf(目标缓冲区,"调试字符串"),因为现在调试字符串是“%s%s%s”,那么Springf(目标缓冲区,“%s%s%s”,X1,X2,X3),而此X1,X2,X3就会随机从栈中取出数据作为字符换的首地址,所以很容易取到的数据是一个无效指针会产生缓冲区异常。

值得注意的是,目前多数版本的OD已经将此漏洞修复(感恩前面说的强大的插件)

##`%s%s%s`的死灰复燃(活了但没完全活)
是的,很遗憾,如前面所说,通过OutputDebugString输出一下%s%s%s就可以让OD崩溃的漏洞被修复了,但是%s%s%s好像还能抢救一下,这里也不卖关子,其实只是一个很简单的操作,将任意文件的文件名`重命名`为`%s%s%s.exe`即可

经过测试,咱们论坛的`吾爱破解专用版Ollydbg`完败,如图所示:


当然,也并不是所有的OD都可以打败,例如我跪舔的一位技术大牛表哥集成的一款二改OD就可以完美的避免这个问题(默认配置就可以过VMP反调试哦~当然我只白嫖到3.6现在都好像出VMP3.8了不知道反调试有没有改进)。


##更为牛逼的字符串
~~好 本贴结束&#128054;~~

可惜,`%s%s%s`的确很强大,但是在各大OD插件的魔法攻击下,它最终还是没活过来(除非你的对手用的是吾爱破解专用OD~,继续猫猫头保命&#128569;)。
但是这也引发了我们一个思考,既然都是字符串,那么是否还存着其他的更为强大的字符串呢?答案是肯定的!

忆想当年,谁不是一个非主流的中二少年(bushi~)你多多少少也用过几个非主流的网名吧。比如`じ浅夏♕初雨`又比如`꧁碎花小裙子꧂`,总有一个你用过吧

那么我们给软件~~穿上~~`重命名`为`꧁碎花小裙子꧂`呢?


如图所示,强大到直接无视VMP反调试,碾死%s%s%s的OD竟然败在了碎花小裙子下。而且更为牛逼,直接显示无法定位文件,OD连加载文件都加载不了。

wow碎花小裙子牛逼,还等什么?赶紧去给你的软件穿上碎花小裙子!

##小菜的测试结果

好,言归正传,其实真正牛逼的并不是什么碎花小裙子,而是其中的特殊字符`꧁`和`꧂`

这就是一个字符串的力量,这里可以简单的说一下小菜(我)的测试结果,碎花小裙子通杀了我收集的包括吾爱破解专用OD在内的17款OD,均无法直接定位文件,也就是说如果你想把文件直接拖到OD里调试,那不好意思,没门。

但是,遗憾的是,部分OD依旧可以通过附加功能,在进程列表中找到进程,然后测试发现可以正常进行附加调试,当然也有部分OD在进程列表中直接找不到含有特殊字符的进程,变相的实现了进程隐藏,但是具体原因不明,推测是某些插件起了作用。

当然,对于先进的X64dbg而言,自然不存在这种BUG,毕竟OD是年龄摆在那里。但是,也不是说绝对通杀所有的OD,我的测试结果只能证明,可以通杀我收集到的17款。

那么有字符串可以干掉X64dbg吗?

我的答案是,有,

为什么?因为,之前的群里聊到本主题相关内容时有大牛演示了。

那么这个字符是什么?

我也想知道,但是被打马赛克了,我甚至百度了有没有马赛克解码工具。(真的没什么其他用途!)

#引发的反思与闲谈

经此一文,大家应该初识了字符串的神奇威力,其实发生在我们身边因为字符串导致的严重安全隐患还是很常见的,例如在QQ群流行的各种卡屏代码,尤其是对手机端造成的影响甚至可以达到让你必须清空QQ数据才能重新正常打开QQ(别问我怎么知道的,谢谢),又例如21年Win10爆出的严重漏洞,一段字符串`\:$i30:$`格式化你硬盘,再例如苹果IOS也发生过多起因为字符串导致的严重BUG,比如特殊字符串WIFI名称直接让手机断网,又例如某应用超长字符串导致手机卡死重启。

所以,真的不要小看一个小心的字符串,有时候会给你带来意想不到的的后果。

好了,到这里,这个水贴是真的结束了,就技术含量上来说,毫无技术含量,就实用性上来说,也几乎为0,毕竟虽然一个特殊字符串可以保护你的软件不会被OD加载,但是应该不会有人不会重命名吧,不会吧,不会吧,不会吧。

最后的最后,虽然说,应该不会有那种无聊的人在下面吐槽“没什么用”“垃圾”之类的攻击性言论,但咱们还是有言在先,如果真的觉得没用,对你帮助的意义不大,那么请如前言中所说,我是个标题党,你可以直接关贴。因为小菜身体不大好,受不了气,不能激动,请饶我狗命一次。

Asympto69 发表于 2023-3-27 23:54

感觉一开始制定各类字符的计算机表示规范的时候就很不严谨,才有了现在这么多的问题哈哈哈哈

忆魂丶天雷 发表于 2023-3-29 17:38

孽小帅才 发表于 2023-3-26 22:35
woqu 我去!!!调试值钱修改文件名字不就可以了么

是的,正如文章末尾所说,解决这个问题的方法很简单就是对文件进行重命名。但是我需要强调的一点是,文章中本质上只是简单粗暴的对OD存在的一个BUG进行了复现,至于如何运用这一个BUG,这正是大家需要思考的问题。

忆魂丶天雷 发表于 2023-3-26 21:30

{:301_999:}如果有帮助,给个免费的评分不过分吧

henry307 发表于 2023-3-26 21:43

如果可以,各位大牛出此破解调试的基础课吧,针对新手的 OllyDebug

coder_LGB 发表于 2023-3-26 21:45

回头试试看:lol

enzospace 发表于 2023-3-26 22:01

收藏了,感谢分享

Natu 发表于 2023-3-26 22:06

道高一尺魔高一丈,楼主分享的文章挺好的,免费评分呈上,略表敬意!

思想者 发表于 2023-3-26 22:22

简单易懂, 学习了

孽小帅才 发表于 2023-3-26 22:35

woqu 我去!!!调试值钱修改文件名字不就可以了么

Rzzz820 发表于 2023-3-26 23:13

见识了!!

larrybbb 发表于 2023-3-26 23:27

太厉害了!!学习了
页: [1] 2 3 4
查看完整版本: 一个字符串禁止Ollydbg调试