内容简介:一个go语言crackme分析by anhkgg(公众号:汉客儿)2019年2月23日
一个 go 语言crackme分析
by anhkgg(公众号:汉客儿)
2019年2月23日
0x01.先看看
直接运行看看,尝试输入,看看结果。
一个console的程序,有提示信息,入手点应该很明显,找字符串,或者 printf
, scanf
之类的函数。
查个壳,是 tElock 1.0 (private) -> tE! *
,没脱过,常规脱壳方法尝试弄不掉,百度一番看到挺多经验分享的,但都是 0.9x
版本的分析,不适用于本版本,那就放弃脱壳了。
OD加载后直接运行,通过字符串搜索去查找,并未找到提示信息“口令解码失败”。
尝试再命令窗口输入 bp printf
,然后F9,OD断下,此时参数如下,OD并没有解析出中文字符,用 工具 查看一番,发现是UTF-8编码。
所以前面OD解析“口令解码失败”编码问题,搜索不到。再次尝试进入内存 (M)
窗口, Ctrl+B
后在 HEX
输入字符的 UTF-8
编码,然后搜索,果然找到了。
另外找到一篇讨论 OD
编码问题的文章,有兴趣的可以看看:https://bbs.pediy.com/thread-181118.htm
不过此处也没什么用了,因为 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
查看确认了一下,应该没错了。
分析算法
开始分析算法,通过 OD
调试确认,前面一部分都是输入输出相关代码,直接跳过。
直到看到下面几个特征,明显看出是hash算法相关特征了,一番搜索之后确认之后是 sha1
。
调试结果和py计算结果一致,将输入的 uid
通过 sha1
算法得到一个hash值。
看到这个特别的返回值方式,以及字符串中这种 xxx.go
的字符,我才意识到这是一个 go
语言写的程序。
继续检查输入的口令长度,小于 0x10
则输出”口令解码失败”。
输入长于 0x10
的口令之后,重新开始,然后看下一个函数。看到这个 ABCD...+/
特征,很明显就是 base64
编码,第一个反应是把口令编码。
结果发现并不是我想的那样,结果如下。
看到输出”口令解码失败”意识到这可能是 base64
解码函数,生成一个 base64
编码字符输入尝试一下。
>>> base64.b64encode('1234567890') 'MTIzNDU2Nzg5MA=='
果然,调试中看到解码正确。
继续往下走,到 48BC80
,输入刚才解码的口令以及 uid
的 hash
,先直接F8跳过。
程序异常提示出一些信息,可以看出这个在 AesDecrypt
的时候出错。
所以意识到 48BC80
是 AES
解密算法。那么输入的口令结构应该是这样的才能解密成功。
输入口令=Base64Encode(AesCrypt(口令,sha1(uid)))
找了一段 aes
加密的 python
代码,构造一个口令,如下:
python aes.py kJgRdtADqzjDKXiHHr770g== 11111111
在口令出输入 kJgRdtADqzjDKXiHHr770g==
之后,再次尝试,果然解密成功。
继续往下,看到判断解密的口令长度是不是 0x1A
,如果不是则错误。
所以加密前口令长度应该 0x1A
,先修改标志让OD正常继续执行,到 402000
,三个参数,解密后口令, HappyNewYearFrom52PoJie.CnLine Islands Standa
,以及口令长度,很明显是一个字符串比较函数。
结合长度限制 0x1A
,那么口令应该是 HappyNewYearFrom52PoJie.Cn
,用 python 加密后输入尝试一下。
python aes.py 9D7boJcaCbENFCpf6YRBmJFZjPsPyUot8sHdR5YTChw= HappyNewYearFrom52PoJie.Cn
果然成功。
彩蛋
最后已经完成了,我用 IDA
打开了原始程序看一看,没想到看到了这个。
IDA
完全支持 go
语言 IDL
符号解析,然后最开始 PEID
查的啥壳啊,完全是忽悠人的。
所以如果刚开我就用 IDA
来分析这个代码,是不是更快呢!
第一次分析 go
的坑,以后会长记性了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- R 语言 3.5.3 发布,统计分析语言
- Go语言的前景分析
- 趋势分析之自然语言处理
- R语言 Survival analysis(生存分析)
- 用R语言分析与预测员工离职
- 基于R语言的信用评分卡建模分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
设计模式之禅(第2版)
秦小波 / 机械工业出版社 / 2014-2-25 / 89.00元
本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领域的里程碑著作。深刻解读6大设计原则和28种设计模式的准确定义、应用方法和最佳实践,全方位比较各种同类模式之间的异同,详细讲解将不同的模式组合使用的方法。第2版在第1版的基础上有两方面的改进,一方面结合读者的意见和建议对原有内容中......一起来看看 《设计模式之禅(第2版)》 这本书的介绍吧!