划一波水,re1秒了,re2看起来挺有意思的就处理一下
main函数有一个花指令使得CreateFunction
失败
jmp跳到了自己指令的中间部分,NOP掉即可
然后重新在开头按P或者右键CreateFunction
就可以F5了
main函数里没啥好说的,这个花不去也无所谓,反正汇编也看得出来call 8048580
要返回1才可Correct
先看一下这个函数的CFG
比较像控制流平坦化或者说VM的效果
简单阅读了一下代码,发现它逐个取值,然后switch取出的值,并判断下标,如果不一致则直接return 0;否则对新的下标赋值并进行循环
跟以前见到的OLLVM中的控制平坦化有一些区别,似乎像在每次取值后又做了语句块的分发…
没有什么好的反混淆思路,简单扫了一下代码由于取值是逐字符的、并且当字符不符合要求时会直接return 所以可以直接上pintools
由于并没有对输入长度进行校验,所以并无法获知长度 于是只能逐字符硬干
这里存在一个多解的情况
当index=12时可以直接通过字符k来return 1,后可以接任意字符
当s[12]=‘6’时可以通过结尾字符’\n’来return 1
之后去队里讨论了下,pizza觉得应该视作虚拟机然后把每个handler搞出来,最后把自己输入的字符串视作机器码来求解
我觉得是个思路但不太好处理…因为对于这个题目来说handler大多都是一次性的,没有必要挨个去看_(:з」∠)等一个讨论