1. BabyC++
Shift+F12 一眼出
2. ez_pyc
好多wp里直接反编译出了源码,md5都能直接看见……我用的一样版本的uncompyle6但是没有这样的效果
这种事情也没法强求,老老实实逆吧
程序是一个数独,我实在没看出来……
首先看到一个9*9的棋盘,上面有一些数字
019000307
800000000
400000200
000030000
500060020
070000031
000000000
008090700
000000000
然后要输入一些16进制数转化为整数,范围是1-9。不符合的话指针就会飞到一个莫名其妙的地方,触发指针越界,异常处理导致退出。
转化之后填入0内,指针一行一行从左往右移动
这部分应该是检查每行、每列是不是都有1-9
这部分就是对3*3的九宫格进行遍历,检查数字1-9。为了排除多解,增加了一个md5校验的部分(有的队反编译出md5这里显示的是flag……奇了怪了)
所以这是一个解数独的题目
2548656723194376198518245679931748649825721856943342156965374812
flag{6320870e5352469014668584c7f3229334e22689b45a64f926b5c}
强烈吐槽一下这个数独多解,而且多解不是一个两个
跑了几十分钟,有8166944个解
3. SweetTofu
字符串定位
静态分析跑不了,所以只能动调
这个地方F7进去,得到加密部分
#SweetTofu wp
enc = [ 0x00, 0x0A, 0x07, 0x01, 0x1D, 0x3F, 0x09, 0x13, 0x39, 0x07,
0x08, 0x02, 0x39, 0x2F, 0x39, 0x21, 0x09, 0x02, 0x41, 0x15,
0x39, 0x25, 0x14, 0x03, 0x07, 0x12, 0x0F, 0x09, 0x08, 0x47,
0x22, 0x09, 0x08, 0x41, 0x12, 0x39, 0x04, 0x03, 0x39, 0x15,
0x03, 0x14, 0x0F, 0x09, 0x13, 0x15, 0x47, 0x1B]
flag = ''
for i in enc:
flag += chr(i^0x66)
print(flag)
#flag{You_and_I_God's_Creation!Don't_be_serious!}
4. ArtBreaker
最大节点数改成99999
使用了Artfuscator的C编译器
GitHub - JuliaPoo/Artfuscator: A C compiler targeting an artistically pleasing nightmare for reverse engineers
5. Battle City
IDA分析有点费劲,还是rust编译的
关卡文件是ldtk文件,ldtk是一个2d游戏编译器
尝试把敌人都删掉了,发现进不了下一关,可以用水把它们卡在一起
每个关卡都用这个思路改一下,通关后得到
SICTF{Y0u_@Re_bat71e_C1ty_Ma5t3r}
6. Closeme
main的第一个函数跟进去
有一个疑似对资源进行解码的异或(注意&0xff防溢出)
#Closeme wp
v44 = [ 0x23, 0x11, 0x0D, 0x1B, 0x13, 0x4B, 0x18, 0x04, 0x03, 0x0A,
0x50, 0x08, 0x1D, 0x06, 0x54, 0x16, 0x1A, 0x18, 0x0B, 0x1C,
0x5A, 0x0F, 0x14, 0x18, 0x5E, 0x12, 0xE5, 0xF2, 0xF1, 0xE2,
0xE3, 0xE0, 0xE4, 0xE8, 0xF0, 0xA9, 0xE8, 0xF2, 0xAC, 0xEE,
0xE2, 0xE6, 0xF3, 0xFA, 0xB2, 0xF3, 0xCD, 0xF0, 0xE5, 0xF7,
0xB8, 0xF6, 0xE8, 0xBB, 0xFC, 0xD3, 0xF1, 0xFF, 0x8C, 0x81,
0xCB, 0xD7, 0x84, 0xD2, 0xCF, 0xCB, 0xC4, 0x89, 0xC8, 0xCE,
0x8C, 0xDE, 0xDA, 0xC0, 0xC2, 0xD4, 0xD6, 0x9D, 0x94, 0xFF,
0xC3, 0xC4, 0xCC, 0x99, 0xD9, 0xD3, 0xD3, 0xD2, 0xCD, 0xDA,
0xE0, 0x98, 0xA7, 0xB0, 0xEB, 0x8B, 0xA9, 0xEF, 0xF9, 0xE6,
0xFA, 0xE2, 0xEC, 0xA4, 0xA0, 0xEF, 0xB1, 0xF1, 0xB1, 0xB6,
0xA6, 0xA1, 0xB7, 0xBE, 0xB6, 0xF9, 0xB5, 0xA9, 0xB8, 0xB8,
0xAC, 0xFF, 0x97, 0x89, 0x8B, 0x80, 0x8C, 0xC5, 0x8F, 0x94,
0xC8, 0x9D, 0x82, 0x8E, 0xCC, 0x8B, 0x82, 0x8E, 0x97, 0xDD,
0xD2, 0x80, 0x81, 0x96, 0x9E, 0xD7, 0x99, 0x8A, 0xDA, 0xCB,
0xCD, 0xCD, 0xCE, 0xCE, 0x31, 0x31, 0x32, 0x2D, 0x24, 0x55,
0x6A, 0x62, 0x69, 0x7A, 0x6F, 0x2B, 0x7F, 0x78, 0x6C, 0x62,
0x79, 0x65, 0x32, 0x75, 0x78, 0x74, 0x71, 0x37, 0x6F, 0x71,
0x73, 0x78, 0x74, 0x3D, 0x6A, 0x77, 0x45, 0x01, 0x44, 0x4C,
0x56, 0x48, 0x47, 0x53, 0x08, 0x45, 0x43, 0x40, 0x49, 0x0D,
0x4E, 0x7C, 0x79, 0x72, 0x66, 0x75, 0x4F, 0x05, 0x07, 0x07,
0x08, 0x08, 0x0B, 0x0B, 0x0C, 0x40, 0x5E]
hint = ''
for i in range(len(v44)):
hint += chr(v44[i] ^ (i+102) & 0xff)
print(hint)
#Every time you close the messagebox by click `Yes` or `No`, it will be stored. Just choose Yes/No(1/0) in a certain order which is the flag, such as 01001100. Please submit flag which the format like `SICTF{01001100}`
解出来得到一段hint,flag的输入是通过是否的点击表示的。
回到上面
这里应该是在创建弹窗
v20存储输入的是1还是0,v61用来计算长度,共16位
v60实际上是指向flag地址的指针,LABEL_4把每一位flag依次存入v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,IpWindowNmae,v73,v54, v55,v32,v33
这里很复杂,似乎是转十进制的一个操作,实际上输入的1和0构成的是十进制,逆序之后按十进制存储
静态分析比较麻烦,这里我是动调
先利用点击是否进行输入,输入存储在v60里面,对着地址d几下就得到存储的偏移地址
比如说输入1010 1010 1010 1010
断在这里,查看v52
看起来很奇怪,实际上是小端序存储的十六进制数
输入进行了逆序
中间的算法实在看不懂,直接到判断这里看一看
取的高16位,1010 1001 1111 0001,应该经过了某种加密,大概率只是位置调换,不过只有两个数字,有点难看出来
输入1010 1001 1111 0001,动调得到63E5 0000
1010 1001 1111 0001逆序是1000 1111 1001 0101,对比密文勉强能看出来最后两位扔到前面去了
那么还原一下输入就应该是1010 1001 1111 0001前两位放到最后面(1010 0111 1100 0110),再逆序(0110 0011 1110 0101),也就是
SICTF{0110001111100101}
7. virus-?n?lys1s
32位的易语言程序
直接反编译啥也看不出来,后来才知道易语言有压缩壳
7.1. 第一问
免杀根本没学过,就随便看看吧。
白加黑就是通过DLL劫持在应用程序的导出目录中通过创建一个DLL并通过LoadLibrary函数(或者找一个已有的DLL注入恶意代码)来加载DLL文件。当目标尝试执行该文件(注意:不是执行受恶意的DLL文件)时,这个白文件会在应用程序加载时加载恶意的DLL。目标只要加载包含恶意代码的文件,攻击者就可以访问目标计算机了。
7.2. 第二问
Nw8f6里面看到对一个网址的请求 google
,就是第二问答案了
010Editor看里面有没有PE文件
搜索DOS字段,发现PE文件头的特征
把这之后的数据复制下来新建一个十六进制文件,发现可以用dnspy打开了。
(这里如果虚拟机不走代理,会没有办法继续动调,可以把Nw8f6改一下保证它只会返回ok)
7.3. 第三问
虽然尚不清楚这个函数是怎么找到的,但是这里的16字节数组应该就是密钥
在这里下断点动调一波
密钥有了:0x264C7298BEE400000000000000000000
7.4. 第四问
要动调到这个位置, ArgenTINA.dll
7.5. 第五问
wyt.exe
微步云沙箱可以扫出来(这里用的是修改过网络判定OK的版本)
7.6. 第六问
(这里用的是网络判定OK未修改的版本,就是刚提出来的PE文件),动态IP所以和官方wp可能会不一样
(甚至能看到第二问的网址)