tctf-2019-re-Elements-wp
第一次参加正式的ctf,当然是以玩玩的心态去的,但是还是很认真地看了两道RE题,当时只做出来这一道。想想应该写一个wp,就现在补上吧。这也是第一次在论坛发帖,可能写得不太清楚,请见谅,有问题请指正进入main函数,先看第一段处理
可以看到这是一个字母转小写的代码
再看第二段
第二段开始的if语句很明显,输入的flag长度为0x2c,前几位是"flag{",最后一位是"}"
然后用strtok函数在"-"处截断,取前一段的字符进入while循环。并且这一段的长度得是12
这个while循环单看着看不懂,于是我动态调试了一波,dump出了由__ctype_b_loc()生成的数组,然后自己写了一个脚本看了下这个循环到底在干什么
这段代码的意思是flag中只能含有"a"-"f","0"-"9"这些字母,并且把这些字符转换成相应的值,也就是十六进制的数值。最后将他们分别放在每一位上,也就是说输入“123456789ABCDF”的话,最后v11的值就会是0x123456789ABCDEF
接下来是这段代码,实在是太晦涩了,我就用了动调的方式,用类似黑箱的方法,看最后生成的数跟之前的v11的关系
一调试就发现,这部分的作用是将v11的值转化为double量,就是将123转化为123.000
再看最后一段代码
这一段仍然是在while循环之中的,,所以先把前面的代码理一下
(这里的变量名我已经改过了,x是x,y是x,z是x,这三个数是先后赋值的)
综合来看,程序的流程是输入flag{xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxx},每一段都是12位十六进制数,它们分别代表三角形的三条边。其中第一次循环时v9的值为0,所以为了不退出程序,x的值必须是 62791383142154LL,也就是0x391BC2164F0A。之后两次循环因为v9的值不是0,所以没有其它条件就可以进入最后一段。
最后一段代码一看这个if语句就想到了三角形,x、y、z就是三角形的三条边。
仔细观察,这个v20实际上就是三角形的面积(三斜求积法)
v21是内切圆半径,v22是外接圆半径
最后v21的值要等于 1.940035480806554e13 ,v22的值要等于 4.777053952827391e13
所以这就是一个已知三角形最短边长和内切圆外接圆半径,求另外两条边的数学问题。放进mathematica跑一下
得到另外两条边长,所以第二段和第三段的值就知道了,flag也就确定了。
今天中午突然想起来应该写个wp,飞快地就写完了,欢迎大家来交流、指正 之前看到这道题猜到应该是三角形,数学公式匮乏没有想到接下来该怎么写,今天看了豁然开朗,thx~{:1_893:} 本帖最后由 幼稚园 于 2019-4-3 15:54 编辑
太空独角兽 发表于 2019-4-3 14:36
之前看到这道题猜到应该是三角形,数学公式匮乏没有想到接下来该怎么写,今天看了豁然开朗,thx~
这个三斜求积法查了很久才注意到,但其实不知道这些公式也没关系。把式子原样放到mathematica中跑一下也能直接跑出来,面积用海伦公式或者用这个三斜求积法实际上没有区别。下面放一下原样照抄题目的式子 太空独角兽 发表于 2019-4-3 14:36
之前看到这道题猜到应该是三角形,数学公式匮乏没有想到接下来该怎么写,今天看了豁然开朗,thx~
所以说有时候关键是要会用数学工具{:1_918:}。三角形什么的在这道题里感觉更多的是出题的思路,现在的数学软件解方程太方便了23333 现在CTF真的是越来越难了 数学功底不行的话还真做不出来 unixcs 发表于 2019-4-3 16:05
现在CTF真的是越来越难了 数学功底不行的话还真做不出来
另外一道fixed-point的数学是真的难XD,最后是CRC128("flag{xxx..xxx}") = xxx...xxx,我连CRC128具体是什么原理都搞不清楚 谢谢楼主分享学到了赞一个
{:1_893:}{:1_893:}{:1_893:} 本帖最后由 now4yreal 于 2019-4-26 23:51 编辑
楼主好,我在跑mathmatics的时候和你输入了一样的方程,为什么得到了奇怪的解,这个需要什么设置吗?E:\捕获.PNG
now4yreal 发表于 2019-4-26 23:43
楼主好,我在跑mathmatics的时候和你输入了一样的方程,为什么得到了奇怪的解,这个需要什么设置吗?
[/ ...
额额 我知道错在哪里了 谢谢楼主 本帖最后由 Timelife 于 2019-8-27 11:28 编辑
只逆出来前17Bit,后面真没想到是个三角形
页:
[1]