2019 OGeek 线上赛
最后排名第四,大哥们tql。
赛题质量还不错。第一天跟X-NUCA冲突了,第二天匆忙做了几道题。时间不够有几题题目都没看到,再加上还在XMAN挖洞,整体时间非常赶。。。
比赛时间:8月24-8月25日
Reverse
8V
V8的汇编代码。
简单的异或加密,每次异或密钥的值都会改变
1 | res = "\xd2\"\xf1\x8d\xb7\xe0\xd0MF\x87T?\x1fI\x1c\xe7\xcb\x07\xc3\x95z\xb3z\x0b\xbb\xdb\xa1I\xc5;" |
babyre
lz77压缩算法,写出解压算法
1 | f = open("output.file","rb") |
解压后打开bmp得到flag
King of KOF
一个KOF的安装包。一开始不知道安装包是nisi,硬调的。
注意到40B5A8
和40BDA8
是用来存放临时字符串的。
sub_401434
是nisi的解释器。
安装后需要输入注册码。查找字符串查不到提示语。
用CE查找UTF16字符串,很快能找到提示语。在附近观察字符串,注意到一些比较有用的信息:这是注册码
,注册码校验失败后的提示信息,fnCheck
,fnKoF97
,Base64Encode
,一些提示输入flag的提示语,还有一串base64字符串:
1 | cYZ1KIjhiR7Ol4RN9c0Xh7XryYfUD7A0m96h0/MQMI45mVhgTAnAtENpnzVKhfDZpVzfuiCBx5+BctkWo0GfU5qIYQV1bnFbNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1zYqDbEN0VbXNioNsQ3RVtc2Kg2xDdFW1w= |
b64decode再hexencoe得到:
1 | 7186752888e1891ece97844df5cd1787b5ebc987d40fb0349bdea1d3f310308e399958604c09c0b443699f354a85f0d9a55cdfba2081c79f8172d916a3419f539a886105756e715b36c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5cd8a836c437455b5c |
可以看到,后面有一长串8个字符重复,估计都是同样的字符加密,padding长度是8,估计都是由''*8加密得到的密文。分组长度为8的加密一开始想到的就是des,但是没有密钥。
跟踪调试几步后,发现在40B5A8
和40BDA8
对比了输入和常量,常量是用UTF-16存储的,之前的字符串这是注册码
就是注册码
之后校验flag的部分比较复杂,观察这两个地方的数据,注意到在user\AppData\Local\Temp\nsiF181.tmp
目录创建了一些临时dll。同时从0-255遍历每个字符,可能是获取字符的ascii的utf-16值?遍历完所有后跟踪不久可以发现多了一个奇怪的KOF91.dll
复制出来ida打开,发现加了壳,不过是比较简单的壳。
重新开始调试,这次在输入flag之后,x86dbg选项中打开加载dll后中断,可以看到KOF97.dll被加载了,入口点在8000,81C4壳的代码执行完成。这时候就可以用插件把dlldump下来了。
dump后发现fnCheck与fnKoF97两个函数。这两个就是校验与加密函数,加密算法是TEA,密钥在算法内。用它来解密之前的密文,得到
1 | dj_eyucjamkc]rm]rfc]emmb+mjb+b_wq{ |
发现前四个字符和flag字符偏移固定为2,是个凯撒密码,加密可能在之前的nisi里面。修正一下得到flag
1 |
|
Mobile
mblockchain
jadx打开后看java代码。
需要输入key和flag。key算一次md5后,取其中的三个字符再md5,md5值作为aes的key加密flag,之后重复md5之前的哈希作为key继续加密9次,一共十次。爆破这三个字符即可。
1 | from Crypto.Cipher import AES |