难度:⭐
- 要不要后面把怎么写外挂啥的放上来?还是说开一个知识星球?-
难度一星,一颗给go,一颗给密码学,减一颗给简单的认证过程
静态分析
首先是来源
下载Windows版看看
哦?golang打包的,看看版本
1 | > go version .\authTool.exe |
有点难搞啊,有无Go是无符号的,IDA打开看也是一坨
粗略动态
这个阶段就是看网络活动,文件操作等等,先打开WireShark
和Procmon64
然后打开软件跑一下
这个时候ProcessMonitor已经有了,凭经验来说这里只有网络连接有点价值
两个IP:43.x.x.x
(记为ipA)和149.x.x.x
(记为ipB),按照先后顺序看
在wireshark中ip.addr == 43.x.x.x
在wireshark中ip.addr == 149.x.x.x
两段都是密文,一眼base64,而且解码完成过后也是乱码,接下来回到你想本身
动静结合
根据运行时候的字符串,用golang写过网络请求的小伙伴都知道,网络请求部分是在net
库中,立刻在main_main
中找到相关
有时间的还在静态跟流程,心急的已经开始用ida动调了
43.x.x.x
写过golang的都知道,获得发送完请求的结果需要使用一个ReadAll
之类的东西
看看下面的AES解密
发现有个相关值1234567890123456
,但是CBC加密方式的话不知道这个是key
还是iv
,动态看看
这里slicebytetostring
刚好返回,根据汇编的传参,说明接收到的内容可能在RAX
寄存器里面
和wireshark拦截到的报文一样,跟进AES解密看看
这里可以自己确认一下,确实是Base64解码的
这里看一下crypto_aes_NewCipher
,根据Windows下的传参规则,看一下栈和rcx
,rdx
,r8
,r9
...
那么应该就是Key了
这里要开始解密了对吧,还是看下相关参数
猜测:这时候的key和iv都是1234567890123456
,写个python脚本验证下
1 | from Crypto.Cipher import AES |
得到了两个IP,根据后续操作会把解密出的字符串按照,
切分开,而且第一个ip就是wireshark得到的,那么就是一个主用,一个备用两个IP
143.x.x.x
这里有个很明显的拼接api的操作,得到url:http://149.x.x.x:8699/api/v
,和ipB的流量对上了
接着用了和上面一样的解密函数,解密一下看看
发现了一个新的url,记为urlB
解析这个json,然后就是一些文件操作,然后来到了输入激活码的地方
激活
第一处认证,说明输入的激活码长度要为16,这里后续可能要patch,记一下patch点:00000000006A3CF1
这里还有后续都做了一些信息搜集,其中包括有:时间戳,主机名(hostname),所有网卡的mac,本地IP,还有一个user(可能是正确的激活码才会有的)
这里调用了一个main_ec
,先看一下截至目前拼接的字符串
不用认证分析了,功能:加密,key和iv两个都试一下,密文选择后面base64过后的内容
最后发现使用,key:1234567890ABCDEF
,iv:ABCDEF1234567890
拼接好参数,用最开始通讯的密钥和iv进行加密,使用POST送回服务端,貌似我们距离最后的认证也来越近了
校验
接收到返回后就开始各种比较,那么这里就是校验的地方了,直接nop或者jmp掉就可以了,注意jmp的话栈上面的修改别覆盖了,得到第二个patch的位置:00000000006A4293
这里动态调试我就直接改rip过了
破解coploit
哈哈,你不会真的以为有什么方法能免费试用coploit吧
无害之处就在于此
就和chatGPT一样,这个用的时候要联网,联网会验证token,所以这样的token肯定没有在他数据库里面注册过
这些平台只是做一个流量转发,买几个key
然后做个token转换然后卖给大家用而已,是不是割韭菜就仁者见仁智者见智了
根据我所了解的大多是修改js文件等等的操作进行的,后续具体修改插件什么的操作,js相关文件怎么实现的,就不再分析了,点到为止
打包
截图的地址可能有问题是因为我重新用IDA打开过一次
0x6A3CF1
nop掉,但是这个内容会返回到服务端,如果服务端默认这个是16个字符串而且使用了下标寻找内容,可能会出问题
0x6A4293
需要注意的是
1 | .text:00000000006A42B5 mov rax, [rsp+0A58h+var_5F0] |
这段修改了寄存器的值,如果跳过可能对main_writeHostsJSON2
有不好的影响,把校验全部nop
初步达到效果
网络连接
思路A
根据相关传参,按照一下两次jmp
1 | .text: 00000000006631B9 call net_http___Client__Get |
思路B
修改域名和ip为自己的,自己搭一套服务
-
urlA的网络模拟
urls
=authURL_A
+“,”+authURL_B
使用Key-iv =
1234567890123456
-1234567890123456
进行AES-CBC加密urls
并返回 -
urlB的网络模拟
返回如下json值
1
{"link":"https://xxxxx.xyz/xxxx.html","type":"x","title":"x.x","id":x,"linktext":"xxxxxxxxx"}
-
接收post传参,返回值随便(客户端得patch)
最终效果