IC卡秘钥算法破解的一次尝试
Hello大家好,这里是LanternMark,今天给大家分享一下我的一次水卡破解经历。
(本文只技术交流分享,滥用者自行承担责任,与本文作者无关)
0x0.前言 IC卡,即Integrated Circuit Card,集成电路卡,像我们平常看到的银行卡,地铁卡,还有校园里的饭卡,智能校徽等等,这些都属于IC卡。想必大家一定不陌生,但是大家有没有关注过IC卡的原理以及安全性。希望通过这篇文章,给大家一些启发。
0x1.准备工作 工欲善其事,必先利其器。在开始读卡之前,先准备好以下的东西:
一块读卡芯片(比如PN532)
一台有NFC功能的手机,和配套的软件(比如MCT)
一张水卡
一颗耐心(很重要)
芯片这里我用的是PN532,一块很便宜的读卡芯片,某宝上30多就能买到了,都准备好之后,就可以开始破解了。
0x2.开始破解 首先,先打开手机的NFC功能,读取一下这张水卡,会得到以下的结果。
可以看到,除了13扇区之外,其他扇区都是用的默认密钥,这就给这张卡片带来了很大的安全风险,因为像这种没有全部加密(半加密)的卡片,是可以利用IC卡漏洞轻松破解的,这里我们来用PN532配套的上位机尝试破解一下。
结果如下图:
用了三分钟,秘钥就很轻松的被破解出来了,可见这种IC卡的安全性真的不高。不过用漏洞破解不是本文的重点,本文主要分享一个业余的人破解秘钥的过程。
0x3.数据分析 通过上面一张卡的数据,我还是看不出来有什么联系,所以我又找了另外一些卡来破解寻找UID和密钥的关系。在扫了10+张卡片后,我可以初步知道UID和密钥的映射关系。
由于这种卡的KeyB都是相同的,只有KeyA不一样,所以UID决定的是KeyA,而且KeyA有六位,而UID只有四位,通过上图,我们可以清晰地看到UID地 ...
UE5.6使用Unrealcv和MatrixCityPlugin遇到的一些问题:
起因最近需要用干一些地编的活,需要用虚幻引擎来采集深度数据,遂找了俩可以采集深度图的插件Unrealcv和MatrixCityPlugin,在编译的过程中遇到了些抽象问题。
报错:ConcurrentLinearAllocator.h(31): error C4668: ‘__has_feature’ is not defined as a preprocessor macro, replacing with ‘0’ for ‘#if/#elif’编译插件建议开一个空项目,丢进去先编译好在放到项目里。编译Unrealcv遇到了:
ConcurrentLinearAllocator.h(31): error C4668: ‘__has_feature’ is not defined as a preprocessor macro, replacing with ‘0’ for ‘#if/#elif’
这个问题原因是新版vs使用了新版的msvc, 而它移除了该宏。解决方法很简单,先在vs installer下一个旧版本的msvc,然后在C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC目录下可以找到刚刚安装的旧版本号。
然后找到BuildConfiguration.xml,注意是UE5的对应文件,不是项目文件里的,默认路径在:C:\Users\{yourname}}\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml
123456<Configuration xmlns="https://www.unrealengine.com/Bui ...
解决django报错"Database returned an invalid datetime value. Are time zone definitions for your database installed?"
问题今天写Django项目,创建订单时遇到个bug MySQL backend does notsupport timezone-aware datetimes when USE TZ is False
我把Django的USE_TZ关掉时,他说我mysql不支持,我去打开之后,能创建订单了,但是admin里商品显示有问题了,报错"Database returned an invalid datetime value. Are time zone definitions for your database installed?"然后网上查教程让我把这个选项USE_TZ时区支持打开(Django5.0默认打开)。一根筋变成两头堵了。
解决研究了好久,比如给我mysql加上 SET time_zone = '+08:00'再重启,没用。还是一样报错。后面查了好久才发现,原来是我的mysql数据库里没时区信息,虽然不知道为什么都2025年了,默认不自带时区信息。
Linux下使用命令:
1mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
即可写入时区信息,Windows比较麻烦,得去官网下一个时区的sql文件MySQL :: Time zone description tables,
选timezone_2025b_posix_sql.zip下载,然后解压出sql文件在数据库里执行一下就行了,大概看了一下,里面都是些时区名字和时间偏移的对应关系。如下图所示:
曙光平台安装llama-factory以及微调qwen2.5-VL-3B模型
起因毕设做完了,毕业典礼结束了,进组老师安排了一个复现大模型微调的任务,遂开始装环境,记录一下装环境遇到的各种坑。
SCNet曙光平台conda环境老师给我分了张A800,在云平台上。A800是A100的残血版,貌似砍了CUDA核心数,但是对于微调来说,倒也够用了。曙光平台进来之后直接开ssh,把连接信息和密钥填到配置文件里就能直接连了。
连上之后首先要做的是配环境,默认环境中各种软体,应用程式都是缺失的,如conda,这就需要我们从module里load进来,然后创建环境:
12345module ava #查看可用软体module load anaconda3/2023.09 #condamodule load compiler/gcc/12.2.0 #gcc12,可以先加载进来,待会编译库需要用到
然后开始经典conda装环境部分,这次实验环境需要的库如下:
1234567891011121314151617conda # 创建并激活虚拟环境(以 conda 为例)conda create -n llm_finetune python=3.10conda activate llm_finetuneecho """datasets==3.4.1llamafactory==0.9.3multiprocess==0.70.16numpy==1.26.3openai==1.70.0pandas==2.2.3tokenizers==0.21.0torch==2.6.0torchvision==0.21.0transformers==4.50.0vllm==0.8.2""" > requirements.txtpip install -r requirements.txt -i https://py ...
七牛云批量下载图床图片
起因大一搭博客的时候,需要用到图床,当时用了免费的SM.MS速度差点意思,正好看到七牛云有免费的10G空间,用来搭图床足够了。正好typora也支持接入七牛云,就这样写了几年博客,上传了两千多张照片,一直用的好好的。
直到去年,腾讯云的免费https证书从时间从1年变成了三个月,博客的图床经常因为没更新证书直接挂掉。此时开始萌生想把七牛云上的图片迁移走的想法。然后找了一圈发现,七牛云网站本身不支持批量下载,但是官方提供了一个命令行工具可以批量下载:qiniu/qshell: Shell Tools for Qiniu Cloud
使用参考官方教程批量下载 - 七牛开发者中心
下载了qshell.exe(以windows为例)之后,使用如下两个命令可以进行下载:
12qshell account 您的ak 您的sk 空间名称qshell qdownload2 --dest-dir=本地文件夹相对路径或者绝对路径 --bucket=空间名称
这里的ak和sk都是密钥,之前使用七牛云作图床时,已经保存过一份,空间名称就是空间管理中的名字,如下:
然后就能下载了,在这里我推荐另外一个方法,把以上信息写入conf文件里,之后可以直接调用,格式如下:
1234567{ "accessKey": 您的ak, "secretKey": 您的sk, "bucket": 空间名称, "cdn_domain、": cdn使用的域名, "dest_dir": 保存路径}
批量下载是支持增量下载的,也就说之后可以写定时任务,自动备份图床图片。
Windows11挂载群晖webdav到本地
问题描述在群晖里启动了webdav server之后,windows11上添加会出现0x80070043 找不到网络名
解决方案
确认webdav服务正确打开,端口无冲突。
windows11注册表的BasicAuthLevel设置为2
具体操作
使用win+R,输入regedit打开注册表
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters键
找到BasicAuthLevel的项
修改其值为2
如果不存在这个键,新建一个名为BasicAuthLevel,类型为DWORD的值,设置为2
重启
使用脚本自动更新实验室电脑IP到cloudflare域名
起因之前实验室路由器用的老师的账号,有段时间网络不好,校园网老掉,师兄他们得经常重新登录,每次重新登陆容易造成实验室路由器IP改变,因为我的loongson电脑放在实验室,打洞在校园网。每次换IP我还得跑到实验室去重新看,累死我。然后想到可以像DDNS一样,请求一下API来定时更新IP。因为我的域名是停靠在CF的,所以得用CF的API。
步骤理论上只要一条请求就可以更新了,但是在这之前,得先获取别的信息,所以整个过程要分三步。
先获取zone的id
在获取对应子域名的id
最后组装成更新请求
在开始之前,我们需要先去CF申请一个API的令牌:User API Tokens | Cloudflare
选择你的域名,然后点击进入,滑倒下面,找到Get your API token,进去后点击右上角的create,选择下图的Edit zone DNS
然后配置大概如下,然后再continue就可以了,最后保存好你的密钥。
获取zone的id命令如下,
1curl -X GET "https://api.cloudflare.com/client/v4/zones" -H "Authorization: Bearer TOKEN" -H "Content-Type: application/json"
返回格式
123456789101112131415{ "result": [ { "id": "这是你获取的id", "name": "lmark.cc", "status": " ...
一次给龙芯旧世界升级内核的失败经历
起因最近在捣鼓旧世界的3A5000,编了个软件,编完之后有点空虚,在到处学习一些Linux知识。然后突然想到,早在Linux5xx版本,就宣布了对Loongarch的支持,那我岂不是可以自己编一个内核,然后给Loongnix升级,于是就有了这篇。
下载源码源码:The Linux Kernel Archives
选择6.7.6长期支持版,使用git拉取源码Kernel.org git repositories
编译:清理缓存1make clean
配置文件1make loongson3_defconfig #使用loongarch默认配置编译
然后报错:
报错原因:没有安装flex
解决方法:
12sudo apt-get install flexsudo apt-get install bison
将配置文件移到顶层1cp arch/loongarch/configs/loongson3_defconfig .config
选择配置1make menuconfig
开始编译1make -j4 #3A5000是4核8线程的
编译完成,大概花了四十分钟:
安装模块12sudo make modules_installsudo make install
启用内核作为引导输入下列命令将内核作为引导,将数字更改为你自己编译的版本号:
1sudo update-initramfs -c -k 6.7.6
下面更新一下grub:
1sudo update-grub
之后重启即可在启动界面选择需要启动的内核。
linux6.7.6——启动关机再开机之后,在Grub引导界面,选择”advanced”选项,选择刚刚安装的6.7.6内核。
激动的心,颤抖的手,按下了回车。The world!!!!
一秒钟过去了。。。
两秒钟过去了。。。 ...
在Loongarch下编译Remmina 1.4.5版本
起因之前一直使用loongnix作为跳板机,连接宿舍电脑,然后一直使用Remmina连接,后面看了下Remmina的版本,是1.3.3。
最新版都已经到了1.4.5了已经,我还在用这么老的版本,太不舒服了(遂编一个试试。全程按照官方文档走,没有什么难点,浅浅记录一下。
安装依赖12345678910sudo apt install build-essential git-core libssh-dev cmake libx11-dev libxext-dev libxinerama-dev \ libxcursor-dev libxdamage-dev libxv-dev libxkbfile-dev libasound2-dev libcups2-dev libxml2 libxml2-dev \ libxrandr-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ libxi-dev libavutil-dev libjson-glib-dev\ libavcodec-dev libxtst-dev libgtk-3-dev libgcrypt20-dev libpulse-dev \ libvte-2.91-dev libxkbfile-dev libtelepathy-glib-dev libjpeg-dev \ libgnutls28-dev libsecret-1-dev libavahi-ui-gtk3-dev libvncserver-dev \ libappindicator3-dev intltool libsecret-1-dev libwebkit2gtk-4.0-dev libsystemd-dev \ libsodium-dev libkf5wallet-de ...
关于Django以前忽略的一些东西
Django直接使用sql查询官方文档:执行原生 SQL 查询 | Django 文档 | Django (djangoproject.com)
将查询字段映射为模型字段¶raw() 字段将查询语句中的字段映射至模型中的字段。
查询语句中的字段排序并不重要。换而言之,以下两种查询是一致的:
123>>> Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')...>>> Person.objects.raw('SELECT last_name, birth_date, first_name, id FROM myapp_person')
直接执行自定义 SQL¶有时候,甚至 Manager.raw() 都无法满足需求:你可能要执行不明确映射至模型的查询语句,或者就是直接执行 UPDATE, INSERT 或 DELETE 语句。
这些情况下,你总是能直接访问数据库,完全绕过模型层。
对象 django.db.connection 代表默认数据库连接。要使用这个数据库连接,调用 connection.cursor() 来获取一个指针对象。然后,调用 cursor.execute(sql, [params]) 来执行该 SQL 和 cursor.fetchone(),或 cursor.fetchall() 获取结果数据。
例如:
123456789from django.db import connectiondef my_custom_sql(self): with connection.cursor() as cursor: cursor.execute(&qu ...