- 出题人:ZERO-A-ONE
- Date:2021-07-27
0x1 出题意图
本赛题主要是向选手介绍一种不同于常用的LLVM IR的中间语言。VEX-IR是一套中间语言。使用它的是 Valgrind 插桩框架工具,它的设计思想类似LLVM与QEMU,为了模拟执行已经编译好的某种架构的程序,把目标代码转化为IR中间语言,再把 IR 翻译为本机架构可执行的机器语言,实现跨架构模拟执行,多用于没有源码的二进制程序分析。分析二进制程序,例如做类似插桩的工作时,失去了高级语言的抽象表达,不得不与更底层的部分打交道,即 CPU、寄存器、虚拟内存等
LLVM与QEMU其实本身并不是以安全分析为出发点的平台,只是因为他们过于完善和强大,所以有很多基于他们的改进工作来做程序安全分析。而 Valgrind 则是以安全为出发点开发的插桩框架,也相对成熟流行
私以为看过学习过LLVM框架中的IR语言语法,再看VEX的IR语言语法,其实可以触类旁通
0x2 出题过程
鉴于此题定位难度较低,于是选择了比较简单的凯撒密码,首先使用C语言编写的凯撒密码的加密程序,使用GCC编译
#include<stdio.h>
#include<string.h>
using namespace std;
int main() {
char flag[] = "t1me_y0u_enj0y_wa5t1ng_wa5_not_wa5ted";
int k = 3;
char l[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
for(int i=0;i<37;i++) {
if((flag[i]+k)<='Z')
{flag[i] = flag[i] + k;}
else
{
int j = (flag[i]+k-'Z') % 26;
flag[i] = l[j-1];
}
}
return 0;
}
然后对其进行编译,为了更好的方便Angr动态符号执行工具进行运行使用以下参数进行编译:
gcc -m32 -no-pie test.c -o test
然后我使用接下来的脚本就行VEX-IR的提取:
import angr
import monkeyhex
from angr import sim_options as so
def main():
#Run Initialization
p = angr.Project('./test',auto_load_libs=False)
extras = {so.REVERSE_MEMORY_NAME_MAP, so.TRACK_ACTION_HISTORY}
es = p.factory.entry_state(add_options=extras)
sm = p.factory.simulation_manager(es, save_unconstrained=True)
#Set Target Address
mainAddr = 0x8048464
EndAddr = 0x080485E8
#Run to mainAddr
sm.explore(find=mainAddr)
es = sm.found[0]
EndAddr = es.solver.BVV(EndAddr,32)
maybe = es.regs.eip == EndAddr
sm = p.factory.simulation_manager(es, save_unconstrained=True)
num = 0
while es.solver.is_false(maybe):
block = p.factory.block(es.solver.eval(es.regs.eip))
#print(block.pp())
print(block.vex)
sm.step()
sm.active
es = sm.active[0]
maybe = es.regs.eip == EndAddr
num = num + 1
'''
with open('log.txt', 'a') as f:
f.writelines(block.vex)'''
block = p.factory.block(es.solver.eval(es.regs.eip))
#print(block.pp())
print(block.vex)
'''
with open('log.txt', 'a') as f:
f.writelines(block.vex)
print("All Show!")
print(num)'''
main()
而后获得VEX-IR代码,往常我们使用Angr在CTF题目中都是比较初级的应用,通过出题和之前的研究我逐渐掌握了使用Angr对二进制程序就行逐步调试的能力,和Angr更多对于整个程序运行过程中对于寄存器和内存的细微操作。对于我之后使用Angr进行更高级的操作奠定了基础
0x3 题面
中文:
你好呀,来自世界各地的勇者们!我曾听说有一种技术叫做符号执行。我们抓获了一个加密程序在符号执行中的运行过程,你可以告诉我它的加密结果吗?
英文:
Hello, brave men from all over the world! I have heard that there is a technique called symbolic execution. We have captured the running process of an encryption program in symbolic execution. Can you tell me its encryption result?
0x4 WriteUP
通过分析可以知道这是VEX-IR中间代码,通过阅读VEX-IR中间代码可以获知这是一个凯撒密码的加密过程,且K为3,明文为:t1me_y0u_enj0y_wa5t1ng_wa5_not_wa5ted,将明文进行凯撒加密
最后可以获得flag:C4VNHH3DHNWS3HHFJ8C4WPHFJ8HWXCHFJ8CNM