攻防世界 reverse 逆向简单题练习区 答题(1-12题解 ...
来源:http://www.tudoupe.com时间:2022-01-11
序
传送门:https://adworld.xctf.org.cn/task/

1、game
题目描述:菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗
题目思路:
下载获得一个exe游戏文件

拖入PE查看,是win32程序

丢到32位的IDA里,在函数名列表ctrl+f搜索main,然后进入main0函数F5反编译得到伪代码


结合第一步题意,当全部灯都亮起时,将出现flag。不难发现对应到代码就是8个if==1然后输出flag的部分。
于是就有了两种做法,一种是把sub函数的伪代码改成代码运行一遍。另一种就是玩游戏比如随便输个2,发现1号和2号和3号灯亮着,其他是暗着的,所以把对应的条件改成1,2,3==1,剩下的不等于1,再去玩游戏即可输出flag。
对于修改,不难找到汇编指令中的代码为如下,右键修补,将jnz(等于的意思)改为jz即可。具体反汇编指令网上都可以找得到。



最后在编辑,修补程序,应用到输入文件。再去玩游戏就可以获得flag啦。


2、open-source
题目描述:菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码
题目思路:
- 下载获得一片c语言文件。
不难发现,29行用三个argv参数计算flag,32行输出
- 对于三个argv参数,
第一个:不等于0xcafe就退出,那first=0xcafe
对于第二个,满足if条件就退出,那么第一个不满足的数就是25,second = 25
对于第三个,相等strcmp返回0,退出if条件,那argv[3]=“h4cky0u”
因此不难改出代码,把上面的都删了,对应变量设置成对应值然后运行即可。
3、simple-unpack
题目描述:菜鸡拿到了一个被加壳的二进制文件
题目思路:
- 获得一个文件,丢入PE中。发现:64位文件,upx壳

- 丢到64位IDA中,以二进制形式打开文件。
然后shift+F12 进入查找字符串界面,然后Ctrl+f查找flag,发现flag。

4、logmein
题目描述:菜鸡开始接触一些基本的算法逆向了
题目思路:
- 未知文件先PE一下,得到信息:64位文件,obj文件

- 丢到IDA64,将main函数反编译为C语言代码。

- 分析代码:
进入sub_4007C0)()
进入sub_4007F0();
最后sub_4007F0();
通过v4的计算代码,我们了解到flag的获取 因为v8, v7 v9 知道,所以不难写出代码。
5、insanity
题目描述:菜鸡觉得前面的题目太难了,来个简单的缓一下
题目思路:
- PE打开,32位文件

- 丢到IDA32正常打开,shift + F12搜字符串,ctrl+f搜flag。

6、python-trade
题目描述:菜鸡和菜猫进行了一场Py交易
题目思路:
- 获得一个pyc文件,pyc文件就是py程序编译后得到的字节码文件 (py->pyc)
可以在线pyc文件反编译:https://tool.lu/pyc/
也可以下载一个离线的:pip install uncompyle
- 分析代码:
flag进行encode函数中的操作,得到‘XlNkVmtUI1MgXWBZXCFeKY+AaXNt’
所以我们只需要反向操作一遍即可。
7、re1
题目描述:菜鸡开始学习逆向工程,首先是最简单的题目
题目思路:
- 先PE一下,32位

- 然后IDA32,反编译一下main函数

- 分析代码,可以看到,输入v9之后,与v5比较,判断我们输入的flag是否正确。分别进入if…else判断之后的输出。
追踪v5 进入ds:xmmword_413E34。 - 既然v5是个常量,那么肯定存在二进制中,所以01Edit直接打开搜flag和ctf,成功get flag。

8、Hello, CTF
题目描述:菜鸡发现Flag似乎并不一定是明文比较的
题目思路:
先PE一下,32位

然后IDA一下,main函数代码

分析代码:
代码的的36行处进行了一个字符串比较,如果v10的值等于v13的值会反馈一个success的输出。v13的值在第15行给出,因此需要知道v10是怎么处理的。
代码的第18行对v10进行了初始化,并在32行进行了拼接处理。分析26-35行的循环,其逻辑是:依次取出用户输入字符串的字符,将字符值的ascii码值转成16进制的形式拼接到v10中。
因此,若想令v10的值等于v13的值,需将字符串v13中的值两个一组,当作16进制的值,换算成ascii码并转成对应的字符即可。得到的结果即为flag,也是要输入的内容。
9、no-strings-attached
题目描述:菜鸡听说有的程序运行就能拿Flag?
题目思路:
- 先PE,32位

- 然后IDA,main函数代码

分析可知authenticate()函数储存着flag,进入函数
通过第10~13行代码,我们可以知道s2就是我们需要flag(ws为输入值)
回到authenticate()函数的汇编代码
通过第6~7行代码,我们可以知道eax储存着decryp函数返回的flag值,再保存到s2
decrypt函数
综上所述,我们需要的flag保存在eax中,因此我们可以将断点设置在decrypt函数处,单步执行后,eax保存着我们需要的值,再读取eax值即可。 - 进入GDB(Linux)
10、csaw2013reversing2
题目描述:听说运行就能拿到Flag,不过菜鸡运行的结果不知道为什么是乱码
题目思路:
- PE一下,32位。

- IDA32一下,main函数代码

- 分析代码:
双击 sub_40102A() 查看其反编译代码,发现返回值恒为零:
而对于库函数 IsDebuggerPresent(),若程序处于调试模式下,则返回值为非零;若未处于调试模式下,则返回值为零。显然,程序不处于调试模式下,即无法满足 if 语句的条件。
双击 sub_401000() 查看其反编译代码,目测是对以上乱码数据的解密函数:
综上,解题思路大致为:进入 if 语句块,跳过调试断点,并执行解密函数,最终弹框输出 Flag。 - 修改过程:
在主函数的反汇编窗口中,核心的语句块如下方框。
int 3 中断即为调试断点指令,需将其改为空指令 nop。
将 jz short loc_4010B9 修改为 jmp short loc_401096。
将 jmp short loc_4010EF 修改为 jmp short loc_4010B9。
改完之后,在编辑修补程序,输出到应用程序, 再执行,即可获得flag。

11、getit
题目描述:菜鸡发现这个程序偷偷摸摸在自己的机器上搞事情,它决定一探究竟
题目思路:
先丢PE,64位

再丢IDA,看main代码。

接着其中一些参数的值看一下
其中值得我们注意的是t的值,t的值应该是0x53+‘harifCTF{???}’,即SharifCTF{???}
因此,t很有可能是储存flag的数组。
分析代码:
代码整体上可以分为3个部分
1~11 变量定义初始化
12~20 定义flag值
20~34 flag值写入文件
因此我们只需要将第二部分复现,输出flag即可。
12、maze
题目描述:菜鸡想要走出菜狗设计的迷宫
解题思路:
PE,64位文件

IDA,main函数

代码分析:
解迷宫
起点(1,1),只能走0,要走到‘#’,找到路径右下右右下下左下下下右右右右上上左左
得到flag
相关新闻
- 2022-01-28 S32DS——PE调试器使用
- 2022-01-28 华硕M2N-MX SE主板如何进入bios设置
- 2022-01-28 华硕B85-A主板如何是通过bios设置u盘
- 2022-01-27 ltraISO 生成u盘启动盘后处理事项
- 2022-01-27 华硕P5QL-CM主板如何通过bios设置u盘
- 2022-01-27 微pe怎么安装原版win11 微pe安装原版
- 2022-01-26 win10 esd系统怎么用pe安装
- 2022-01-26 电脑系统装机教程图解(电脑装机
- 2022-01-25 非mbr怎么激活
- 2022-01-25 eprime安装教程
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
