首页
社区
课程
招聘
[原创][2020][KCTF] 第十三题 猪突豨勇 wp
发表于: 2020-5-17 12:56 10507

[原创][2020][KCTF] 第十三题 猪突豨勇 wp

ccfer 活跃值
16
2020-5-17 12:56
10507

一 小猪上路
展开images,bin下拿到主程序kanxue2020

decode_step1:
即“黯然销魂蛋炒饭”的前34个变化,除了代码长没啥,IDA中可F5,每个变化用不同的初始化向量重新生成key,每个变化的256字节置换表都不同的全局变量

decode_step2:
这个是比较难搞的部分,花了很多时间,是个js虚拟机,经高人看了看字节码便指点出这是个叫duktape的js引擎
字节码在byte_2348CB,先加载字节码,然后调用函数h(hexstr(step1_result))计算返回结果

decode_step3:
首先注意到:
.text:00073324 ADD R1, PC, R1 ; "skcipher"
然后调试到里面会遇若干次svc调用,这是带kernel交互的啊,我感到迷茫,从没调试过这玩意
大帅锅同学这时候把调试方法和kernel展开文件准备好了,我学习了一下就继续分析算法了
深入调试得到sub_C0171EE0是setkey,sub_C0171D74是decrypt

这个setkey和encrypt与setp1里的34重蛋炒饭相似度很高啊(记住这个要点,后面step2就靠这个猜想了)

二 杀猪儆猴
decode_step1和decode_step3算法结构相似,只是密钥和置换表不同
我没有逆setkey部分,直接内存中dump出setkey之后的结果,传给decrypt就行了
decode_step1里1~34种蛋炒饭,举例第一次setkey结束的情况:
.text:00018EB8 STR R3, [SP,#0xAF0+key+0x3C] //这是setkey最后一步
.text:00018EBC MOV R11, #0 //从这开始循环解密数据
虽然34种蛋炒饭比较长,但都是相同结构,费些体力就解决了

decode_step3是kernel中前面已经贴了F5的代码,按简介这个就是第36种蛋炒饭了,和decode_step1同理可解决

剩下的最后难点就是decode_step2了:
1.在不知道是js引擎的情况下调试了若干次,晕头转向
2.在知道了是js引擎,但不知道是哪种js引擎的情况下调试了若干次,继续晕头转向
3.在知道了是duktape的js引擎的情况下调试了若干次,仍然晕头转向

这个时候貌似要靠猜想了,第35种蛋炒饭?
咱就假设它和其它已知的35种蛋炒饭一样的算法结构行不?试试看吧
已知的蛋炒饭算法都是异或和循环移位
找来duktape的源码,编译examples\cmdline可以测试字节码,经验证结果是匹配的
在代码里找到void duk__vm_bitwise_binary_op(...)这个函数,把异或和移位操作都打印出log
例如xor的:

重新编译,运行dukcmd -b -i op.bin
测试得到log,列举一段:

这样就可以把key都获取到了
观察字节码可以看到:

_0x2a08,_0x22b3,a这些都是变量名
可以输出查看:

这前面那个256字节的数组sbbbc经验证就是置换表
其实如果自己实现setkey就更好搞了,把ccccckksgh和ffffffdk传给setkey就行了

三 吃蛋炒饭喽
整理前面分析流程,写出代码没几行,大部分都是key数据和置换表
运行得到结果:18542cf63f2508f9632e6f8a49e0c298
而且发现因为没有区分字母大小写而存在多解共512个

dukcmd工具、字节码和keygen见附件


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-5-17 13:01 被ccfer编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (14)
雪    币: 195
能力值: ( LV4,RANK:57 )
在线值:
发帖
回帖
粉丝
2
太强了 膜大佬
2020-5-17 17:32
0
雪    币: 11705
活跃值: (975)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
3
强大, 最后一题, 画龙点睛了。 
2020-5-17 17:47
0
雪    币: 449
活跃值: (189)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
厉害,厉害,佩服,佩服!
2020-5-17 18:47
0
雪    币: 6064
活跃值: (12624)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
5
真心佩服,我第二道关卡一直没走出来
2020-5-17 19:50
0
雪    币:
活跃值: (13)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
太强了!!!!
2020-5-17 20:27
0
雪    币: 408
活跃值: (156)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
hexer收下我的膝盖,完全看不懂
2020-5-18 11:24
0
雪    币: 211
活跃值: (526)
能力值: ( LV9,RANK:172 )
在线值:
发帖
回帖
粉丝
8
太强了
2020-5-18 11:54
0
雪    币: 162
活跃值: (170)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
WOC  膜拜
2020-5-18 16:18
0
雪    币: 162
活跃值: (170)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
10
我刚接触MSIC相关  我现在就是有个问题就是  我的固件可以直接挂在IDA上调试Linux系统   也可以单独调试从固件文件系统中提取的ELF文件  但是我怎么才能在被调试的系统中找到我想要调试的对应的ELF文件?通过端点么?
2020-5-19 14:46
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
11
禾之舟 我刚接触MSIC相关 我现在就是有个问题就是 我的固件可以直接挂在IDA上调试Linux系统 也可以单独调试从固件文件系统中提取的ELF文件 但是我怎么才能在被调试的系统中找到我想要调试的对 ...
别人教我的,停在0000000的时候就可以到目标地址下断点,虽然还看不到真实代码,默认的是硬件执行断点
2020-5-19 20:48
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
12
 大佬,关注了
2020-5-20 09:46
0
雪    币: 13
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好牛逼
2020-5-20 11:16
0
雪    币: 162
活跃值: (170)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
14
ccfer 别人教我的,停在0000000的时候就可以到目标地址下断点,虽然还看不到真实代码,默认的是硬件执行断点
停在0000的时候就是0地址RESET 复位中断的入口了   这个在bootloader  入口处    再跟踪下去进入操作系统了  但是我没办法追踪到对应的任务  ,像一些嵌入式实时操作系统可以获取到里面的任务有办法直接跟踪  但是像Linux这种复杂的我就没办法了  头疼
2020-5-20 19:23
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
收徒吗,想学
2020-11-24 14:03
0
游客
登录 | 注册 方可回帖
返回
//