Gogogo程序逆向分析
拿到题目后,上调试器一看,傻眼了。
这一看,不一般啊,搜搜字符串看看
一看这字符串存储方式和上面鲜艳的”GODEBUG”字符串,推断是golang写的。不怕,IDA 7.6已经能够识别golang程序了(标准库之类的)
上ida
Ida已经很轻松的识别出来了。我们继续往下看发现一个名为main_encode的函数,双击进去,按F5查看一手伪代码
我们看到有个 if ( v1 != 36 ),猜测是判断flag长度的,我们选中这一行按F2下断,直接就是一手调试,上面那个No Debugger的选择框,选择Local Windows Debugger
然后点击运行图标, 随便输入个flag
好吧,果然是判断flag长度,需要36个字符,随便输入一下
我们构造一个36字符长度的字符串作为flag
DEADC0DEDEADC0DEDEADC0DEDEADC0DE1122
重新调试,输入flag,然后一路f8
看到这个for循环,发现它的循环次数正是0x24, 也就是36
把i除以2取余数,如果i为奇数,则余数为1,如果是偶数,则为0
qword_77C588为2 如果获取的这个余数大于等于2,程序直接panic(恐慌, golang和rust语言以至于linux内核都有这个概念)
然后就是main_key上面给赋值了一个”go” main_key本身是个char类型指针+上取的余数(不是0就是1) 所以取出来的不是’g’就是’o’然后对我们输入的flag每个字符进行异或。
下面最关键的判断就是if(v14[v8] != v10)直接panic
由此我们可以推断: v14里存储的应该是作为密钥之类的
我们要逆推出key来,假设我们让v14[v8] (这个v8就是i) == v10
那么 v14[v8] = *(v9 + main_key) ^ v7
这个v7又是我们输入的flag,我们设它为x
那么方程为:
v14[v8] = *(v9 + main_key) ^ x
X = *(v9 + main_key) ^ v14[v8]
这样,我们就能推算出flag了
我们先把v14给扒下来
注意,此处v14数组元素个数并不是10, 因为我们v8作为i而且我们要循环36次,双击这个v14
然后numlock + *键
数组大小输入36,点ok
拿到代码里
然后根据我们的方程,进行一个推算
运行,得到flag为: bf680e24-8b82-43cd-ba2a-d072f4c8bfca
直接在题上输入flag
Ok,完活。