一个go语言crackme分析

栏目: Go · 发布时间: 5年前

内容简介:一个go语言crackme分析by anhkgg(公众号:汉客儿)2019年2月23日

一个 go 语言crackme分析

by anhkgg(公众号:汉客儿)

2019年2月23日

0x01.先看看

直接运行看看,尝试输入,看看结果。

一个go语言crackme分析

一个console的程序,有提示信息,入手点应该很明显,找字符串,或者 printfscanf 之类的函数。

查个壳,是 tElock 1.0 (private) -> tE! * ,没脱过,常规脱壳方法尝试弄不掉,百度一番看到挺多经验分享的,但都是 0.9x 版本的分析,不适用于本版本,那就放弃脱壳了。

一个go语言crackme分析

OD加载后直接运行,通过字符串搜索去查找,并未找到提示信息“口令解码失败”。

尝试再命令窗口输入 bp printf ,然后F9,OD断下,此时参数如下,OD并没有解析出中文字符,用 工具 查看一番,发现是UTF-8编码。

一个go语言crackme分析

所以前面OD解析“口令解码失败”编码问题,搜索不到。再次尝试进入内存 (M) 窗口, Ctrl+B 后在 HEX 输入字符的 UTF-8 编码,然后搜索,果然找到了。

另外找到一篇讨论 OD 编码问题的文章,有兴趣的可以看看:https://bbs.pediy.com/thread-181118.htm

一个go语言crackme分析

不过此处也没什么用了,因为 bp printf 也能找到关键代码。

在输入 uid 和口令之后,在 printf 断下,查看此时调用堆栈。

调用堆栈
地址       堆栈       函数过程 / 参数                       调用来自                      结构
1104BE80   00461BBD   <jiubugao.printf>                     jiubugao.00461BB8
1104BE84   1104C160     format = ""
1104BE88   110101B0
1104BEA4   004635DD   jiubugao.00461AD0                     jiubugao.004635D8
1104BEC4   00462FA1   jiubugao.004635A0                     jiubugao.00462F9C
1104BEF8   0047BA5A   包含jiubugao.00462FA1                   jiubugao.0047BA58
1104BF28   0047BAF5   jiubugao.0047B9F0                     jiubugao.0047BAF0
1104BF4C   0048C220   <jiubugao.printf>                     jiubugao.0048C21B
1104BF50   1104BF9C     format = "?J"
1104BF54   00000001
1104BFCC   0042609A   包含jiubugao.0048C220                   jiubugao.00426098

此时做了一番思考,作为 console 程序,整个代码都在 main 中完成,可能大概代码结构如下:

int main() {
printf("【春节】解题领红包之三\n");
printf("请输入您的吾爱破解uid:);
scanf("%s", &uid);
printf("请输入您的口令:);
scanf("%s", &code);
if(check(uid, code)) {
printf("口令解码失败");
} else {
//
}
}

那么通过调用栈回溯到 mian ,真个代码结构就会很清楚了,算法分析也应该会更简单。

OD 中回溯直到 0048C220 看到结构类似上面猜测的代码,然后dump出来,通过 IDA 查看确认了一下,应该没错了。

一个go语言crackme分析

分析算法

开始分析算法,通过 OD 调试确认,前面一部分都是输入输出相关代码,直接跳过。

直到看到下面几个特征,明显看出是hash算法相关特征了,一番搜索之后确认之后是 sha1

一个go语言crackme分析

调试结果和py计算结果一致,将输入的 uid 通过 sha1 算法得到一个hash值。

一个go语言crackme分析

看到这个特别的返回值方式,以及字符串中这种 xxx.go 的字符,我才意识到这是一个 go 语言写的程序。

一个go语言crackme分析

继续检查输入的口令长度,小于 0x10 则输出”口令解码失败”。

输入长于 0x10 的口令之后,重新开始,然后看下一个函数。看到这个 ABCD...+/ 特征,很明显就是 base64 编码,第一个反应是把口令编码。

一个go语言crackme分析

结果发现并不是我想的那样,结果如下。

一个go语言crackme分析

看到输出”口令解码失败”意识到这可能是 base64 解码函数,生成一个 base64 编码字符输入尝试一下。

一个go语言crackme分析

>>> base64.b64encode('1234567890')
'MTIzNDU2Nzg5MA=='

果然,调试中看到解码正确。

一个go语言crackme分析

继续往下走,到 48BC80 ,输入刚才解码的口令以及 uidhash ,先直接F8跳过。

一个go语言crackme分析

程序异常提示出一些信息,可以看出这个在 AesDecrypt 的时候出错。

一个go语言crackme分析

所以意识到 48BC80AES 解密算法。那么输入的口令结构应该是这样的才能解密成功。

输入口令=Base64Encode(AesCrypt(口令,sha1(uid)))

找了一段 aes 加密的 python 代码,构造一个口令,如下:

python aes.py
kJgRdtADqzjDKXiHHr770g== 11111111

在口令出输入 kJgRdtADqzjDKXiHHr770g== 之后,再次尝试,果然解密成功。

一个go语言crackme分析

继续往下,看到判断解密的口令长度是不是 0x1A ,如果不是则错误。

一个go语言crackme分析

所以加密前口令长度应该 0x1A ,先修改标志让OD正常继续执行,到 402000 ,三个参数,解密后口令, HappyNewYearFrom52PoJie.CnLine Islands Standa ,以及口令长度,很明显是一个字符串比较函数。

一个go语言crackme分析

结合长度限制 0x1A ,那么口令应该是 HappyNewYearFrom52PoJie.Cn ,用 python 加密后输入尝试一下。

python aes.py
9D7boJcaCbENFCpf6YRBmJFZjPsPyUot8sHdR5YTChw= HappyNewYearFrom52PoJie.Cn

果然成功。

一个go语言crackme分析

彩蛋

最后已经完成了,我用 IDA 打开了原始程序看一看,没想到看到了这个。

一个go语言crackme分析

IDA 完全支持 go 语言 IDL 符号解析,然后最开始 PEID 查的啥壳啊,完全是忽悠人的。

所以如果刚开我就用 IDA 来分析这个代码,是不是更快呢!

第一次分析 go 的坑,以后会长记性了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

禅与摩托车维修艺术

禅与摩托车维修艺术

(美)罗伯特·M.波西格 / 张国辰 / 重庆出版社 / 2011-9 / 36.00元

在一个炎热的夏天,父子两人和约翰夫妇骑摩托车从明尼苏达到加州,跨越美国大陆,旅行的过程与一个青年斐德洛研修科学技术与西方经典,寻求自我的解脱,以及探寻生命的意义的过程相互穿插。一路上父亲以一场哲学肖陶扩的形式,将见到的自然景色,野外露营的经历,夜晚旅店的谈话,机车修护技术等等日常生活与西方从苏格拉底以来的理性哲学的深入浅出的阐述与评论相结合,进行了对形而上学传统的主客体二元论的反思,以及对科学与艺......一起来看看 《禅与摩托车维修艺术》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换