QLNUCTF2024_Round2 Re方向超详细解题wp
前言:
希望大家多多复现,把这些题目都学会,不要辜负了学长的一片苦心
出题和写wp真的很费时间…….
大家加油!
C++是最棒的语言
考点:c++,异或
签到题,考点就是一个简单的签到,但是用c++写的,看起来有点头疼,其实也没什么啦,因为就一个异或9
至于其他的部分都是一些初始化和定义的部分,不需要看,也没有内置的函数,
可以直接拿赛博厨子秒了
当然自己随便整一个python脚本也是可以的!
exp
1 | string = "XEG\\rJ\"\"V8zV}a:Vk:z}Vehgn|hnlV8gV]alV^9{8mt" |
flag:QLNU{C++_1s_th3_b3st_language_1n_The_W0r1d}
Debug_me
考点:远程动态调试,rc4
本题是两个做法,动态调试法和直接逆向法
出题的时候就是想检测一下各位动调能力,所以只要成功动调起来了就送flag,这也是我的本意,至于rc4解法我还是卖了一个小坑的
动态调试法
断点就在最后小就行了,哪里都无所谓(前提是程序在调试的情况下会经过那个地方)
网上搜索一下IDA远程动调的步骤,远程开启linux_server64,本地选择remote linux debugger,选择然后直接启动就好了,这个程序在启动的时候会进行判断,判断当前是否是调试模式,调试模式的话就会直接给你flag,正常运行的话就是提示输入flag,直接秒啦!
动调具体细节看https://jiangwenwen066.github.io/2023/02/06/%E5%88%9D%E6%AC%A1%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95/ 或者看四节草的一个视频
分析函数解决rc4法
确实是一个rc4,但是大多数人可能不会直接得到结果,因为我对秘钥进行了一点小小的操作……(黑心出题人
定位到了加密函数,点进去看看,是定义了一个v2,一般来说这个v2就是key了,而且是一句我想给大家的话:调试是一个解决问题很好的方式!然后下面就是rc4_crypt函数了,参数分别是a1和v2,a1在刚刚的main函数可以看到,就是我们的输入,v2大概就是秘钥了
进去之后就得到了rc4的加密函数了,不用怀疑,没有魔改,就是正常的rc4,这个getkey就是生成秘钥盒了,可以进去看看秘钥确定一下秘钥是什么,这里传入的参数就是前面的那一句话:Debugging_Is_A_Great_Method_For_Problem_Solving
这里的坑就来了!a2的参数就是:Debugging_Is_A_Great_Method_For_Problem_Solving 是一个很长的字符串,但是在生成秘钥盒的时候却只索引了前9位,也就是Debugging,所以说,rc4的秘钥只有Debugging这一部分,然后就可以直接拿密文去赛博厨子解密了
也附上exp:
1 |
|
flag:QLNU{JusT_D3bu6_Me_1S_0o0O0Oo0K}
进击的小鸟(超详细版)
考点:花指令,关键函数定位,伪随机数,异或,pdb文件导入
游戏题,出的难度还可以,有很多种做法。
很多同学说游戏无法打开,报错说确实什么什么dll,这种报错要么就去网上找这样的dll然后放到文件夹里或者系统文件里,但是最好的方法是可以跟着我的文章配置下vs的c语言环境,这个是大家早晚都要配置,毕竟devc和vscode都不如vs好用,而且下载vs的时候可以顺便下载一些dll。解决了百分之九十的dll缺失问题。
重生之妈妈我要打CTF–简单的环境配置 | WenWenJiang’s Blog
本题由于函数较多,所以本出题人好心的把pdb文件也一起给你们了。 pdb文件就是存储着程序的一些符号表,通俗的说就是你们反编译exe的时候如果载入了pdb文件那么就可以看到我写代码的时候定义的函数名,而不是loc40086这样的(为了更方便你们找到getflag关键函数) 载入方法: 在ida反编译的时候出现下面这个弹窗的时候选择yes,然后找到题目文件夹选择给你们的pdb文件就行了。
接下来是本题目的两个解法,分别是ce修改器解法,和ida分析逆向法。
ida分析逆向法(希望你们学会
这个解法算是常规解法,ida反编译程序
main函数写的很简单,分别是开始,游戏,和结束三部分代码,
我写的关键的getflag函数在end里面
函数传入的参数是分数score
跟进进去这个函数,就发现出现了下面的这个情况:
这就说明ida在反编译出现了异常,当然,这里就是一个简单的花指令。
按tab键去看一下汇编部分,去一下花指令
花指令去除:
是一个很经典的jz,jnz无条件跳转
在花指令处按u键,将代码变成十六进制数据,可以看到原来的call爆红的地方变成了db 0E8H 即定义一个数据为0XE8 这里就简单讲一下花指令的原理,我们用户端定义了一个0xE8一个无用的数据,对整个函数运行,没有任何影响。但是0xE8这个数据如果要翻译成汇编代码的话,就是一个call指令,即跳转执行函数。所以在不影响程序运行的情况下,骗过了ida的反编译,让他以为这里是一个call指令(其实就是定义了一个junkcode,所谓的脏字节)
解决方法也很简单,右击nop掉这个0xE8就行,然后就变成了0x90(或者用keypatch把E8改成90也是一样的)因为90这个数据转化成指令的话就是空的意思,没啥用,所以改过来让ida知道这里不是call指令就行了
然后找到这个函数最上面的起点,点击函数的起点,来一套U C P连招,重新编译一下nop之后的代码(也就是还原之后的源原码)
这里解释一下什么是UCP
U:刚刚解释过了。就是把汇编代码全部变回数据的形式
C:就是U的反操作,把数据变回汇编代码
P:类似于f5的功能,就是把刚变回来的汇编代码重新编译成伪c代码(这里按f5也是一样的功能 这三个都是ida的快捷键,类似的还是N,H,R等等,大家可以了解一下 下面就是编译好的代码,可以直接f5看一下编译好了
代码分析:
我将代码分成了三个区域,分别在下面说明
1: 这块就是定义v7这个数组,用于后面做比较的
2: 这部分是一个srand()函数,和③部分的函数rand()配套使用 srand(1704038400)这个函数的意义就是把1704038400这个数字作为随机数的种子
3:
这部分就是根据②的srand()函数生成的种子来生成一个数组,长度是35位
在逆向的时候由于我们也知道种子,所以可以直接自己生成自己去生成数组v4,结果和这里的结果是一样的
4:
加密部分,其实就是两个数组异或。
解密开始:
首先先把用srand()函数生成的数组给生成出来
1 | #include <stdio.h> |
至于这里为什么要%256,因为ascll码范围是0~255 得到了数组后,再加上一个异或就可以了
exp:
1 | #include <stdio.h> |
flag:QLNU{The_f1ag 1s_@_littl3_bit_l0ng}
ce修改器破解法
这也是所有人的解题方法,下次可能不可能让你们这么轻松地ce修改了
可以直接用ce修改器去定位存储分数的地址,然后直接修改就可以了
ce打开这个游戏的进程(注意,不是exe的进程而且游戏的进程
先开局来一把零分,搜索一下为0的数值
然后拿到1分后点击再次扫码,找到这期间变化过的数值,还是很多,那就继续二分
差不多了,两个地方,一个是分数,一个是最高分,都双金修改数值50就可以了,注意关掉激活就行了(不然下次玩的时候得到的分数会覆盖修改之后的数值
然后就得到了flag
flag:QLNU{The_f1ag 1s_@_littl3_bit_l0ng}
keypatch、动调方法
这个方法是在ida分析的基础上,已经了解了代码的大致流程的情况下进行
可以看下重点的getflag函数:
出题人不算是特别阴间,拿一分就加密一分flag,而是事先就把flag给解密好,然后看得到了几份就给几位flag,所以直接下断点在解密flag的地方就可以直接看到完整的flag了,v7即是flag
或者也可以在这里下断点:第一个断点是在输出flag之前,用于修改a1的数值,第二个是输出结束之后,看结果的
a1就是getflag函数传入的参数,即分数,k是循环变量,我们只需要把k>=a1的条件给删掉(死循环)或者在这里用keypatch修改一下a1的数值就行了
改一下数,别太大,最好别99,容易崩溃。改成50就行了
然后一直按f8flag就一个个出来了 (后来我崩溃太多次,没截图了,这么做是可以的)
Drink a cup of tea
考点:tea加密
就是一个简单的tea加密,而且没有任何魔改,而且写的非常美观
v4[0]~v3[7]是密文,v7是key
多么经典的tea加密,甚至没有一点魔改
exp:
在re大纲的一篇文章的代码,具体的tea加密,xtea,xxtea可以看re大纲的文章
另外自己也有详细分析过一次xxtea魔改(真的很详细,GDOU的题目)
https://jiangwenwen066.github.io/2023/02/09/gdou_tea/
1 |
|
flag:QLNU{JuSt_JuNk_A_CuP_0F_T3A_tEa}