一、keygenme(逆向)
是一个crackme,已经知道用户名是KCTF的情况下,计算出序列号。这题真的是很好地锻炼了动态调试的能力,学到了~
1、首先ida分析逻辑:
这里要求输入name是大于3位小于20位,sn一定是64位的
接着进入check
这里因为进行了去符号表:
所以我们可以通过修复符号表+自定义函数名来进行加密算法的查看:
ida中shift+f5然后导入我们的静态链接库,这个库可以从github下载:
https://github.com/push0ebp/sig-database
搞完后,放到ida的sig\pc目录下,有很多很多的库,可以通过strings或者file先查看下程序的编译环境再导入库去识别,效率会高一些。
接下来回到函数可以看到:
看到了aes的ecb模式的加密,然后进一步分析,自己重新定义函数:
func1是格式化操作,转成32位的16进制数,接着AES解密(0标志位),得到的明文进行RSA加密得到密文,满足密文v5[0]=0,v5[1]=2,这里通过动态调试可以得知,rsa生成的密文后16字节作为了name进行tea算法后check的密文。然后name那里进行了tea算法得到密文,匹配成功说明sn可用,Congratulation即可解答。
AES解密部分可以看出是ECB模式,key提取出来是480b62c3acd6c8a36b18d9e906cd90d2,AES部分结束。
然后RSA部分可以得到:n=0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39
p=201522792635114097998567775554303915819
q=236811285547763449711675622888914229291
e=65537
至此结束这两个算法,然后利用KCTF生成的密文是14AF58AD4D76D59D8D2171FFB4CA2231
利用txt中的序列号去运行,经过rsa后得到c=0x0002888888888888888888888888880090C77273A30E15FA5078A1A291D8DB06
替换后面的16字节得到密文:
c=0x0002888888888888888888888888880014AF58AD4D76D59D8D2171FFB4CA2231
进行rsa解密:
得到aes解密后的明文:
2d5f4c9d567c43399312b8898d6c7f2ec799c64bde4fe39eb01771be1e7f4795
进行AES加密:
将得到的sn和txt中的sn进行cmp得知,进行了切割操作,后面的是不要的。
因此序列号就是
0c5ce379f2102313d7420ec4883e25d07b935f98e2b0d9819275450cfda7086e