RCTF-2021-Valgrind赛题WP

  • 出题人: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

0x5 参考资料

猜你喜欢

转载自blog.csdn.net/kelxLZ/article/details/120270212