专栏名称: 黑客技术与网络安全
分享最前沿的黑客知识,了解黑客世界,学习黑客技术
目录
相关文章推荐
新华社  ·  这6个指标正常,说明你肝脏健康 ·  昨天  
扬子晚报  ·  32岁女演员在机场被捕! ·  昨天  
51好读  ›  专栏  ›  黑客技术与网络安全

吾爱破解一道题目,GPT4秒破!

黑客技术与网络安全  · 公众号  ·  · 2024-04-03 08:30

正文

来自公众号: 轩辕的编程宇宙


大过年的,我的逆向学习群里有几个卷王不过春节,居然在那里玩什么破解题目,一开始我还没注意,专心在家炸金花,后来发现玩的人越来越多,探讨氛围越来越浓,我也来了兴趣。

一了解才知道,原来是吾爱破解论坛搞了个春节解题领红包的活动。群里有小伙伴卡住了逆不动向我求助,于是我花了点时间研究了一下。没想到还挺有意思

首先下载到这个题目的程序来运行一下,提示需要输入一个密码,先随便输入一个试试,不出所料,打印了一个Error退出了。

来,大型伺候,祭出逆向分析神器IDA,看看它有多少斤两。

IDA自动分析出了main函数, 先来大体浏览一下main函数的结构。从这些字符串信息看得出来,整个判断逻辑还是比较清晰简单的。

这里是第一处比较和判断,如果判断不通过,跳到红线的分支,直接打印Error信息。否则顺着绿色的线来到下一个代码块。

然后这里执行了一些操作之后,又继续比较判断,如果判断不通过,顺着这里的绿线,打印一个Wrong信息。

就这样一层层的校验判断,就能最终通向成功的地方,这里打印一个Success字符串!

如果仅仅只是想让程序打印出Success字符串,我们可以一路修改条件跳转指令的标志位来实现,也就是暴力破解,这个我们之前的视频里已经给大家演示过。但这道题目是要输入正确的flag,光打印Success是没有意义的,所以还得分析出正确的flag才算是破解这道题目。

好吧,看汇编指令总是让人头大,祭出IDA的大招,F5大法,反编译出C语言。

这一晃眼,也看不太出来是怎么个逻辑。

不过我注意到了这里这个函数调用,在访问全局的变量。

点进去发现这是一个字符串,大胆猜想,这个字符串肯定与我们要的flag有关系!它可能被加了密!

然后一不小心,我瞅见了这个字符串旁边还有一个字符串,这里居然有一段提示,告诉我们破解的方法就是 凯撒密码

凯撒密码是一种很古老也很简单的密码,简单来说,它是把明文中的字母按照字母表上向前(或向后)按照一个固定数目进行偏移后替换成对应的字符,所有字符替换完成后就得到了密文。

这个加密强度非常低,也没有秘钥,只要知道了这个偏移值,就能还原出来了。

结合刚刚的这个加密字符串,和这个提示信息,我自然而然的想到,那这个字符串肯定就是移位后的结果。

我的第一反应是想着写个程序去暴力尝试,对这个加密后的字符串通过各种不同的偏移值去还原,全部打印出来,然后根据打印出的结果,去人工筛选出最有可能的那一组来。因为真正的那个字符串肯定里面是一些有意义的单词,根据这个特征就能筛选。

于是我打开IDE,准备来编码,工程才刚建了一半,我突然想到,为啥不让AI来试试呢?

于是我打开了GPT4.0,把这个字符串给了它,并告诉它,这个字符串可能是凯撒加密的结果,让它给我推导出可能的原始明文。

几秒钟的时间,它还真给我分析出来了。这个偏移就是3,所有字符向前移动3位,得到的字符串里面就有有意义的字符串!

我赶紧拿着这个字符串试了一下,没想到居然还是给我报Error!

但这个字符串怎么看都长得像是flag。然后我凭借之前打CTF的经验,flag的格式,最后这里应该还有一个右花括号。我加了一个右花括号,又尝试了一次,嘿,这一次成功了,打印了Success!

不过我还是好奇,这个flag怎么就少了一个字符呢?凯撒加密不会改变长度啊!

于是我重新在IDA中打开了那个字符串。没想到在字符串的后面还有一个字节0x80。

因为它已经超出了ASCII字符的范围,IDA在分析字符串的时候,把它给漏掉了。而0x80向前移动三位,刚好就是右花括号!真的坑爹啊!

到这里为止,这道题目就算是破解成功了!GPT真的香啊,日常工作辅助真是个好帮手!

不过这样就破解了,总感觉有点偷奸耍滑的味道,假设没有那个提示的情况下,我们又怎么拿到flag呢?

接下来我们就来正式分析一下这道题目。

首先,我们看一下这第一个地方的判断跳转,看看这里是在判断和比较什么

我们使用WinDbg打开这个程序

我们在这第一个跳转前的判断指令这里下个断点,然后运行一下。

程序现在提示需要输入,我们随便输点啥,比如我输入一个xuanyuan,回车!

程序中断到了我刚才的断点,这里是在拿ebp-18h这个地址处的值和24h,也就是十进制的36来比较。

来看一下ebp-18h处的内存数据现在是什么。可以看到,这里是8,注意是小端字节序。

我们再往前看看,我们刚刚输入的字符串就在这附近。而8刚好就是我输入字符串的长度。难道这个位置是一个字符串长度的变量?







请到「今天看啥」查看全文