点击上方蓝字关注我们
郑重说明
数字人才创研院秉承探究学习与交流知识的原则,所有发布的技术文章仅供参考,目的在于助力你获得更多知识;与此同时,让我们共同遵守《网络安全法》,未经授权请勿利用文章中的技术内容对任何计算机系统进行非授权操作,否则对他人或单位而造成的直接或间接后果或损失,均由使用者本人负责。
公众号发表的文章如有涉及您的侵权,烦请私信联系告知,我们会立即删除并对您表达最诚挚的歉意!感谢您的理解!
Purpose of recommendation
推荐观点
01
CRYPTO_Evaluate
试题代码如下:
# -*- coding: utf-8 -*-
from Crypto.Util.number import bytes_to_long
from secret import flag
import random
import gmpy2
def genPrime():
while True:
p = random.getrandbits(512)
tp = random.getrandbits(20)
if gmpy2.is_prime(p**4 + tp):
return p**4 + tp, tp
p, tp = genPrime()
q, tq = genPrime()
m = bytes_to_long(flag)
e = 0x10001
n = p*q
c = pow(m, e, n)
print("n = %s" % n)
print("e = %s" % e)
print("c = %s" % c)
print("tp = %s" % tp)
print("tq = %s" % tq)
02
MISC-veee
1、打开附件文件,看到2个文件,一个没有后缀,一个为文本文件
2、先看文本文件,发现为一组1W个的身份证号码清单,粗略检查后发现部分身份号码不正确,存在异常字符a
3、先使用python脚本提取错误的身份证号码,进行二次分析,分析发现最后一位似乎有问题,改下代码提取最后一位并组合
import random
import re
from datetime import datetime, timedelta
#需引入constant.py文件
import constant as const
class IdNumber(str):
def __init__(self, id_number):
super(IdNumber, self).__init__()
self.id = id_number
self.area_id =int(self.id[0:6])
self.birth_year =int(self.id[6:10])
self.birth_month =int(self.id[10:12])
self.birth_day =int(self.id[12:14])
def get_area_name(self):
"""根据区域编号取出区域名称"""
return const.AREA_INFO[self.area_id]
def get_birthday(self):
"""通过身份证号获取出生日期"""
return "{0}-{1}-{2}".format(self.birth_year, self.birth_month, self.birth_day)
def get_age(self):
"""通过身份证号获取年龄"""
now = (datetime.now() + timedelta(days=1))
year, month, day= now.year, now.month, now.day
if year== self.birth_year:
return0
else:
if self.birth_month >monthor (self.birth_month ==monthand self.birth_day >day):
returnyear- self.birth_year -1
else:
returnyear- self.birth_year
def get_sex(self):
"""通过身份证号获取性别, 女生:0,男生:1"""
returnint(self.id[16:17]) %2
def get_check_digit(self):
"""通过身份证号获取校验码"""
check_sum =0
for i inrange(0, 17):
check_sum += ((1<< (17- i)) %11) *int(self.id[i])
check_digit = (12- (check_sum %11)) %11
return check_digit if check_digit <10else'X'
@classmethod
def verify_id(cls, id_number):
"""校验身份证是否正确"""
if re.match(const.ID_NUMBER_18_REGEX, id_number):
check_digit = cls(id_number).get_check_digit()
return str(check_digit) == id_number[-1]
else:
return bool(re.match(const.ID_NUMBER_15_REGEX, id_number))
def check():
withopen('sfz.txt', 'r', encoding='utf-8') as file:
for line in file:
value= line.strip()
if IdNumber.verify_
4、观察字符的规律,提取最后一位得到一串编码,解编码后,得到密码
746869735f69735f7077645f6a37316e617332
this_is_pwd_j71nas2
5、根据另一个文件名猜测为veracrypto加密卷,加载文件后,尝试使用之前的密码,可以成功解开。
6、可以看到flagggg.txt文件,但是内容提示fakeflag,根据ntfs卷猜测可能为ntfs数据流隐写,直接使用NSE工具分析发现存在隐藏数据,导出后,得到正确的flag。
03
RE_easystd
04
WEB_ACXI_
访问网站就是简单的登录注册界面。可以注册个账号登录(test/123456),提示需要admin才能拿到flag。
简单看下http包发现这个网站没有cookie,那肯定依靠啥东西来鉴权。点一下GetFlag,发现传了3个参数,其中HIDDEN_HIX=773094245109,看起来像是鉴权的。重新登录下HIDDEN_HIX=244813267701,说明还是有变化不是固定的。
转为hex后观察下,发现仅前2位变化了。
hex(773094245109)
0xb4000202f5
hex(244813267701)
0x39000202f5
大胆猜测前2位是随机的,不参与验证,那直接去掉是不是也可以。将HIDDEN_HIX改为131829,也可以通过验证是相同的用户。
0x202f5 = 131829
还有个功能是修改密码,修改为1234567后,发现HIDDEN_HIX变了,是721554637612。
hex(721554637612)
0xa80002032c
观察HIDDEN_HIX的变化,后面从0x02f5变为0x032c。相减下发现多了55,即ascii的7。我们把密码从123456改为1234567后,发现多加了7的ascii,合理猜测后面的是把用户名或密码的ascii相加。验证下,发现是对的:
hix = 0
for c in 'test123456': hix += ord(c)
hex(hix)
# 0x2f5
hix = 0
for c in 'test1234567': hix += ord(c)
hex(hix)
# 0x32c
那就剩下最后一部分了,0x2了。
0x0202f5
^
可以大胆合理猜测这个是账号注册顺序。那第一个应该就是admin了。可以推测:
0x01????
由于admin+密码的ascii码的和不会太大,可以进行爆破,从0x10000+521(admin)=66057开始爆破就行。发现66723就是admin的HIDDEN_HIX,拿到flag。
如果喜欢,敬请关注,后期内容更精彩!
END
原文始发于微信公众号(数字人才创研院):2024“领航杯”-初赛WP(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论