1.李华的身份证
一.题目链接:
https://www.qsnctf.com/#/main/driving-range
二.基础知识
2.1 身份证号的计算规则
- 公式:6位地区码+8位出生日期+3位顺序码+1位校验码
- 分解:1.顺序码:000-999,男生为技术,女生为偶数,要写代码进行枚举;
2.校验码:通过计算前17位得到。这里的计算如下图:每位数字乘以对应的权重,再取模11的余数
,根据余数查询校验码,如下图2:


2.2 Archpr工具
- 简介:专门用来爆破文件密码的工具
https://blog.csdn.net/xcellencw/article/details/145305706
三.开始解题
1.根据提示,需要爆破出身份证才能继续下一步的操作。于是在kali里运行下列python代码
点击查看代码
def calculate_check(id17): #定义一个函数,用于计算身份证的第十八位校验码
weights = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] #权重系数:中国身份证校验码计算的标准权重列表,每个数字对应一个权重
check_codes = '10X98765432'
#校验码对照表:根据前17位的加权和模11的结果,从该字符串中选取对应的校验码(如余数2对应X)
total = sum(int(id17[i]) * weights[i] for i in range(17))
#加权和计算
#遍历前17位数字,将每位数字(int(id17[i]))与其对应的权重(weights[i])相乘。
#使用sum求和,得到加权总和total
return check_codes[total % 11]
#返回校验码:
#计算total % 11得到余数(0-10)
#根据余数从check_codes字符串中返回对应的校验码
prefix = "32021119980405"
#前缀定义:身份证前14位,包含:320211(江苏无锡...),19980405(出身日期)
with open('id_list.txt', 'w', encoding='utf-8') as f:
#打开文件:以写入模式("w")创建/覆盖文件id_list.txt,并指定编码为utf8
for seq in range(0, 1000):
#循环生成顺序码:sep从0-999,覆盖所有的3位顺序码
seq_str = f"{seq:03d}"
#将seq格式化为3位字符串(如5:005)
if int(seq_str[2]) % 2 == 1:
#性别过滤:seq_str[2]是顺序码的最后一位(如005的5),%2==1是确保顺序码为奇数
id17 = prefix + seq_str
#拼接前17位:将前缀prefix和顺序码(seq_str)拼接。形成身份证前17位
full_id = id17 + calculate_check(id17)
#生成完整身份证号:
f.write(full_id + '\n')
#写入
print("[+] 结果存为 id_list.txt")
#打印已经写入信息提示
2.得到生成的文件后,使用该工具进行爆破。得到密码

3.继续解压该文件夹,解压成功,得到flag!



浙公网安备 33010602011771号