1.李华的身份证

一.题目链接:

https://www.qsnctf.com/#/main/driving-range

二.基础知识  

2.1 身份证号的计算规则

  • 公式:6位地区码+8位出生日期+3位顺序码+1位校验码
  • 分解:1.顺序码:000-999,男生为技术,女生为偶数,要写代码进行枚举;
      2.校验码:通过计算前17位得到。这里的计算如下图:每位数字乘以对应的权重,再取模11的余数
      ,根据余数查询校验码,如下图2:

image
image

2.2 Archpr工具

三.开始解题

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.得到生成的文件后,使用该工具进行爆破。得到密码
image
3.继续解压该文件夹,解压成功,得到flag!
image
image

posted @ 2025-04-25 16:05  sun010  阅读(122)  评论(0)    收藏  举报