攻防世界 - The_Maya_Society - writeup

The_Maya_Society

文件链接 -> Github

初步分析


压缩包解压以后,有这些文件

打开 html 文件,浏览器中显示如下
攻防世界 - The_Maya_Society - writeup_第1张图片
点击download按钮,下载launcher文件。由于网站原因,这里download是进不去的,所以直接打开本地的launcher文件

程序执行过程

攻防世界 - The_Maya_Society - writeup_第2张图片
程序调用了time函数获取当前时间,并把它格式化后,使用 sub_B5A 函数对它进行md5加密,再把加密的结果格式化为32字节的字符串

攻防世界 - The_Maya_Society - writeup_第3张图片
将字符串与 .fluxfinger.net 拼合起来,作为 sub_18A4 的参数。当函数返回0时,直接返回1,因此我们需要该函数返回1
攻防世界 - The_Maya_Society - writeup_第4张图片

此处介绍一下相关函数的作用
函数原型 作用
int res_query(const char *dname, int class, int type,unsigned char *answer,int anslen) 查询名称服务器,以获得指定类型和类的完全限定域名。应答保留在调用方提供的anslen长度的缓冲区应答中
int ns_initparse(const u_char *msg, int msglen, ns_msg *handle) 在使用其他名称服务器库例程之前必须调用的第一个例程。nitparse填充句柄指向的数据结构,该句柄是传递给其他例程的参数
int ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) 提取关于响应记录的信息并将其存储在rr中,rr是传递给其他名称服务器库例程的参数
int ns_sprintrr(const ns_msg *handle, const ns_rr *rr, const char *name_ctx, const char *origin, char *buf, size_t buflen) 将rr转换为表示格式

详参
https://docstore.mik.ua/orelly/networking_2ndEd/dns/ch15_02.htm
https://linux.die.net/man/3/res_query
https://code.woboq.org/userspace/glibc/resolv/ns_print.c.html#ns_sprintrr

解决问题

看起来 sub_18A4 是与相关服务器通信,其通信的地址是当前时间的md5+.fluxfinger.net

这就涉及到我知识的盲区了

看了一下别人的writeup,原来在html文件中有一个提示,那就是图片下方的 © 2012 ,那么需要的时间就是2012年的某天,需要爆破解决该问题

首先我们编写一个动态链接库 faketime.so,其中有一个假的time函数,返回的是我们指定的时间

#include 
#include 
int time(int a) {
  return atoi(getenv("CURR_TIME"));    //CURR_TIME即我们指定的时间
}

编译

gcc -c -fPIC -o faketime.o faketime.c
gcc -shared -o faketime.so faketime.o

将so文件与执行文件放到同一目录下

然后编写 shell脚本 在相同目录,用小时为单位,运行脚本即可得到flag,脚本运行时间为 31分钟

PS:它这图片上面的估计是玛雅文字?会不会是提示具体时间的?

总结

第一次遇到这种题,也是学习了一下在linux中如何利用脚本调试可执行程序

linux下环境变量,shell的变量以及指令的作用域都需要好好学习一下

你可能感兴趣的:(CTF)