2024长城杯初赛逆向
比赛吐槽
线上比赛还得队员在一起开摄像头,逆天比赛
题目不给分类
3h 20t?开玩笑吧
逆向部分题目质量不错
Tea
简单的tea,输入flag每8字节加密一次,一共加密5次,密钥固定
1 |
|
密钥key
tea算法
1 |
|
直接逆就行
1 |
|
Vm
虚拟机题,附件里面连符号都没去,很好分析
1 |
|
init_vm里面初始化了虚拟机PC,栈还有flag堆
1 |
|
vm_load把rom加载到PC处
vm_fill_input把输入flag复制到虚拟机的flag堆里面
主要分析虚拟机主函数vm_run
1 |
|
分析虚拟机指令
1 |
|
把rom导出,解析一下rom代码
1 |
|
1 |
|
逻辑很简单,先压32*2个数到栈里面,然后依次从flag取一个字节,先检查是否为空字符,是空字符直接返回,否则跟栈里的数先做乘法,再做异或,最后+1检查是否为0,为0循环,返回的时候会检查栈空
1 |
|
Time_Machine
这题比赛中没打完,挺有意思的父子进程题目
这道题ida的反编译很烂,看反编译分析干扰项太多
没有符号,先字符串定位
提示输入Enter The Flag:\n
跟提示flag正确Correct Flag :)\n
不在同一个地方
输入的地方结尾有个函数指针,下断点但是断不下来,交叉引用找入口
这里就是主函数,根据环境变量qazqweedccxz
决定进入的分支,当该环境变量存在的时,进入输入分支,看看另一个分支
设置环境变量qazqweedccxz=1
,然后开一个子进程并调试,子进程进输入分支,难怪断不下来,重新在main分支的地方下断点,手动进子进程分支,看看结尾出函数指针在干嘛
从输入的flag里取一个字节,也没发现有什么校验逻辑,但注意到ud2
指令(0F 0B
),运行到该指令会触发异常,由于父进程在调试子进程,所有分析父进程的操作逻辑
EXCEPTION_DEBUG_EVENT = 1
当调试出现异常时进入前面看到的输出Correct Flag :)\n
的函数
断点调试一下
先是获取寄存器信息
1 |
|
然后是读两个字节的内存
计算一下这里的偏移,lpContext+0xF8
,刚好是RIP的偏移,即从读两字节出错的指令
接着检查这两个字节是否为0F 0B
,很巧,刚好是子进程中的ud2
,很明显这里在捕获子进程在ud2
指令出错
第一次异常不是ud2
,直接退出了,F9接着调,中间很像flag校验的地方,先忽略,看后面写内存的地方
往RIP写两个字节0x90
,把出错的ud2
直接nop
掉了
父进程调试子进程思路基本明确,子进程靠错误指令ud2
触发异常,父进程nop
掉异常指令恢复子进程运行
接下来分析中间的校验部分
取r12b,进行加密操作后结果与r11d校验,最后检查r13是否为1,两个校验都通过,计数器+1,计数器等于0x1C时输出正确
分析一下加密函数
因为输入的只有1个字节,中间只会case 1
直接把1字节的256中结果全算出来,后面直接查表
1 |
|
回到子进程的奇怪代码
现在就知道子进程在干嘛了,先从flag取一个字节到r12b,再计算r11d,给r13赋值,前面分析父进程知道只有在r13==1
时才进行校验,用idapython解析一下,在r13==1
时查表r11d得到r12b,即得到flag的一个字节
1 |
|