2020-36DCTF
easyre
IDA打开是下面这个样子
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
很简单,写个脚本就出来了,签到成功
1 | target = [102, 109, 99, 98, 127, 58, 85, 106, 57, 82, 122, 55, 81, 19, 51, 35, 67, 70, 41, 61, 41, 32, 127, 28, 38, 77, |
神光
IDA打开,根据提示语找到关键函数
1 | int __usercall sub_415C10@<eax>(int a1@<xmm0>, int a2@<ebx>) |
输入key之后在下面的函数里进行验证
1 | int __usercall sub_415B10@<eax>(int a1@<xmm0>, char *input1) |
输入的key
应该是wangzherongyao
1 | int __usercall sub_415770@<eax>(int a1@<xmm0>, int a2@<ecx>, int a3@<ebx>, int a4@<esi>, char *Str) |
下面的处理就是把key求和赋值给v15
,然后将内容中的数组逐项与v15
相加然后异或
1 | int __usercall sub_415970@<eax>(int a1@<xmm0>, int ebx0@<ebx>, int a3@<edi>, int a4@<esi>, int target) |
之后就是每9位一组,把得到的字符串重新排序然后输出,但是没有这么轻松,输出的是乱码,因为用来异或的数只有在TLS
回调函数里面用到了,如果正常运行的话应该是0,并没有什么意义,所以很显然这题只要调试一下输出的应该就是真正的flag,OD装了hidden
忘了关掉,调试了一次发现输出还是乱码,干脆直接算出这个数
1 | step1 = "wangzherongyao" |
BBBigEqSet
打开发现函数很大,有很多式子,无脑z3
必定跑不出来,下面只截取了一部分
1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
观察一下很容易发现,这就是个简单的矩阵乘法,算AX=b
,解起来很轻松,但是数据是在太多了,只能写脚本处理一下,本着简单使用的原则,把所有的数字找出来然后提取大于515的部分,就是所有用到的数,观察一下发现每一个处理变量的位置都是不变的,所以对应的数据的位置也是不变的,所以按照顺序提取一下就行了,最后再调整一下顺序就出来了
1 | import re |
本来没想到这题这么简单,放假玩了一天晚上睡前才看了一眼,错过一血,错亿
Comments