周末花了几个小时看了一下题目,做了几道逆向
cycle graph
有向图求通路,长度16,然后根据节点权值就可以计算flag,节点只有32个直接手工画个树状图一下子就搞定了,代码都不用写
1 | ''' |
天津垓
简单SMC,先check password,然后利用password解密一个函数。自行解密之后将二进制数据覆盖掉原数据,重载进ida,逆一下这个函数很容易就可以算出flag了
1 | # cal password |
easyparser
常规虚拟机,指令清晰明了,五星好评
指令固定24bytes,一个操作码,两个操作数各占8bytes
有4个函数是用虚拟机实现的,功能分别是输出提示性信息并获取输入、初始化虚拟机数据段、变换虚拟机数据段以及最后的check
1 | case 0: // mov ds[reg],imm |
共32条指令、opcode比较长,手动反汇编不太现实,直接写个反汇编器将opcode扔进去就可以得到四个函数的汇编代码了,接下来就是常规操作了,check部分主要逻辑非常简单
1 | 28: xor r9,r9 |
get flag
1 | ds = [199, 387, 83, 295, 187, 115, 79, 119, 119, 295, 263, 143, 99, 63, 107, 295, 331, 295, 183, 99, 95, 107, 63, 295, 199, 123, 103, 135, 147, 99, 319, 295] |
所有代码(包含反汇编器等)
1 | code0 = [ |
fxck!
逻辑是将输入进行base58编码,然后与虚拟机执行后的结果比对
题目有点问题,原始题目因为opcode的问题只比对了编码后的第一个字符,后来更新了题目,程序直接在最后明文比对,dump出编码表和虚拟机执行后的结果,解base58即可
1 | import base58 |