jq实现原理——字节码

jq所用的DSL是一门dataflow language,程序中编写的几乎所有结构都是filter,函数(比如def foo(f) f;)接受filter为参数,产生filter。jq程序描述了如何把各个filter组合起来产生更复杂的filter,在执行时把输入数据(若干JSON)变换得到输出(若干JSON)。

jq独特的地方在于它的控制结构是由if和backtracking实现的。由于变量赋值后不可修改,因此迭代无法通过跳转和可变状态实现。

jq把程序编译成字节码后解释执行。字节码是栈式的(参看后缀表达式计算器、Forth),处理的值是JSON,执行时当前结果和临时变量等都存放在data stack上,并提供了很多指令用于处理data stack。下面用表示data stack,左边是栈顶:

持续更新中

Read More

BCTF 2015 CamlMaze命题报告及CTF题目镜像准备方法

题目

BCTF 2015中的题目,名为CamlMaze。向解出此题的217、PPP、Gallopsled、Dragon Sector表达祝贺。

描述:

Caml has found a foggy maze. Please direct him to find the gold.

The source code of Caml Featherweight may be helpful.

本题是字节码逆向题,供选手下载的user.tgz包含camlfwrun(字节码解释器)、bytecode(字节码,是一段客户端程序,用我的Caml Featherweight编译生成)、camlfwod(用ocamlrun执行的字节码查看器,名字来源于objdump)。和Caml Featherweight相比,camlfwrun经过了少许修改,在解释前会向服务端创建socket,是为了适配交互式逆向/pwn类CTF题目,静态编译,已被strip -s

名字中的Caml源于Categorical Abstract Machine Language,一个ML语言的方言。

Read More

江苏信安竞赛初赛工作组记事

11月21日,比赛前一天

20日晚还在赶第二天编译原理课的展示,21日上午才开始搞江苏信安竞赛初赛的运维。网站还没有用户和队伍信息,信息要从一个csv文件中导入。也没有题目信息,需要从一个.docx文件里导入,我用的办法是unoconv -f txt a.docx转成文本文件a.txt后用awk处理得到csv格式的文件,之后在Rails项目的lib/tasks目录里创建了一个导入csv格式题目信息的task。在BCTF初赛平台的基础上,还有很多页面、路由和模型等需要调整。

Read More