找回密码
 立即注册
搜索
查看: 1672|回复: 6

[软件] 有玩ctf的吗?用静态语言解这种题会不会很麻烦?

[复制链接]
     
发表于 2021-2-20 01:42 来自手机 | 显示全部楼层 |阅读模式
题目链接:http://167.71.246.232:8080/rabbit_hole.php

23日前应该都有效,漏扫工具Nessus的开发商Tenable举办的,白皮能闲到设计这样的题还真少见,提示很少,就是题面的follow the rabbit hole,我是跑了好几遍程序调整好几次才想明白这玩意到底在弄啥。

点进去文本[]外面是下一个链接的尾巴,需要一路让程序点,一共有1582个。[]内则是一个文件按字节拆开转成16进制放在每个网页里,前面是这个字节在文件里的顺序号码,后面单引号里是字节内容,解题就是遍历所有网页,同时记录每个页面上的字节内容到一个list/数组,最后写成文件存到本地,打开这文件把记录的hex码贴到16进制编辑器新建的空白文件里(推荐hxd),发现是个png,另存打开,图上内容就是答案。

因为本人写代码就是业余时间玩玩,工作用不着,所以也挺久没碰静态语言了,一般就是写点脚本做做题,python和js都是毕业以后自学的。有点好奇像这种蛋疼的东西用静态语言解是不是会麻烦很多?有没有大拿给讲讲。
回复

使用道具 举报

     
发表于 2021-2-20 03:25 | 显示全部楼层
麻烦什么?
定义一个较大的字节数组,然后跟着后面的key遍历网页,把前面的内容按照不同的下标填到字节数组中,最后把字节数组写成文件
回复

使用道具 举报

     
发表于 2021-2-20 06:32 | 显示全部楼层
大约10-15分钟用Rust写了一个,答案是不麻烦,诀窍是使用现代的编程语言
  1. use regex::Regex;
  2. use std::{fs::File, io::Write};

  3. const BASE: &str = "http://167.71.246.232:8080/rabbit_hole.php";

  4. #[tokio::main]
  5. async fn main() {
  6.     let re =
  7.         Regex::new(r"(?i)\[(?P<loc>\d+),\s*'(?P<byte>[0-9a-f]{2})'\]\s*(?P<next>.+)").unwrap();
  8.     let mut next = BASE.to_string();
  9.     let mut data = Vec::new();
  10.     for count in 1.. {
  11.         let body = reqwest::get(&next).await.unwrap().text().await.unwrap();
  12.         match re.captures(&body) {
  13.             Some(cap) => {
  14.                 data.push((
  15.                     usize::from_str_radix(&cap["loc"], 10).unwrap(),
  16.                     u8::from_str_radix(&cap["byte"], 16).unwrap(),
  17.                 ));
  18.                 next = format!("{}?page={}", BASE, &cap["next"]);
  19.             }
  20.             None => {
  21.                 break;
  22.             }
  23.         }
  24.         if count % 100 == 0 {
  25.             println!("block: {}", count);
  26.         }
  27.     }
  28.     data.sort_by_key(|&(loc, _)| loc);
  29.     let bytes: Vec<_> = data.into_iter().map(|(_, byte)| byte).collect();
  30.     let mut file = File::create("rabbit.png").unwrap();
  31.     file.write_all(&bytes).unwrap();
  32. }
复制代码

依赖有:

  1. [dependencies]
  2. regex = "1.4.3"
  3. reqwest = "0.11.0"
  4. tokio = { version = "1.2.0", features = ["rt-multi-thread", "macros"] }
复制代码

flag: automation_is_handy
回复

使用道具 举报

     
发表于 2021-2-20 08:57 | 显示全部楼层
麻烦点(最浪费代码量的地方)在于码字,能不能用第三方类库,大部分代码都浪费在于写http和正则。。。
回复

使用道具 举报

     
发表于 2021-2-20 10:09 来自手机 | 显示全部楼层
和静态语言没啥关系,也许是c++标准库里没网络库给你带来的偏见
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-2-20 10:31 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2021-2-23 07:58 来自手机 | 显示全部楼层
ctf很重要的一点就是效率,代码质量几乎没要求,当然是有大量库不需要重复造轮子的脚本语言优先
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-7-21 03:30 , Processed in 0.040762 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表