一个go语言crackme分析

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

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

一个 go 语言crackme分析

by anhkgg(公众号:汉客儿)

2019年2月23日

0x01.先看看

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

一个go语言crackme分析

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

查个壳,是 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 ,输入刚才解码的口令以及 uid 的 hash ,先直接F8跳过。

一个go语言crackme分析

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

一个go语言crackme分析

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

输入口令=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 的坑,以后会长记性了。


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

查看所有标签

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

React Native:用JavaScript开发移动应用

React Native:用JavaScript开发移动应用

【美】Truong Hoang Dung(张皇容) / 奇舞团 / 电子工业出版社 / 2015-9 / 65.00

React Native是当前移动端开发中的优秀解决方案。《React Native:用JavaScript开发移动应用》围绕着如何将一个完整App提交到App Store,讲解了使用React Native开发iOS应用所涉及的方方面面。首先介绍了Flexbox布局,教大家从零开始搭建一个初始应用,以此阐明React Native的基础运行机理;然后介绍了Flux的设计思想,怎么理解和使用Pro......一起来看看 《React Native:用JavaScript开发移动应用》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码