RE_Challenge
主要是以虎符和近期国际赛的题为主,梳理一下学到的方法和技巧。
虎符
fype
基于libbpf编写的bpf程序逆向,原理类似hook。主要分为两部分,一部分是bpf代码,一部分是用户代码。本题是 libbpf-bootstrap结构下的uprobe模板,用于对程序内函数进行hook(或称跟踪)。
uprobe.bpf.c
1 |
|
BPF程序一般需要4个步骤,即创建并打开open
、加载并验证loda
、附加attach
、退出destroy
。
bpf程序用户代码模板函数
1 |
|
了解过bpf程序的框架之后,再分析程序就比较清晰了。将钩子挂在了当前程序的uprobed函数上,该函数内容为hash check,对flag的内容进行检测。
故关键处理在bpf代码,处理后的结果再进行比对,我们只需拿到bpf字节码反汇编逆出逻辑问题就解决了。
方法一:
可以直接在create_skeleton下找到ebpf字节码文件(elf),用ipython dump,当然最后看了wp发现binwalk直接分离是一种不错的方法。
1 |
|
分离出的是bpf字节码,IDA无法直接反汇编,需要找到相应的解释器。
saaph/eBPF_processor . disassemble eBPF bytecode
配置好后打开dump出的文件,选择EBPF,即可对字节码反汇编,查看汇编代码即可,主要是求解线性方程组,z3即可,通过hash来check flag是否正确
exp
1 |
|
方法二:
使用bpftool,bpftool是一个用来检查 BPF 程序和映射的内核工具。
bpftool prog
可以用来检查系统中运行程序的情况
bpf prog dump
获取到了程序标识符后,可以执行 bpf prog dump 来获取整个程序的数据,能够看到由编译器生成的字节码。
当然拿到编译器生成的字节码已经可读了,如果代码量大的话,则需要修改一下格式之后用C重新编译,详见Mas0n师傅的做法。
参考:
the shellcode
赛后复现,程序加了Themida / Winlicense v3.0.0.0 - 3.0.4.0
强保护壳,硬脱比较困难,并且壳代码有反调试,可以先运行,之后IDA attach来进行调试。
将the shell程序代码段的数据用IDA python批量转为代码,大小0x12f7。
1 |
|
之后通过运行时的输出字符定位关键处理函数。
首先对opcode进行base64解密,解密函数通过 密文<->索引表下标 的方式实现,之后又发现了位运算和魔改xxTea。
1 |
|
之后是逐字节循环左移3
1 |
|
xxTea将明文前一项右移5改为了右移6。
1 |
|
shellcode check成功,之后就是执行shellcode来解密flag。
用函数指针来调用解密的shellcode,以便进一步调试。
1 |
|
编译成32位
可执行文件,调试定位到flag的check点。
察check_num和v23的变化,发现基本结构一致,故只要让v22[i]=flag[i]-v17[i]%5,那么v23最终结果一定和check num相同,所有数据均可通过调试获得。
1 |
|
当然github上也能找到针对WinLicense/Themida 2.x 和 3.x脱壳的工具,不过attach这种方法更趋向于通解,即可能适用于多种壳型。
foreign challenges
浅浅记录一下近期国际比赛上的一些题目,容易踩坑或者考点比较新颖。
OFPPT-CTF . unicode
unicode2utf-8
题目给了一个flag.jpg.utf8
的文件,将图片存为了utf-8编码的格式。unicode-utf-8对照表
只需要将utf-8读入转为unicode编码,python3的chr和ord函数默认是以unicode编码来处理字符的,所以只需以utf-8编码格式读取数据,再用ord遍历就拿到了对应的unicode值。
1 |
|
codecs是python用于处理文本编码的包,支持多种编码。…其实这题挺坑的…
xxx_game
python打包的elf files
python打包的elf文件,之前多是打包exe,并且pyinstaller打包的exe图标很容易识别。还有一种是py2exe打包,较前者出现频率较少,并且打包exe文件查看strings窗口会有PY2EXE的字符。
根据strings窗口下很多py命名的函数,所以认为是经过了pyc文件经过打包生成的exe,直接用pyinstxtractor解包会出错,正确步骤如下。
参考Extracting Linux ELF binaries第一种简单的方法。
1 |
|
之后顺序同打包exe的解法一致。
picoCTF_game2
hide and exec code
通过对称加密算法来解码code并执行,当然可以通过给出高版本的pyc文件来让这个问题更有趣。
1 |
|
Gandalf Baba
apk-webview-js
webview
封装的apk程序,主要通过调用js来进行交互,需要进行get传参,并且请求头满足要求才能getflag。
js代码在assets文件下,内容如下。
1 |
|
其中并没有调用关键的flag函数,故可以添加该函数并重新打包签名,当然也可以直接逆向关键函数的逻辑,这里我采用后者。
对题目给出的网站get传入参数,满足其请求头的内容要求即可绕过Gandalf Baba成功拿到flag。
1 |
|
虎符的Contra 2048也采用的webview封装,对js和消息处理目前还不是太了解,之后会给出复现。
amazing_code
Evm Opcodes
打开附件,Evm Opcode,一般出现在智能合约的逆向,目前是有工具可以做到反编译的所以无需硬读。github- Evm Opcode对照 HEX
1 |
|
先将opcode转为16进制数据。
1 |
|
得到的16进制数据可以通过Online Solidity Decompiler在线反编译,结果可能有些偏差比较难读,关键部分还是要参考字节码文件。
1 |
|
analyse this code
1 |
|
可以返回字节码查看 ~ 到底对应着什么操作 XOR 和 NOT的hex十分接近,可能反编译器内部出了点问题。
exp
1 |
|
The End
还有一些题记不太清了,先暂时整理这些。最近还遇到许多遍历和搜索的算法题,如走图和dfs等,能还原正向算法,解不出就很难受并且无从下手,手撸党表示没机会。
摸的Rust
和IOT
之后也会整理一下,Rust就是硬调,IOT要熟悉信号用到的协议和一些分析工具等。
博客由于大创(其实去是峡谷想当yewang)等原因好久没更了,最近许多硬核赛题还没有复现,真是长路漫漫,学无止境(越摆越烂)啊!
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!