SCTF2021 pwn Christmas Song 出题思路+预期解

sctf2021 pwn出题思路

文章目录

  • SCTF2021 pwn Christmas Song 出题思路+预期解
    • 题目描述
    • Slang-christmas设计思路 1
      • 设计
      • 目录结构
      • 语法
      • 运行
    • docker
    • 思路

题目描述

一个真正的黑客可以在短时间内学习一个新语言的简单用法, 你可以在一天内学会圣诞歌么?注意播放圣诞歌不能说话!(flag范围dic = string.ascii_letters + string.digits + "}")(slang 圣诞特别版 请检查源码包 https://drive.google.com/file/d/1uKjp2MGWdLWcwx4wfnpsMNEzXacb0ZbO/view?usp=sharing )
A real hacker can learn the simple usage of a new language in a short time, can you learn Christmas songs in a day? Note that you can’t talk when playing Christmas songs! (flag range dic = string.ascii_letters + string.digits + "
}) (slang Christmas Special Edition Please check the source code package https://drive.google.com/file/d/1uKjp2MGWdLWcwx4wfnpsMNEzXacb0ZbO/view?usp=sharing )

题目分值:625

解题人数:13

题目源码:slang -christmas,

题目文件

Slang-christmas设计思路 1

设计

语言源码为*.slang文件,编译后的opcode文件为*.scom文件,

提供编译,运行, 反汇编三种操作。

void help(){puts("Slang v0.01");puts("compile file:\t\t-c [filename.slang]");puts("decompile file:\t\t-d [filename.scom]");puts("run file\t\t-r [filename.scom/filename.slang]");
}int main(int argc, char * argv[]){if (argc == 1){help();}for(int i=1; i<argc; i+=2){char * sig = argv[i];if (sig == NULL){return 1;}if (!strcmp(sig, "-c")){FLAG = COMPILE;} else if (!strcmp(sig, "-g")){FLAG = DEBUG;} else if (!strcmp(sig, "-d")){FLAG = DISASM;} else if (!strcmp(sig, "-r")){FLAG = RUN;} else {help();return 0;}load_file(argv[i+1]);}return 0;
}
void load_file(char *path){char dir[0x60];char name[0x60];char slang_file[0x120];char scom_file[0x120];int is_slang = check_suffix(path, dir, name);snprintf(slang_file, 0x120, "%s/%s.slang", dir, name);snprintf(scom_file, 0x120, "%s/%s.scom", dir, name);if (FLAG == COMPILE){if (is_slang)compile_file(slang_file, scom_file);printf("compile file scom\n");} else {if (is_slang)compile_file(slang_file, scom_file);lambda_t *lambda = load_scom(scom_file);if (FLAG == RUN)vm_call_lambda(lambda);if (FLAG == DISASM)disasm(lambda);}
}

目录结构

com目录下是语法描述文件parser.y和词法描述文件scanner.l, 其他的是ast相关结构和生成opcode相关的代码,

dsiasm目录下是反汇编相关代码,

file目录是scom文件和载入文件的代码。

include 目录下是对应外面几个目录的头文件目录。

lib目录下是全局会使用到的相关结构。

vm目录下是运行的虚拟机。

语法

一共支持三种结构,函数调用、want结构、赋值运算。

其中want结构语法如下,相关代码在com/com_want.c中,是个类似switch的结构,可以构造出if语句,AGAIN可以重新跳回起点,于是也可以构造循环语句。

函数调用语句如下,三种格式,通过BACK可以获取返回值。在com/compile.c: compile_function函数中是对应的代码。

最后赋值语句,是可以进行计算的。

运行

vm/vm_call.c中就是vm部分,比较典型的while+switch形式,相关运算赋值指令基于栈实现。

#define display(OPCODE, opcode)                                                \case OP_##OPCODE:                                                            \vm_opcode_##opcode(r, l);                                                  \break
#define operator(OPCODE)                                                \case OP_##OPCODE:                                                     \vm_opcode_operator(r, l, OP_##OPCODE);                              \break
void vm_call_lambda(lambda_t *l){runtime_t *r = runtime_init();// gift to Christmas Bash!// Don't play too late for the party! Remember to sleep!// gift_t * gift = gift_init("sleep", sleep);// runtime_set_gift(r, gift);while(r->is_run){switch(get_code){display(STORE, store);display(LOAD_NUMBER, load_number);display(LOAD_STRING, load_string);display(LOAD_WORD, load_word);display(CALL, call);display(JZ, jz);display(JMP, jmp);operator(ADD);operator(SUB);operator(DIV);operator(MUL);operator(GRAETER);operator(EQUAL);}check_next(r, l);}
}

函数调用对应的代码如下,在Song题目中,不允许使用write,

可以看到能使用的函数为read open strncmp memcpy, 对应名称 Dasher Dancer Prancer Vixen

这其实是圣诞老人的九只驯鹿。

char * rudolph = "Rudolph has been with Santa. \nGoing to deliver presents soon!\nYou can't get him to help. \nAnd you can't talk when playing Christmas songs!\n";#define is_func(func_name) \!strcmp(func, (func_name))
void vm_opcode_call(arg){char *func = get_word;u_int64_t arg3 = pop;u_int64_t arg2 = pop;u_int64_t arg1 = pop;u_int64_t ret;if (is_func("Rudolph")){// ret = write(arg1, arg2, arg3);// No talking while singing Christmas Songsprintf("error: \n%s\n", rudolph);}if (is_func("Dasher")){ret = read(arg1, arg2, arg3);}if (is_func("Dancer")){ret = open(arg1, arg2, arg3);if((int)ret < 0){printf("error con't open file %s\n", arg1);exit(EXIT_FAILURE);}}if (is_func("Prancer")){ret = strncmp(arg1, arg2, arg3);}if (is_func("Vixen")){ret = memcpy(arg1, arg2, arg3);}push(ret);
}
#undef is_func

docker

题目使用server.py启动,主要位置在这里

def run_challenge(filename):socket_print("Testing edge compute app...")try: result = subprocess.run("/home/ctf/Christmas_Song -r {}.slang".format(filename), shell=True, timeout=1)except subprocess.TimeoutExpired:passclean(filename);socket_print("Test complete!")

可以看到有个timeout=1,

思路

简单了解这个语言应该就可以做题了,这个song题目无关漏洞,

我们可以直接使用 open read 然后配合 strncmp和want结构形成的while语句实现一个死循环爆破,因为设置了超时时间,这个爆破速度也比较可观。

另一个思路是通过open失败的打印,这里直接再次open(flag),失败后会进行打印,可以吧flag打印出来。

    if (is_func("Dancer")){ret = open(arg1, arg2, arg3);if((int)ret < 0){printf("error con't open file %s\n", arg1);exit(EXIT_FAILURE);}}

SCTF2021 pwn Christmas Song 出题思路+预期解相关推荐

  1. CTF-Crypto 出题思路与解题思路

    CTF-Crypto 出题思路:区块链.公钥RSA.流密码.分组密码 机密性(加密算法).完整性(消息摘要).可用性.认证性(认证签名).不可否认性. 编码基础|HEX:a-f 0-9,考虑ascii ...

  2. 【直播】陈安东,但扬:CNN模型搭建、训练以及LSTM模型思路详解

    CNN模型搭建.训练以及LSTM模型思路详解 目前 Datawhale第24期组队学习 正在如火如荼的进行中.为了大家更好的学习"零基础入门语音识别(食物声音识别)"的课程设计者 ...

  3. vuepdf转换html,Vue网页html转换PDF(最低兼容ie10)的思路详解

    Vue网页html转换PDF(最低兼容ie10)的思路详解 发布时间:2020-10-16 13:05:09 来源:脚本之家 阅读:95 作者:冷藏封 HTML转PDF: 1.页面底层实现--Vue: ...

  4. python正则表达式提取数字比较好_python正则表达式从字符串中提取数字的思路详解...

    python从字符串中提取数字 使用正则表达式,用法如下: ## 总结 ## ^ 匹配字符串的开始. ## $ 匹配字符串的结尾. ## \b 匹配一个单词的边界. ## \d 匹配任意数字. ## ...

  5. python处理excel大数据-Python实现大数据收集至excel的思路详解

    一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...

  6. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  7. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  8. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  9. python virtualenv conda_在vscode中启动conda虚拟环境的思路详解

    问题:cudatoolkit cudnn 通过conda 虚拟环境安装,先前已经使用virtualenv安装tf,需要在conda虚拟环境中启动外部python虚拟环境 思路:conda prompt ...

最新文章

  1. nginx 启动脚本
  2. DNS服务器搭建笔记
  3. Android 解决 No static method in class La/a/a/a; or its super classes
  4. Polymorphic form--多态表单
  5. SSDT表与ShadowSSDT表
  6. C#中保存Gif文件设置透明无效果
  7. Linux疑难杂症解决方案100篇(八)-文本处理工具与bash的特性
  8. C语言再学习 -- printf、scanf占位符
  9. 电气期刊论文实现:基于输电线路容量安全约束的电力机组组合
  10. [转]ActiveX控件安全初始化之一:实现ISafeObject接口
  11. 【渝粤题库】陕西师范大学500006 算法语言 作业
  12. (转载)windows server 2003的注意事项
  13. struct seq_file
  14. 阶段3 2.Spring_01.Spring框架简介_01.spring课程四天安排
  15. 微信刷投票软件手机版、微信免费刷票软件建立的原理解析
  16. Activity 过渡动画 — 让切换更加炫酷
  17. 【Vue】基础入门 —— 黑马程序员
  18. 段地址x16+偏移地址=物理地址的本质含义
  19. 乔治城大学计算机专业,Georgetown的Computer Science「乔治城大学计算机科学系」
  20. 华为ensp——企业网络的设计与实现【方案测试验证】

热门文章

  1. “辣条一哥”卫龙冲击港股IPO,我又吃出一家上市公司
  2. Android 开启移动网络(GPRS 3G)
  3. struts2最近量产漏洞分析
  4. 使用icacls命令设置目录及其子目录、文件的所有权限
  5. append和extend的区别
  6. MYSQL 性能优化 index 函数,隐藏,前缀,hash 索引 使用方法(2)
  7. 【踩坑日记 · 前端】为 Excalidraw 添加中文手写字体
  8. eclipse输出中文变成乱码问题
  9. ZJYYOJ 活字印刷(dfs)[C,C++]
  10. TravelFlan携小猴问问亮相ITB,看人工智能如何化解旅游痛点