前言
好,成功把你骗进来来了,其实我是个标题党别往下看了(猫猫头保命😹~)
正文
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了不知道反调试有没有改进)。
更为牛逼的字符串
好 本贴结束🐶
可惜,%s%s%s
的确很强大,但是在各大OD插件的魔法攻击下,它最终还是没活过来(除非你的对手用的是吾爱破解专用OD~,继续猫猫头保命😹)。
但是这也引发了我们一个思考,既然都是字符串,那么是否还存着其他的更为强大的字符串呢?答案是肯定的!
忆想当年,谁不是一个非主流的中二少年(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加载,但是应该不会有人不会重命名吧,不会吧,不会吧,不会吧。
最后的最后,虽然说,应该不会有那种无聊的人在下面吐槽“没什么用”“垃圾”之类的攻击性言论,但咱们还是有言在先,如果真的觉得没用,对你帮助的意义不大,那么请如前言中所说,我是个标题党,你可以直接关贴。因为小菜身体不大好,受不了气,不能激动,请饶我狗命一次。