flag{begin_and_end_re_and_you}
/*********TlsCallback_0_0/
这里的线程回调函数,将偏移值3 变成了 iv+=10,即变成了13
解密py
flag{D0nt_let_time_bo_so_cheap!}
去除花之恋
去花后的核心加密函数
66ccff#luotianyi#b074d58a 提交后错误!!!
就很奇怪,然后查了一下 洛天依 66ccff 等的含义(无语子)
然后才发现,要MD5后提交!!!
printf("If you are succeed, the flag is flag{md5(your input)}");
笑死!!!!!【没看到,还想着misc的思路去想,,,】
flag{d780c9b2d2aa9d40010a753bc15770de}
查到 Asp 壳,题目也有提示
找了几个工具都无法脱壳,只能尝试X64debug 脱壳,OD只能调试手动脱壳32 位
[X64debug 不太熟,直接硬逆,不手动脱壳]【下面程序,ida动调+断点跟进获得】
flag{x1hu@n_w0_4sp_ma??}
分析知道,获得四位密钥,即可解密程序
解密py
名称 地址Java_com_new_1star_1ctf_u_1naive_MainActivity_encry LOAD:Java_com_new_1star_1ctf_u_1naive_MainActivity_encry
ida 动态调试时,出现
模拟器为x86架构,而导出的.so程序是ARM架构的原因,只能附加真机,也就是手机和ida 配合起来远程调试
【但是这里比较麻烦,真机调试的话,手机需要root权限等好多限制】
那么重新导出X86架构的.so文件,就可以动态调试了,嗨,好多小时才搞定这个,直接麻了,但终于搞定了,舒爽。【这里是结合夜游安卓模拟器+ida附加调试】
动态调试获得 密钥 FALL,获得flag。
附上夜游安卓模拟器+ida附加调试方法:
如此就可愉快的使用 ida 开始 附加调试了!
下图,是动态调试后发现的一个小细节。静态分析时,我没有注意到!
最后一次处理时,data xor enc[0]
flag{n@1ve_luv_2you#ouo}
hint:
xss :
sql 注入
显然可以通过报错注入,得到flag
现在,已经知道数据库名,表名,列名。但是由于每次只能获得一条数据,且报错输出长度有限制。那么现在尝试,逐条报错注入获取flag.
在 wtf wfy_comments text 成功得到 flag
flag{Ju4t_m2ke_some_err0rs}
hint:
在php中每一次调用mt_rand()函数,都会检查一下系统有没有播种。(播种为mt_srand()函数完成),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以同一个种子下,随机数的序列是相同的,这就是漏洞点。
那么我们可以通过,种子生成的随机数来爆破,种子。那么就可以得到我们想要的序列。
借助题目给的工具。
guess=1202031004
显然是filter伪协议读取,但怎么绕过
改为
===> %252e%252e # 双重编码【获取失败】
如下,NewStar位置应该置于filter后,不影响语句功能,然后保证file中出现NewStar。
得到 rot13
rot13 解码得到flag
flag{66dde83c-b1db-4338-ad7e-32e9b986632d}
参考后,构建pop 链
如上所示pop 链分析清楚了。
最终得到flag:
flag{87fbd8ce-bc28-463c-9588-b207042b878e} Welcome to NewStarCTF, CTFers
查阅 DEBUG: object(stdClass)#1 (1) { ["users_user_by_pk"]=> NULL }
POST 方式提交的data数据是可控的!
// graphql
查询到所有信息【该API端点的所有信息】
得到关键类信息,但怎么利用查询呢!
结合题目泄露的源码的查询方式,进行Graphsql 查询!
flag{4a902c8e-a8b5-ecfb-bee3-d6419865647c}
直接 z3 求解key,即可得到flag
key= fallw1nd
flag{Zzzz333_Is_Cool!!!}
简单nop E8 去除花指令
main函数
分析知道 maze 16行 ,如下: * 起点 0 终点
maze: [注意,这里每选择一个方向,走到不能走【while() 那完成这项处理】]
flag{f71516bdf07abd7bc0668db9d6352364}
key===>{0x19,0x19,0x8,0x10}
这里分析可以知道是XXTEA加密,网上很多脚本,简单修改delta, 加密的移位处理即可得到flag。
例如下面:
flag{H0P3_U_L1k3_Th15_CUP_0f_TEa.}
结合题目,考点应该是 angr 的使用。
测试了好多,都没有用。但是题目显然就是考这个angr 符号求解,只能等Wp 看如何使用。
那还有其他解决方案吗?
z3 or 爆破解决:
只能尝试最后一种方案了:利用程序,获取flag。【分析程序可以知道,各个位置上的,输入与输出有一一对应关系,依据线性关系,获取每个字符,每个位置对应的输出,ida 手动patch 出一一对应关系 的数据,然后根据密文映射出flag】
下面是手动patch 出的映射关系表【不会写脚本,就勤能补拙吧】
flag{umm_I_ an't_calc_1t_@t_all} # 应该是数据问题,检查了一下,缺失字符
猜测 flag{umm_I_can't_calc_1t_@t_all} 正确!!!
【这里应该是patch 数据时,未断点正确造成,数据轻微有误!!!】
main 函数
一些c++ 的语法函数知识。
这是结合动态调试,获得的程序核心加密流程:
对以上分析出的程序流程,做逆处理即可:【这里静态分析也是很明了的】
flag{OTL_n0w_u_know_STL}
显然需要测试 waf 黑名单
经过一系列测试,发现waf 好多关键字!最终在舍友提示下,使用hackbar 自带的payload,实现rce
get flag
flag{29170b66-27fa-4863-9b2e-28f0fbd698c1}
强大的 hackbar
对绕过这些关键字,没啥思路。尝试堆叠注入!
但是,第一条数据不符合,需要排序,或者删除!!!
get flag
flag{Ju3t_use_mo2e_t2en_0ne_SQL}
测试知道是 hash 算法 是 sha1()。直接爆破,得到flag。
flag{Easy_Hash_And_Y0u_Solve_1t_Quickly!!}
查看异常处理块!
所以可以依据这个,直接生成出delta[] 数组,进行解密。
【也可以动态调试获得,每组delta[]数据值】
python 解密脚本
cpp 解密脚本
flag{44C3A7F112DA2BE728F451C5E2D09558}
从ps1中截取下列数据
得到如下:【显然就是核心加密逻辑了】
如上可以分析知道:
如上,key=[105,192,50,118,175,152,128,155,147,80,183,37,190,22,242,78]
AES 解密脚本
获得.xlsm后打开,发现总有弹窗!
找到 excel 宏,发现有东西
对上述流程进行解密:
flag{This_is_@_begin_about@hack}
jadx 逆向APK 文件
存在 X86 架构 .so 文件,那么程序是可以动态调试的。
先导出.so 文件进行静态分析
cheak 将输入进行 rc4 加密,然后与密文比较。密钥可以动态调试,decode()获得。
通过动态调试知道,程序获取输入后。将输入base64编码,然后RC4加密。
这里有个细节,rc4 算法被魔改了两个点:
可以看到,rc4加密时,先对数据 xor 0xc6。然后加密完成时,又对结果xor 0x73 然后才得到密文。因为这是RC4 加密算法。那么我们用常规rc4 解密出的数据 xor 0x73 xor 0xc6,就可以得到明文。
flag{QAQ_how2decode##pls_teAch_teVch_me!!}
查阅到上面感觉有关的链接,可以知道lumina是一种快速库识别和识别的技术。
如上一波搜索,可以明确知道mpz 是个数学库,那么分析程序流程的时候,黑盒测试就有了侧重点。
先ida简单分析一下
可以得到程序处理流程:
然后将v9与密文比较,也就是v13。
【注意:这里后面的三个表达式关系,需要动态调试。类似黑盒测试的方式得到,同时题目是mpz,可联想到gmp 数学函数库,会有一些帮助】
下面是黑盒测试的用例【用来分析函数功能】
分析清楚函数功能,开始解密:
flag{gmp_llllllllll111111111_int!}
参见上文:
查询足够多资料后,开始RCE【通过cd .. 逐步跳转到 根目录】
flag{bcba8204-fad9-4328-9072-afeafd94d764}
popen 绕过失败
尝试全hex 编码 ,数据构建脚本:
flag{903247b8-92e5-49c0-b40a-b69c2fe2db43}\
hint
可以上传图片,并会返回访问路径。
显然本题的考点就是 phar:// 反序列化漏洞了
生成phar 包后,改名上传,并获取路径。
可以看到已经成功,phar 反序列化利用了。但是还需要绕过验证
一番尝试后,发现回车"\r",与换行有相同作用,可以绕过,成功rce
flag{ba275b97-c9fe-4030-94a9-ef44a2dc3dc5}
main_
是个base64 加密:
这里值得注意的是,每次编码的时候,都使用源base64表移位获得。
所以,需要动调获得每次的移位值。
直接通过每轮移位值,进行变表解编码得到flag。
flag{12573882-1CF1-EB5E-C965-035B1F263C38}
一般有两种方案解决:
直接动调让程序自己运行恢复【题目有debug,动态调试需绕过】。
idc 脚本,直接修改也能得到。
这里使用第一种,动态调试得到正确逻辑!【这种比较简单,同时可以得到一些运行数据,更容易求出flag】
修改逻辑,绕过即可。得到正常函数:
加密逻辑,很简单:
flag{RC4_and_SMC_is_interesting!}
最后附上idc python:
【直接Shift + F2 运行脚本,优点是,也能得到调试获得的结果,且便捷;缺点是,运行的数据获取不到,需要自己求解】
处理方式就是动态调试【或者可以,自行计算出r15但显然比较麻烦】
这里对输入,有一次处理!
input 值在映射表中的位置,作为新值替代input:
映射表生成如下:
可以看到将输入 进行 移位 xor 操作【但是这里后面存在 jmp r15,所以需要查看汇编指令又进行了那些操作】
汇编跳转如下:
又进行了两次 移位 xor 运算:
【上面,移位4时,xor 0x7a,标注错了】
同时末尾,又xor input[i+1]。这里动态调试获得!
下面是密文比较: md5 ,加密小写提交
如上分析:就可以得到下面的加密流程: # 最后一轮 xor input[0]
先写出加密逻辑,进行测试:【与程序运行结果相同,说明分析正确】
测试正确:写出解密逻辑,得到flag。
解密py:
flag{d5658c0b4c44d4672d76b563a8505a66}
【这题或许可以,静态修改跳转逻辑,使其能够F5 反汇编,可能会容易很多,不然分析汇编代码,容易漏掉细节,耗时大】
特征很明显,是VM 类型题目。程序的加密逻辑是固定的,但是由于将其加密过程转化为未知 opcode 进行翻译。所以直觉上,运行规律是不可理解的。
那么现在就需要,将其opcode 码,转化为可理解的 伪汇编代码!!!
首先 用 idcpython 将 opcode dump出来:【动态调试 过程中dump】
指令长度 为 4:
opcode[0]===>运算类型 如 mov sub add等
opcode[1]===>细分运算类型 如 mov 的不同用法类别
opcode[2]、opcode[3] 操作数
print 出可理解伪汇编:
得到 伪汇编代码!
翻译后得到上面伪汇编代码,逐个解密得到flag!
数据一直不对,不断排查后,猜测是位处理的问题,程序中的字符是无符号整型:
u_int8_t 处理后【写了个c脚本还是错误!!!!】
魔幻的问题!!再试一次!!! 【还是不可以】
【不知道哪里出了问题,等WP吧!!!】
这里尝试将 .ll 转化为 .out 可执行文件。
Ubuntu 环境安装:
kali clang 环境: 【环境自带】
使用如下命令转换:
显然出题人,修改了!【避免这个解题思路】--->【当时做题的错误判断】
还是得分析.ll llvm 中间文件
【其实这里改为:
就可以很快将将ll中间文件转化为 可执行文件!!!,0x05 就是这种思路
【但当时本着学习的态度,没深究就直接学习llvm .ll 中间代码去了,也比较曲折】
Rc4 加密的分析:
魔改 Base64 分析:
对上面流程实现解密!
解密发现得不出flag!!!
排查之后,发现应该是rc4 也被魔改了!
rc4 就是加了一个 xor 89 的操作
现在梳理一下加密流程:
但解密发现还是不对,猜测可能原因是Rc4 前后两次加密,共用一次初始化的S盒,但第二次加密下标从0开始,且使用第一次Rc4加密后的S盒,这里显然是耦合的,显然只能写脚本解密,py调用模板肯定用不了!
写了个 c脚本,也无用!!!直接蒙蔽,,,
哪分析错了呢!,先缓缓,后面再来做!!!
后面又尝试以将中间代码转化为可执行文件的思路
导出task可执行程序后,ida分析elf 文件
发现,一直遗漏了一个细节!!!base64 编码是,第2、3是交换了位置的!
同时,多出2个字节的编码也有改动!【显然,对llvm 中间代码的分析还是有点马虎】【其他加密逻辑是分析清楚了的】
如下,再用C脚本解密得到:
flag{Hacking_for_fun@reverser$!q
【这里最后一字节,是'q'不是'}'的原因在于,base64 编码时,有个&0xf的操作,导致信息丢失,但由于只有一位也就不爆破了】
得到flag:
flag{Hacking_for_fun@reverser$!}
【注:这题学到了很多东西,对.ll中间代码语法摸了个小透,但由于base64 编码的小细节没注意到,导致做题时还是很曲折的,最后转化为可执行文件进行逆向才成功破案】
这次 NewStar CTF 2022 公开赛,体验很好。我回顾了很多Re方面的知识点,也学习到了一些新的东西。从Week2 开始参赛,直到 Week5 结束,主攻逆向题目,做了少量Web题。Re 题除了Week5 的 Virtual Self 没做出来,其他全部解出,这是十分鼓舞人心的,当然也算是一个不圆满的小遗憾了吧!【没能Ak Week2-Week5 的所有Re】。
最后对自己有一点小小(笑笑)的展望:希望接下来,能在中等难度比赛中有所突破【相对应的,也就是在逆向水平方面有所提高】!