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,完活。

posted @ 2022-11-24 13:56  N0t3  阅读(255)  评论(0编辑  收藏  举报