可以说,ciscn是我至今为数不多能做出题的比赛了23333菜的真实
0x00 easyGO
看名字是go语言和题目,用ida打开看看,wdm这函数数量,怕了怕了。首先运行,然后ida搜索字符串,通过交叉引用,找到主要逻辑,简单分析了一下发现还是有点复杂,还是上手gdb调试看看。
设置断点在提示输入的地方,然后开始运行。发现输入后过了不久,程序就取出一长串字符串。
猜测可能是目标字符串,需要与之进行比对。继续调试。
在经过函数0x47e620这个函数之后,flag已经解出来了。
0x01 bbvvmm
文件使用ida打开,发现主要逻辑还是挺明显的。输入用户名和密码,分别校验,对了就能登陆拿到flag,是有远程环境的。
用户名
通过逆运算,sub_400AA6是个换了表的BASE64加密,通过写解密代码,解得正确的v33应该为“EF468DBAF985B2509C9E200CF3525AB6”。
然后观察到sub_401738函数的参数都与输入无关,且v10要作为sub_4018C4的输入,则通过调试,直接得到v10的值为:
然后对于函数sub_4018c4,除了v13以外所有的参数都已知,所以可以推断出v13 的值。查看这个函数
通过分析,这个函数中只有sub_201362起作用,循环只经历了一次,相当于只进行了一次sub_201362操作。
目前已知v5,这样可以知道v14,v13,v12,v11的值,while循环的初值是s,v8,v9,v10,循环中函数是异或操作,于是我们可以通过反推得到函数的输入v3。
1 |
|
于是可以得到v3={0x36, 0x32, 0x36, 0x31, 0x36, 0x34, 0x37, 0x32, 0x36, 0x35, 0x37, 0x32, 0x33, 0x31, 0x33, 0x32};
这样我们得到v13的值,再进一步回推sub_4066c0,就可以到正确的输入。
可以发现是把一个字节扩展为两个字节的函数,而替换表刚刚的脚本已经一同打印出来了,通过比对,得到用户名为:’badrer12’
密码
密码部分是一个使用while循环实现的虚拟机,通过分析各个调用表的函数内容,得到的伪汇编代码如下(部分):
实现的功能是将输入与’x’,’y’,’z’,’{‘,’|’,’}’分别异或,然后把每次异或的结果异或,并且要求得到0,这样就说明密码就是’xyz{|}’。
最后远程需要借助pwntools,不然莫得回显
1 | #!/usr/bin/python |
0x02 总结
emmm国赛只会做两个逆向。。。其中一个还是调试得到。。。
不过对于虚拟机这样的题又练了手,之前一直觉得这类题好难,看不懂,其实主要是不够耐心(卒。希望在接下来的比赛中能多做几道逆向。。。不然太划水感觉都要被t出队伍了QAQ