JG指令_JZ指令

JG指令_JZ指令逆向之旅001_攻防世界game写在前面攻防世界的第一题game第一步:运行这个exe使用IDA反编译总结写在前面这是我的第一篇博客,从大二开始接触网络安全的知识,现在已经大四了.回首过去,课外的实践主要是在跟着导师做态势感知的项目,从写爬虫到搭网站再到写定位算法再到去参加信安作品赛。。。。在这个过程中,我的正向开发能力确实提高了。但逆向作为网安人必不可少的能力,我之前没有花时间钻研过。目前掌握的关于逆向的基础知识都是在课堂上学到的,例如栈溢出,堆溢出,UAF,pe文件格式,代码保护技术,汇编语言,编译

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

写在前面

这是我的第一篇博客,从大二开始接触网络安全的知识,现在已经大四了.回首过去,课外的实践主要是在跟着导师做态势感知的项目,从写爬虫到搭网站再到写定位算法再到去参加信安作品赛。。。。在这个过程中,我的正向开发能力确实提高了。但逆向作为网安人必不可少的能力,我之前没有花时间钻研过。目前掌握的关于逆向的基础知识都是在课堂上学到的,例如栈溢出,堆溢出,UAF,pe文件格式,代码保护技术,汇编语言,编译和反编译原理等等等等,比较琐碎,而且没有去实践过,总觉得缺点什么。
因此从现在开始,我决定做ctf里的逆向题目,利用动手实践的过程来对已经学到的知识进行更深刻的理解,以及学习更多的知识,了解更多计算机底层的技术。我决定每做一个题后,就在csdn上记录一下过程以及感想,总结。借此也督促我要持之以恒。
只要现在开始,都不算晚!希望我能坚持下去,一步一步的往前走,从入门到发现其中的乐趣。
同时也跟大家分享一下我的思路,欢迎大家与我交流,我们一起共同进步。我的邮箱是 18029261561@163.com

攻防世界的第一题game

攻防世界的逆向第一题:game
链接:(https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074&page=1)

Jetbrains全家桶1年46,售后保障稳定

第一步:运行这个exe

在这里插入图片描述

翻译:玩游戏,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了,因此我们将这个判断条件改为:

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,

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.net/215923.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何优雅地打印Java数组?「建议收藏」

    如何优雅地打印Java数组?「建议收藏」在逛StackOverflow的时候,发现了一些访问量像‎安第斯山一样高的问题,比如说这个:打印Java数组最优雅的方式是什么?访问量足足有220W+,想不到啊,这么简单的问题竟然有这么多程序员被困扰过。来回顾一下提问者的问题吧:在Java中,数组虽然是一个对象,但并未明确的定义这样一个类,因此也就没有覆盖toString()方法的机会。如果尝试直接打印数组的话,输出的结…

    2022年4月28日
    52
  • echarts+vue_vue安装echarts

    echarts+vue_vue安装echarts1.安装cnpminstallecharts-wordcloud2.创建模板组件WordCloudChart<template><div:id=”id”:style=”{height:height,width:width}”/></template><script>importechartsfrom”echarts/lib/echarts”;importresizefrom”@/m

    2022年10月9日
    2
  • html css is图片,isbackground

    html css is图片,isbackgroundisbackground有何作用首先不是为了多线程而多线程,多线程会极大的带来额外的出错的几率。C#中第一个打开窗口的线程是主线程,也是处理UI的线程,最好保持这个线程通畅,即不要有阻塞操作,如Thread.Sleep(10);等这样是不好的。耗时的线程需要打开新的线程来操作。c#可以使用多少个Thread.IsBackground=true我现在有一个程序,有UDP/TCP/US…

    2022年10月16日
    1
  • Java字符串转集合_java集合转数组

    Java字符串转集合_java集合转数组数组转集合方法使用Arrays.asList(数组)代码如下: //定义一个字符串 Stringzhuan=”1,2,3,4,5,6,7,8,9″; //分割字符串String[]split=zhuan.split(“,”);//把数组转成集合List<String>stringList=Arrays.asList(split);//输出结果S

    2022年9月19日
    3
  • android 中 TextView的用法[通俗易懂]

    android 中 TextView的用法[通俗易懂]本文讲解TextView4种常见的用法:一.如何显示文本(URL,不同大小、字体、颜色的文本)    activity_main.xml

    2025年7月16日
    2
  • 5分钟入门mp4文件格式是多少_Mp4格式

    5分钟入门mp4文件格式是多少_Mp4格式写在前面本文主要内容包括,什么是MP4、MP4文件的基本结构、Box的基本结构、常见且重要的box介绍、普通MP4与fMP4的区别、如何通过代码解析MP4文件等。写作背景:最近经常回答团队小伙伴关于直播&短视频的问题,比如“flv.js的实现原理”、“为什么设计同学给的mp4文件浏览器里播放不了、但本地可以正常播放”、“MP4兼容性很好,可不可以用来做直播”等。在解答的过程中,发现经常涉及MP4协议的介绍。之前这块有简单了解过并做了笔记,这里稍微整理一下,顺便作为团队参考文档,如

    2022年10月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号