一次简单的逆向Go语言程序笔记-判断密码输入

先上这次要**的程序

一次简单的逆向Go语言程序笔记-判断密码输入

可以看到,这是一个很简单的输入密码的程序,然后判断该密码是否正确,并打印相应的字符串。

本次使用的逆向工具为IDA Pro。IDA可以把逆向的函数过程用流程图的形式表示,比较友好。

用IDA打开要**的程序,一开始会定位到main函数。首先我们使用一个讨巧的办法:检索程序中出现的字符串Password。但结果发现IDA并没有搜索到相应的字符串。那只能乖乖一步步加断点调试。随后会进入一个名为main_main函数的地方。

进入main_main函数,发现熟悉的字符:fmt_Println 。在调试中会发现该函数会打印我们程序中出现的字符串,即判断反汇编的main_main函数即我们源程序中的main函数。

继续往下调试,发现如下:

一次简单的逆向Go语言程序笔记-判断密码输入

非常熟悉的分支结构。不过这个分支结构有点特殊,里面有很多个嵌套,不过继续调试就会发现,Go语言编译该程序的时候在判断字符串是否相等的地方,会先比较字符串的位数(本程序中为6),然后比较这个字符串的前4个字符小端序的ASCII码(正是Go语言编译采用这种分拆+小端序的方式才使得我们的IDA无法检索到我们的Password字符串),然后再比较字符串剩下两位的字符,同样采用小端序。同学可以试试,把0x39393039换成ASCII字符即9909,0x3432即ASCII字符24。至此,密码已经**。

不过同学会问:那么“Password”这个程序中用到的字符串在哪里呢?我们看fmt_Println前面一点的地方有出现有关"main_static_tmp"的lea指令,双击"main_static_tmp",跳转到如下:

一次简单的逆向Go语言程序笔记-判断密码输入

再双击"byte_4D5A67", 跳转到如下:

一次简单的逆向Go语言程序笔记-判断密码输入

注意"dq 2064726F77737361h, 636572726F636E69h"这个地方,把这个值连同前面的50h和后面的74h会发现,这两个值就是Password Incorrect字符串的小端序ASCII码十六进制值。