nbctf
0x01 py逆向
给了一个main.py和out.txt 的文件,打开分析一下
1 | import random |
然后手动调试一下前几项,很容易发现x 的组成是由w和n交替排列的,大概的规律就是
w34n33......w2n1w0n0w1n2......w33n34
根据output文件里的x的值,转码成十六进制
(0x)ea0149929a24de3a6ab642ebeaa16a02571f572449b67f1f57c4a4b67fc542027feb6a0eeaab4d9c42ab6a3e5124deab6a045724de244db69a16ea016ab6571f57a1a2fe4290
总共有70个字符,flag推算出是35位
根据这坨玩意写个抽象的脚本分离出w和n
1 | enc="ea0149929a24de3a6ab642ebeaa16a02571f572449b67f1f57c4a4b67fc542027feb6a0eeaab4d9c42ab6a3e5124deab6a045724de244db69a16ea016ab6571f57a1a2fe4290" |
代码有点乱,大概思路就是先把70个字符分成两部分,然后分别从左到右分离出下标奇数部分的n和w,下标偶数部分的w和n,然后把这些n和w排好顺序,分别交替输出得到n和w 的数组。
这个过程读者可以自行完成,我这个只是参考,而且感觉很慢。最后得到的_n和_w便是结果
(脚本里输出的n和w有些问题,分别多了一项和少了一项,笔者懒得去修正了然后手动修改了一下得到正确的n和w,然后这个_n和_w也是有些问题的,当时看题时把main.py里的下标是奇数时,n和w替换,看成了偶数时才替换,所以这里得到的_n其实是实际的w,_w是实际上的n,搞反了,不过万幸的是不影响后面的爆破,只要换一下就好了)
接下来把得到的n和w拿来爆破出c就可以组合成flag了,至福~
1 | key1=[127, 81, 241, 40, 222, 128, 45, 87, 27, 154, |
nbctf{cr15s_cr0ss_str4wb3rry_s4uz3}
0x02 sands
看介绍就知道是迷宫题目,打开ida分析一下
个关键的语句,和普通迷宫不同的是,这个迷宫会有‘S’,沙子没回合都会根据step移动来阻挡你的路线,如果沙子移动后正好和你的位置重合,会直接导致游戏失败(逻辑是沙子先动人后动),因为沙子撞人的判断是人移动后的,所以在这个迷宫中,只要你在沙子撞到你后移动走,也是能继续游戏的,这个是关键,知道这个小技巧后走迷宫就简单许多了。
比赛时为了节省时间可以省去不必要的东西,只保留关键的能帮助解题的判断语句,赛后我把迷宫完善了不少,已经能当做一个小游戏玩了。
1 |
|
这样很浪费时间,不过赛后无所谓了。
然后这题还要连一下官方给的靶机,在linux虚拟机里面的命令行打入
nc 【ip】【端口】
连接成功后ls罗列一下文件,cat可以查看文件
0x03 twostep
这个题的逻辑就是反复调用两个不同的函数,然后分块加密,函数1中有几个子函数,每个子函数加密一块,函数2同理,然后调用法则是函数1到函数2,函数2再到函数1,每次调用时step(计数器)+1,然后case不同的step分块加密,最后根据一个数组word_404090[]知道这个加密块在整体flag具体的位置
1 | #472036518 |
下面是步数step,上面是位置。
函数1
1 | __int64 __fastcall encry1(_BYTE *input) |
函数2
1 | __int64 __fastcall encry2(_BYTE *input) |
大概思路就是这样,剩下逐个攻破加密块,按照word_404090里一一对应的关系排列组合,就能得出flag了。(调试太痛苦了,最后不调试还不知道,摆了)