ACTF2023
type
status
date
slug
tags
summary
category
icon
password
强度巨高在打,但是赛中算没出题hhhh5555555,复盘以及复现一下
tree
赛中最接近出的题
直接打开看行为可以发现它不解析
#include
头文件,会给你编译一个cpp代码初步观察可以看到三个check,全过可以从server返回flag
查找字符串,一开始以为是模仿的gcc编译器,但是问学长说不像(这里就缺乏经验了已经,问的时候学长就说先看是啥的编译器,自己调了很久也没有去想)字符串发现是clang
源码非常复杂,而且有很多handler的结构,导致函数调用往往是跳转表,这里一定得恢复符号(后面check3不恢复符号几乎没办法分析,相反能恢复符号就好做)
check1有一个
== 25
,这里其实很容易测试,这里会计算符号的优先级,直接从最高等级的* /
视到低等级的比较条件运算符,等级越低数字越大,然后就测到 += 1
可以让check1 + 1,其它会减一,所以最后的结构里面 += 1
比其它的多一即可然后有这个函数(这里已经恢复了符号表):
这里会捕捉一个名为
AAA
的class我们要让我们的结构通过这里的check:
(这部分都是当时猜的,然后也没有去恢复符号表了)
然后多虚函数继承就过了这里的check2
下午四点就过了check2,本以为形势一片大好,结果游戏才刚刚开始,check3做到早上四点,没救
小折腾了一下,直接搞了个clang15.0.4给bindiff进去,但这里当时是看不到的,而且直观上会往这里面看
总之这里一直边调边猜(现在看看这个凌晨两点的记录有些消愁了,但是确实调了几个小时没进展,各种玩意也在反复试)
晚上的时候放出hint:需要看一下
ast_matcher
相关,然后我们一直在找已有的符号以及字符串不料其实不是这样,应该自己搞一个
ast_matcher
的api调用,再bindiff进去,就好看了这部分已经是赛后做的了(小问了一下出题人)
自己把clang安了,然后编译一个这个(这个会匹配
for(int i=1;i<2;i++){}
)然后bindiff进去,结果:
对照自己编译出来的loop_printer,就好搞多了
<
和++
的匹配点比较明显这里一开始一直找不到比较的数字,然后发现会写在栈上:
前面的
++
和<
比较容易识别,就是这里的数字有点难找,然后注意这里的"1"和"2"和"f"是一样的,只是一个符号,相当于没有实际意义
匹配上check3以后,把check3=5构造一下,把check1抵消一下,得到最后的payload:
发给服务器远程也是可以通的(没截图),没问题了
这题有一个很麻烦的点,第三个check必须恢复符号表,否则根本看不出来它是匹配的符号还是自定义的符号名,前两个check中间过程比较清晰,好猜些,第三个的中间比对过程相当难看与抽象,甚至最后一个数字我还找了好一会
上一篇
常见逆向加解密整合
下一篇
mac环境配置
Loading...