这应该算第三次使用Emacs了。第一次是在2009年,NOI 2009酱油后下决心好好学习Linux,Philip Xu前辈我指引了两天,发现Linux这个未知世界竟然有这么多好玩的软件。编辑器之神Vim用了一阵子了,NOIP 2009前若干天开始探索神的编辑器Emacs,使用Emacs Lisp配置,实现与Vim相似的设定效果需要多出好多代码,因此不久又回到Vim。大概2010下半年又用起Emacs,这次好好折腾了一把。当时Vim的插件生态还围绕vim.org(现在逐步转战GitHub了),Emacs倒是有个http://www.emacswiki.org,尝试了Mew、ERC、AUCTeX、haskell-mode、org-mode等好多东西。很多文件类型的解析、自动缩进支持比Vim对应物好不少,插件质量感觉也稍高。
J语言初探
先看些例子,感受一下J的魅力:
1 | +/\ i.6 NB. prefix sum of 0~5 |
DEFCON 23 CTF参赛记
8月4日
从北京出发,起飞前两小时发现机票没有买成功,立即买了一张,感谢诸位队友。到达San Francisco后与昨日航班延迟一天的队友会合,21:00多飞往Las Vegas。今年DEFCON会场从Rio迁到了Paris & Bally's。我们提前到达的在这里订了几间房间。
一次服务器BMC固件逆向经历
导出文件
访问BMC默认开启的Web管理界面http://$ip
,开启ssh
服务,之后即可以执行ssh root@$ip
,得到一个受限的管理界面,功能很少,没有系统shell。
在服务器上执行ipmitool fru
可以查找到设备型号,使用厂商提供的flash备份工具导出flash,比较慢,每秒200多KB。在BMC网页界面的BMC System Audit Log
中看到BMC的Linux系统日志:
常数空间Invert Binary Tree与仿Morris法后序遍历
今天在地铁上浪费了好多时间……呜呜……做其他事都没有效率,就利用这些时间写字了。
前几天LeetCode的Invert Binary Tree火了。名称有点糟,无法准确描述要求。
主要思路是遍历二叉树,把访问操作修改为交换左右孩子,每个节点都交换一次即可。
如果采用前序或中序遍历,则子树交换发生在遍历某棵子树之前,会引起麻烦。因此我想到了后序遍历,在遍历完子树后再交换左右孩子,重心就是如何实现常数空间复杂度的后序遍历。某些资料/问题称之为Morris post-order traversal。
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。下面用
持续更新中
ELF Hacks
我喜欢基于代码片段的学习,之前学习过一些binutils和其他处理ELF的工具的奇技淫巧,了解到很多概念,比如weak symbol、common section、RPATH、把资源文件嵌入ELF等,昨天创建了一个项目https://github.com/MaskRay/ElfHacks整理了很多自包含的例子。
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语言的方言。
调试技巧2
之前写过一篇《Debug Hacks》和调试技巧。
CFLAGS
使用-g3
对于重度使用macro的程序很有用,可以在gdb里使用info macro NAME
、macro expand EXPR
等命令了,print
参数里的macro也可以展开。