目前遇到最难的一场比赛了,Crypto打不动,只做了比较简单的RE还好苟进了决赛~(200多支队伍,几十支顺利签到
RE Clever Bird
1 | 00401D0E |. 66:0F6E45 8C movd mm0,[local.29] |
get score
1 | 00401D13 |. B9 D859375F mov ecx,0x5F3759D8 |
得到一个受score约束的值,公式如下,涉及单精度浮点数转换
0x5F3759D8 - (score >> 1) + 7
1 | 00401D65 |> \F3:0F108D 5CF>movss xmm1,[local.41] |
浮点数运算,其中两个变量分别是a=score/2以及前面得到的一个值b
res = ((1.5a-aaab)*1000000000+5)/10
00401DCA |. 81FF AE360400 cmp edi,0x436AE
check res == 0x436ae
得到一条函数式 ((1.5a-aaab)*1000000000+5)/10=0x436ae
b受a约束,且函数应该单调递减,缩小区间后爆score
1 | 00401E40 |> /8BD6 /mov edx,esi |
以score的二进制串依次逆序与*key+4开始比对
1 | 00401E80 |> /0FBE5435 C8 /movsx edx,byte ptr ss:[ebp+esi-0x38] |
比对key的前四位,这里是常量,前四位为B1RD
即key为’B1RD’ + reversed(bin(score))
求解代码
1 | import struct |
get flag
flag{B1RD010000000000000001}
ooollvm
ollvm混淆的题目,pintools大法可以跑出来,听说angr也可以
https://github.com/wagiro/pintool
脚本好像有点小问题
1 | password = tempassword[:i-1] + '\\'+**char** + tempassword[i:] |
log
1 | ➜ pintool-master python pintool.py -c 1,2,3 -b {_} -l 80 -a 64 -d '=> ' -i 'flag{' -d '=> 260' -s - ooollvm |
get flag
flag{thiiiis_aaaaive_but_hard_obfuscated_program_compiled_by_llvm_pass}
题目多解,提交
flag{this_is_a_naive_but_hard_obfuscated_program_compiled_by_llvm_pass}
才判对