一个go语言crackme分析

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

内容简介:一个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 的坑,以后会长记性了。


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

查看所有标签

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

深入理解 Flask

深入理解 Flask

[美]Jack Stouffer / 苏丹 / 电子工业出版社 / 2016-7-1 / 79.00

Flask 是一种具有平缓学习曲线和庞大社区支持的微框架,利用它可以构建大规模的web应用。学习上手Flask非常轻松,但要深入理解却并不容易。 本书从一个简单的Flask应用开始,通过解决若干实战中的问题,对一系列进阶的话题进行了探讨。书中使用MVC(模型-视图-控制器)架构对示例应用进行了转化重构,以演示如何正确地组织应用代码结构。有了可扩展性强的应用结构之后,接下来的章节使用Flask......一起来看看 《深入理解 Flask》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试