大家好,又见面了,我是你们的朋友全栈君。
逆向之旅001_攻防世界game
- 写在前面
- 攻防世界的第一题game
-
- 第一步:运行这个exe
- 使用IDA反编译
- 总结
写在前面
这是我的第一篇博客,从大二开始接触网络安全的知识,现在已经大四了.回首过去,课外的实践主要是在跟着导师做态势感知的项目,从写爬虫到搭网站再到写定位算法再到去参加信安作品赛。。。。在这个过程中,我的正向开发能力确实提高了。但逆向作为网安人必不可少的能力,我之前没有花时间钻研过。目前掌握的关于逆向的基础知识都是在课堂上学到的,例如栈溢出,堆溢出,UAF,pe文件格式,代码保护技术,汇编语言,编译和反编译原理等等等等,比较琐碎,而且没有去实践过,总觉得缺点什么。 因此从现在开始,我决定做ctf里的逆向题目,利用动手实践的过程来对已经学到的知识进行更深刻的理解,以及学习更多的知识,了解更多计算机底层的技术。我决定每做一个题后,就在csdn上记录一下过程以及感想,总结。借此也督促我要持之以恒。 只要现在开始,都不算晚!希望我能坚持下去,一步一步的往前走,从入门到发现其中的乐趣。 同时也跟大家分享一下我的思路,欢迎大家与我交流,我们一起共同进步。我的邮箱是 18029261561@163.com
攻防世界的第一题game
代码语言:javascript复制攻防世界的逆向第一题:game
链接:(https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074&page=1)
第一步:运行这个exe
代码语言:javascript复制翻译:玩游戏,n是灯的序列号,m是灯的状态,如果第n个灯的m是1,它就亮,如果不是,它就灭。
起初所有的灯都关了,现在你可以输入n来改变它的状态,
但是你要注意一件事,如果你改变第N个灯的状态,(N-1)th和(N 1)th的状态也会改变,
当所有灯都亮起时,将出现flag。
现在,输入n,n的值域是[1,8]
使用IDA反编译
第一步找主函数,在函数名列表中使用crtl f,输入main,找到_main0_函数,然后fn F5反编译,查看反编译的代码,如下图所示:
结合第一步中,这个程序说的“当所有灯都亮起时,将出现flag。”以及代码中的第79行至88行,推断出第88行的函数,应该就是会生成flag的函数,所以我把这个函数命名为gen_flag,然后分析这个函数,还是定位到这个函数后,用f5反编译生成伪代码,这个函数的代码描述了一个生成flag的算法,可以使用python脚本复现这个算法然后得到flag。
但我有点不想算,于是我就换了个方法,可以看到_main0_函数的第77行,有个字符串“CLS”。 然后我用od打开这个exe,然后右键,选择超级字符串参考->1ASCII,然后查找“CLS”,(使用的快捷键是ctrl F),然后点击这个字符串,从而会定位到这个字符串,如下图所示:
cls所在代码的后面紧跟了8个JNZ指令,JNZ指令是 结果不为零则转移,正好对应了ida中_main0_函数的第79-86行:
我们的目的是想让程序执行是生成flag的函数,所以我们要修改if里面的判断条件,让这个判断条件特别容易实现,那么我们就可以很快得到flag了,因此我们将这个判断条件改为:
代码语言:javascript复制if ( byte_532E28[0] == 1
&& byte_532E28[1] == 1
&& byte_532E28[2] == 1
&& byte_532E28[3] != 1
&& byte_532E28[4] != 1
&& byte_532E28[5] != 1
&& byte_532E28[6] != 1
&& byte_532E28[7] != 1 )
这样的话,我们再玩这个游戏时,只要输入2,就可以让1,2,3号灯亮,4~8号灯不亮,就跟这个判断条件对上了,然后程序就会执行后面的生成flag的代码了。 怎么改呢? 原来的代码中用的是JNZ,对应的是“==”,现在我们要反过来,JNZ反过来就是JZ,
代码语言:javascript复制JNZ是结果不为零则转移,对应的机器码为 0F85 或者 75
JZ是结果为零则转移 ,对应的机器码为0F84 或者 74
在这给个链接,是我从 吾爱激活成功教程论坛上找的,指令与其对应的机器码的手册: 提取码是heii 所以接下来使用od修改后面5个JNZ指令,修改方法我大概说一下: 1.鼠标指要修改的那一行代码处,然后右键,然后选择“复制到可执行文件”->选择。 2.会弹出来一个不同颜色的框,然后找到你要修改的代码处,然后ctrl E, 3.把5个JNZ指令改完后,鼠标右键,选择“保存文件”,然后重新命个名字,于是就得到了一个修改后的exe文件。
我们用ida打开这个修改后的文件,反编译一下看一看我们的修改成功了没有,如下图:我成功了
然后运行这个修改后的exe,然后输入2,就得到flag了,如下图所示:
ps:我主要是在想记录做题时整体的思路,但是考虑到可能会有跟我一样的小白会看到这篇文章,所以我也写了一些具体的操作方法。 不过有些地方我写的还是不清楚,所以有疑问的同学可以留言我,或者发邮件。我会尽快回复你,咱们一起进步。
如果你觉得这篇文章对你有用或者觉得还可以,那就帮我点个赞吧,谢谢啦!
总结
1.使用ida进行反编译后,总是惯性的想搞清楚每一行代码,于是看了每一个函数,这样效率太低了。所以我觉得正确的做法是先看主函数,搞清楚程序的整个实现框架和流程,先从全局去把握这个程序,然后结合我们对这个程序的了解,来分析出对我们最重要的代码,然后再详细的对这一步分代码进行分析。 2.这是我的第一个逆向题目,要坚持下去,持之以恒,别忘了一万小时定律!!! 坚信只要坚持下去,就会有好的结果。 3.要用心去找去体会其中的乐趣! 乐趣可以帮助我坚持下去!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/215923.html原文链接:https://javaforall.cn