推测dx.exe的工作流程为:点击USIM专用工具单次授权版后:
程序先检查电脑是否连接PS/SC读卡器,否则报错;
尝试与USIm卡建立通信,发送00A40000023F00等指令,读取卡上存储的私有信息(2F50/2F51处的),如果不成功,报错;
根据读取的信息,通过计算模块(IDA中看到一处结构很像加解密模块)计算出ADM key。
简单来讲,ADM(Administrative) key是智能卡(Smart Card)文件权限控制中最高级别的key,类似还有PIN(Personal Identification Number), PUK(PIN Unblocking Key),权限递增。
如果获得了USIM卡的ADM key,则可以读出Ki,这便是东信和平USIM卡的破解原理: 使用“内部流出”的ADM计算工具获得USIM卡的ADM key,通过ADM key读取卡中的关键信息,如Ki。
由于时间有限,未完整逆向出ADM key的计算流程。“USIM_Explorer改iccid软件.zip”下载链接在此,如果你有兴趣逆向dx.exe,欢迎留言或邮件交流。
Linux下智能卡渗透笔记
Linux系统通过PC/SC Lite支持使用PC/SC(Personal Computer/Smart Card)标准。
个人主要使用基于Python的pyscard及基于此的pySim与USIM卡交互。
pySim
pySim支持串口与PC/SC两种读卡器
Option
Parameter
-d
Serial Device fo SIM Access [default: /dev/ttyUSB0]
-p
Which PS/SC number for SIM access
注意PS/SC number是执行pcsc_scan后得到的,如:
Scanning present readers...
0: Identiv SCR35xx USB Smart Card Reader [CCID Interface] (xxxxxxxxxxxxxx) 00 00
中的0。
ADM key
之前的博文Build a LTE Network with srsLTE and Program Your Own USIM Card中提到了写USIM卡的软件需要和卡配套,其实不完全是这种情况。
正如前文所讲,写卡最主要的是对ADM key的鉴权,之后写卡命令大部分情况下都是符合智能卡标准的,为pySim增加某些USIM卡写卡支持需要解决两个问题:
ADM key获取及ADM key鉴权(某些卡的鉴权方法非标准);
某些非标准参数(通常是Ki)的读写。
此处的“非标准”指文件位置或者写卡命令非标准,然而在APDU层面都是标准的(此层以下厂商没有私有的必要,需要花费太多研发精力)。
分析pySim的pySim-prog.py可以看到,pySim支持的如sysmoUSIM-GR1, sysmoUSIM-SJS1等,其实是实现了对这些卡的ADM鉴权及参数写入。
我们在之前博文中使用的私有写卡软件SIM Personalize tools(Copyright: GreenCard Co.,Ltd Ver 3.1.0很容易逆向,通过strings的搜索,很容易得到此类卡的鉴权APDU,写参数APDU等。
该软件“支持的”卡其实是ADM key是&&&&&&&&,即3838383838383838长度为16个十六进制数字的值。
手中的另一个NB-IoT USIM卡的ADM key是22222222,即3232323232323232,ADM key的长度为8 bytes,在APDU中转换成ASCII值,也有某些USIM的ADM值直接以16个十六进制呈现,且没有对应的字符,如上面使用的东信和平USIM卡。
Reference
https://cyberloginit.com/2018/05/14/eastcompeace-usim-exploit-and-notes-on-smart-card-pentest-for-linux.html
https://blog.csdn.net/s762888517/article/details/52980312
https://www.eftlab.co.uk/index.php/site-map/knowledge-base/118-apdu-response-list
http://cardwerk.com/smart-card-standard-iso7816-4-section-6-basic-interindustry-commands/
https://blog.csdn.net/A493203176/article/details/65445775
https://osmocom.org/projects/pysim/wiki
https://sourceforge.net/p/openlte/wiki/Programming%20you%20own%20USIM%20card/
TS 31.102