-
-
[原创]CTF2019晋级赛Q2第五题分析(qwertyaa)
-
2019-6-13 16:46 2453
-
首先用 jadx,反编译 Java 层 MainActivity
的代码,可以看到疑似调用了 JNI 层的 gogogoJNI.check_key
,但这个函数本身校验的串只能由 \00\01
组成,是个陷阱。
实际上看到的样式是 HTML,根据被调用的所谓 text1View
的 loadUrl
可以猜测这实际上是个网页,网页地址由 JNI 层的函数 XOR 解码得来,为 http://127.0.0.1:8000/
。JNI 层中的 JNI_OnLoad
里可以看到是在通过建立一个发送 so 文件内部分内容异或结果的 http 来提供这个网页。
我们可以直接用电脑访问手机 IP 来得到内容,核心校验逻辑在一个 WASM 模块中。可使用
require('fs').writeFileSync('aa.wasm',new Uint8Array(` //HEX 内容 `.trim().split(/[\s\r\n]+/g).map(str => parseInt(str, 16)) ))
来获得 wasm 文件内容。可以采用 wabt 工具的 wasm2c 来将内容转译为 c 代码,删去函数调用层数、memory 访问越界检查后用 gcc -O3
编译 c 文件后将 ELF 文件用 ida 打开就可以看到基本是人可看的代码(冗余内容被优化掉了)。
可以看到关键的 check_key
以外的函数仅将读取到的内容存入内存,而这个函数首先将这些内容的每个字节进行异或后得到 32 个变量,判断这 32 个值的线性组合是否等于特定值。
可将方程输入 Mathematica 求解,如下:
Solve[45*v32 + 248*v33 + 48*v31 + 90*v28 + 135*v29 + 106*v38 + 233*v19 + 188*v20 + 67*v13 + 232*v42 + 240*v48 + 124*v47 + 174*v57 + 153*v58 + 67*v62 + 194*v37 + 111*v34 + 108*v53 + 92*v54 + 81*v46 + 126*v49 + 103*v39 + 161*v40 + 50*v45 + 144*v6 + 15*v41 + 127*v12 + 19*v35 + 231*v43 + 40*v44 + 112*v23 + 20*v27 == 359512 && v31 + 12*v31 + 56*v28 + 154*v29 + 149*v27 + 156*v38 + 32*v43 + 225*v19 + 26*v35 + 148*v6 + 180*v45 + 40*v40 + 194*v39 + 248*v48 + 171*v46 + 195*v54 + 78*v34 + 244*v62 + 101*v57 + 209*v58 + 81*v37 + 227*v53 + 10*v47 + 186*v49 + 212*v41 + 104*v12 + 90*v42 + 17*v13 + 178*v20 + 169*v44 + 94*v23 + 120*v33 + 131*v32 == 387514 && 145*v32 + 136*v33 + 240*v31 + 202*v29 + 38*v23 + 197*v44 + 154*v42 + 248*v41 + 67*v6 + 69*v40 + 46*v49 + 30*v47 + 95*v54 + 44*v34 + 117*v62 + 53*v57 + 9*v58 + 131*v37 + 83*v53 + 36*v46 + 55*v48 + 109*v39 + 40*v12 + 8*v13 + 86*v35 + 112*v19 + 251*(v20 + v45) + 174*v43 + 14*v38 + 188*v27 + 60*v28 == 301487 && 25*(v57 + v32) + 155*v33 + 140*v29 + 48*v27 + 65*v23 + 105*v38 + 45*v44 + 148*v13 + 5*v41 + 7*v39 + 102*v47 + 152*v53 + 35*v62 + 33*v58 + 57*v37 + 162*v34 + 112*v54 + 139*v46 + 182*v48 + 10*v49 + 145*v40 + 127*v45 + 30*v6 + 165*v12 + 109*v42 + 110*v20 + 113*v19 + 192*v43 + 116*v28 + 234*(v31 + v35) == 296549 && 82*v31 + 151*v28 + 156*v23 + 29*v44 + 76*v19 + 241*v42 + 130*v45 + 197*v49 + 141*v47 + 7*v46 + 118*v37 + 34*v58 + 113*v57 + 10*v62 + 189*v34 + 101*v53 + 236*v54 + 148*v48 + 104*v39 + 45*v40 + 164*v41 + 88*v12 + 39*v13 + 107*v35 + 108*(v6 + v20) + 210*v43 + 90*v38 + 97*v27 + 139*v29 + 209*v33 + 46*v32 == 344514 && 25*v28 + 153*v23 + 26*v42 + 237*v6 + 163*v39 + 230*v48 + 155*v47 + 225*v46 + 182*v53 + 13*v34 + 240*v58 + 49*v62 + 102*v37 + 50*v54 + 3*v49 + 38*v40 + 176*v45 + 105*v41 + 203*v12 + 115*v13 + 111*v35 + 96*v19 + 72*(v20 + v57) + 139*v43 + 117*v44 + 120*v38 + 90*v27 + 151*v29 + 179*v31 + 98*v33 + 7*v32 == 346892 && 97*v32 + 13*v33 + 156*v31 + 254*v27 + 187*(v40 + v44) + v43 + 67*v35 + 226*(v13 + v54) + 252*v12 + 100*v45 + 110*v47 + 170*v53 + 174*v58 + 61*v57 + 129*v62 + 150*v34 + 101*(v46 + v37) + 99*v48 + 127*v49 + 209*v39 + 203*v6 + 186*v41 + 39*v42 + 225*v19 + 65*v20 + 22*v38 + 214*v23 + 74*v29 + 99*v28 == 386678 && 134*v28 + 139*v43 + 218*v42 + 242*v41 + 133*v49 + 177*v46 + 88*v34 + v53 + 232*v37 + 171*v58 + 117*v57 + 220*v62 + 118*v54 + 60*v47 + 252*v48 + 222*v39 + 32*v40 + 48*v45 + 185*v6 + 240*v12 + v13 + 81*v20 + 22*v35 + 73*v19 + 72*v44 + 62*v38 + 106*v23 + 19*v27 + 156*v29 + 154*v31 + 77*v33 + 94*v32 == 348667 && 38*v28 + 48*v23 + 131*v43 + 247*v35 + 91*v20 + 143*v42 + 96*v45 + 117*v40 + 7*v39 + 75*v49 + 232*v48 + 75*v46 + 173*v34 + 122*v58 + 151*v57 + 19*v62 + 39*v37 + 189*v53 + 41*v54 + 26*v47 + 95*v6 + 130*v41 + 228*v12 + 211*v13 + 43*v19 + 52*v44 + 29*v38 + 242*v27 + 111*v29 + 220*v31 + 162*v33 + 70*v32 == 316884 && 112*v32 + 14*v33 + 189*v29 + 77*v23 + 126*v43 + 119*v35 + 233*v20 + 174*v13 + 214*v12 + 20*v45 + 220*v49 + 25*v46 + 104*v37 + 150*v62 + 92*v57 + 143*v58 + 136*v34 + 236*v53 + 147*v54 + 79*v47 + 204*v48 + 233*v39 + 165*v40 + 38*v6 + 120*v41 + 18*v42 + 244*v19 + 226*v44 + 33*v38 + 160*v27 + 5*v28 + 231*v31 == 372620 && 109*v28 + 135*v27 + 184*v23 + 216*v43 + 167*v19 + 170*v42 + (v12*64) + 183*v6 + 172*v39 + 94*v46 + 193*v54 + 38*v34 + 203*v57 + 98*v62 + 250*v37 + 191*v53 + 212*v47 + 175*v48 + 39*v49 + 171*v40 + 163*v45 + 165*v41 + 129*v13 + 199*v20 + 2*(v35 + v58) + 252*v44 + 187*v38 + 97*v29 + 50*v31 + 192*v33 + 88*v32 == 413102 && 136*v33 + 217*v28 + 193*v23 + 193*v38 + 208*(v20 + v6 + v42) + 58*v19 + 62*v35 + 51*v12 + 155*v45 + 149*v40 + 199*v49 + 46*v46 + 104*v37 + 106*v62 + 196*v57 + 117*v58 + 81*v34 + 203*v53 + 252*v54 + 248*v47 + 156*v48 + 240*v39 + 95*v41 + 102*v13 + 72*v43 + 23*v44 + 147*v27 + 226*v29 + 43*v31 + 16*v32 == 428661 && 112*v32 + 125*v28 + 135*v29 + 105*v27 + 220*v38 + 158*v19 + 67*v42 + 38*v12 + 214*v6 + 152*v39 + 83*v48 + 225*v47 + 224*v54 + 107*v37 + 49*v57 + 75*v58 + 216*v62 + 69*v34 + 144*v53 + 10*v46 + 15*v49 + 24*v40 + 136*v45 + 208*v41 + 165*v13 + 201*v20 + 180*v35 + 111*v43 + 65*v44 + 211*v23 + 80*v31 + 122*v33 == 371484 && 205*v33 + 76*v31 + 195*v28 + 74*v29 + 251*v27 + 75*v44 + 63*v20 + 58*v19 + 190*v13 + 71*v42 + 149*v6 + 166*v45 + 107*v39 + 127*v54 + 143*v53 + 51*v37 + 129*v57 + 132*v58 + 90*v62 + 68*v34 + 9*v46 + 88*v48 + 153*v49 + 178*v40 + 177*v41 + 99*v12 + 233*v35 + 109*v43 + 95*v38 + 152*(v23 + v47) + 8*v32 == 350848 && 31*v31 + 97*v27 + 5*v23 + 86*v38 + 88*v43 + 133*v20 + 161*v12 + 67*v6 + 177*v40 + 182*v49 + 245*v46 + 146*v34 + 30*v58 + 102*v57 + 253*v62 + 38*v37 + 209*v53 + 59*v54 + 40*v47 + 56*v48 + 202*v39 + 126*v41 + 95*v42 + 26*v13 + 123*v35 + 163*v19 + 219*v44 + 156*v28 + 183*(v45 + v29) + 43*v33 + (v32*128) == 334408 && 152*v28 + 247*v27 + 5*v23 + 159*v38 + 154*v43 + 192*v20 + 142*v12 + 171*v41 + 170*v42 + 77*v6 + 22*v40 + 155*v48 + 137*v54 + 7*v62 + 178*v58 + 136*v57 + 228*v37 + 223*v34 + 146*v53 + 92*v46 + 226*v47 + 170*v49 + 17*v39 + (v45*128) + 20*v13 + 49*v35 + 200*v19 + 42*v44 + 251*v29 + 91*v31 + 145*v33 + 39*v32 == 382822 && 104*v28 + 220*v23 + 173*v43 + 116*v20 + 123*v12 + 149*v6 + 197*v45 + 221*v49 + 244*v54 + 26*v37 + 231*v58 + 56*v62 + 204*v34 + 169*v53 + 205*(v57 + v46) + 77*v47 + 134*v48 + v40 + 47*v39 + 195*v41 + 219*v42 + 82*v13 + 80*v35 + 13*v19 + 192*v44 + 224*v38 + 152*v27 + 108*v29 + 121*v31 + 84*v33 + 226*v32 == 420160 && 204*v28 + 194*v23 + 70*v43 + 252*v44 + 118*(v20 + v47) + 92*v19 + 67*v35 + 171*v13 + 111*v42 + 184*v45 + 142*v49 + 171*v46 + 176*v54 + 184*v53 + 45*v34 + 219*v58 + 95*v57 + 48*v62 + 161*v48 + 83*v39 + 233*v40 + 215*v6 + 182*v41 + 126*(v37 + v12) + 21*v38 + 150*v27 + 245*v29 + 73*v31 + 39*v33 + 85*v32 == 402263 && 170*v31 + 195*v28 + 154*v29 + 250*v27 + 204*v38 + 84*v19 + 75*v13 + 72*v41 + 34*v40 + 3*v48 + 94*v46 + 164*v54 + 48*v53 + 138*v37 + 120*v57 + 40*v58 + 175*v62 + 224*v34 + 92*v47 + 191*v49 + 50*v39 + 167*v45 + 19*v6 + 238*v12 + 15*v42 + 111*v20 + 216*v35 + 145*v43 + 112*v44 + 140*v23 + 202*v33 + 169*v32 == 366968 && 170*v31 + 172*(v41 + v29) + 25*v27 + 147*v44 + 149*v19 + 63*v20 + 247*v35 + 23*v13 + 96*v12 + 56*v39 + 240*v48 + 5*v46 + 189*v54 + 183*v58 + 68*v57 + 246*v62 + 50*v37 + 112*v53 + 247*v47 + 164*v49 + 4*v45 + 19*(v40 + v34) + 139*v6 + 254*v42 + (v43*128) + 243*v38 + 213*v23 + 144*v28 + 106*v33 + 176*v32 == 384909 && 78*v33 + 125*v28 + 136*v27 + 93*v38 + 252*v44 + 223*(v20 + v58) + 156*v35 + v42 + 65*v6 + 74*v40 + 149*v47 + 184*v53 + (v37*128) + 31*v57 + 27*v62 + 22*v34 + 183*v54 + 113*v46 + 227*v49 + 159*v39 + 170*v45 + 211*v12 + 174*(v41 + v48) + 186*v13 + 253*v19 + 241*v43 + 148*v23 + 248*v32 + 41*(v31 + v29) == 425203 && 113*v32 + 13*v33 + 82*v31 + 105*(v46 + v29) + 243*v27 + 212*v44 + 140*(v35 + v12) + 181*v42 + 46*v40 + 155*v45 + 239*v49 + 242*v54 + 237*v34 + 39*v57 + 170*v58 + 198*v62 + 155*v53 + 99*v48 + 145*v47 + 43*v39 + 3*v6 + 75*v41 + 208*v13 + 197*v20 + 10*(v19 + v37) + 142*v43 + 27*v38 + 186*v23 + 118*v28 == 372162 && 19*v28 + 159*v23 + 139*v19 + 202*v13 + 185*v41 + 180*v39 + 96*v45 + 40*v40 + 7*v49 + 17*v46 + 206*v34 + 127*v54 + 58*v37 + 199*v58 + 50*v57 + 3*v62 + 207*v53 + 91*v47 + 63*v6 + 68*v12 + 72*v42 + 240*v20 + 36*v35 + 76*v43 + 229*v44 + 87*(v48 + v27) + 94*v29 + 45*v33 + 6*v32 + 136*(v31 + v38) == 297509 && 90*v31 + 108*v28 + 221*v23 + 144*v38 + 35*v43 + 9*v20 + 63*v12 + 114*v40 + 83*v48 + 202*v46 + 40*v54 + 115*v53 + v62 + 138*v58 + 12*v57 + 166*v37 + 215*v34 + 87*v47 + 74*v49 + 149*v39 + 76*v45 + 218*v41 + 123*v42 + 204*v13 + 172*v35 + 38*v19 + 200*v44 + 245*v27 + 235*(v6 + v29) + 153*v33 + 184*v32 == 372215 && 248*v33 + 122*v28 + 224*v27 + 12*v38 + 240*v35 + 190*v13 + 62*v42 + 61*v6 + 3*v39 + 84*v47 + 123*v53 + 28*v62 + 36*v57 + 150*v58 + 180*v37 + 190*v34 + 55*v54 + 116*v46 + 231*v48 + 81*v49 + 94*v40 + 142*v12 + 187*v41 + 225*v20 + 179*v19 + 77*v43 + 85*(v45 + v44) + 196*v23 + 144*v29 + 114*v31 + 143*v32 == 370337 && 190*v31 + 103*v28 + 95*v38 + 32*v43 + 74*v19 + 191*v42 + 13*v6 + 176*v40 + 154*v47 + 202*v34 + 40*v54 + 224*v37 + 7*v62 + 70*v58 + 2*v53 + 241*v46 + 65*v48 + 213*v39 + 122*(v45 + v57) + 14*v12 + 30*(v13 + v49) + 80*v20 + 116*v35 + 189*v44 + 76*v23 + 201*v27 + 158*(v41 + v29) + 204*v33 + 91*v32 == 314564 && 160*v28 + 31*v38 + 162*v35 + 205*v12 + 199*v45 + 75*v49 + 155*v47 + 95*v46 + 42*v53 + 248*v62 + 30*v58 + 102*v57 + 74*v57 + 165*v37 + 154*v34 + 223*v54 + 101*v48 + 14*v39 + 158*v40 + 253*v6 + 89*v41 + 202*v42 + 110*v13 + 67*v19 + 115*v43 + 83*(v20 + v44) + 27*v23 + 66*v27 + 118*v29 + 5*v31 + 88*v33 + 44*v32 == 325974 && 65*v32 + 5*v29 + 163*v23 + 123*v44 + 114*v35 + 150*v41 + 180*v45 + 146*v49 + 243*v47 + 160*v37 + 34*v58 + 84*v57 + 207*v62 + 168*v34 + 34*v53 + 41*v48 + 235*v39 + 185*v40 + 62*v6 + 140*v42 + 10*v13 + 35*v19 + 38*v43 + 208*(v12 + v38) + 111*v27 + 29*(v46 + v28) + 125*(v31 + v20) + 72*(v33 + v54) == 307088 && 140*v31 + 167*v44 + 67*v13 + 178*v42 + 16*v41 + 116*v39 + 44*v47 + 11*v34 + 152*v58 + 197*v57 + 127*v62 + 175*v37 + 18*v53 + 100*v46 + 128*v48 + 32*v49 + 253*v40 + 213*v45 + 171*v12 + 7*v35 + 162*v19 + 78*v43 + 97*v20 + 97*v38 + 177*v23 + 21*v6 + 21*v27 + 155*v28 + 26*v29 + 26*v54 + 243*v33 + 188*v32 == 322340 && 113*v32 + 242*v29 + 90*v28 + 7*v57 + 7*v27 + 193*v23 + 138*v38 + 233*v20 + 91*v13 + 89*v12 + 34*v45 + 9*v49 + 47*v46 + 110*v34 + 164*v54 + 193*v62 + 208*v37 + 140*v53 + 72*v47 + 113*v48 + 166*v39 + 51*v40 + 179*v6 + 184*v41 + 162*v42 + 156*v19 + 127*v35 + 127*v58 + 244*v43 + 183*v44 + 152*v31 + 252*v33 == 380716 && 244*v32 + 196*v33 + 197*v31 + 30*v27 + 171*v43 + 252*v44 + 206*v19 + 153*v20 + 67*v42 + 164*v6 + 10*v40 + 97*v49 + 173*v47 + 133*v53 + 100*v62 + 210*v58 + 146*v37 + 105*v34 + 75*v57 + 75*v54 + 142*v46 + 27*v48 + 15*v39 + 177*v45 + 141*v41 + 189*v12 + 239*v13 + 108*v35 + 249*v38 + 84*v23 + 7*v29 + 168*v28 == 393331 && 196*v33 + 218*v40 + 218*v28 + 221*v23 + 127*v38 + 47*v44 + 156*v13 + 198*v42 + 75*v12 + 146*v41 + 220*v6 + 235*v45 + 63*v39 + 230*v48 + 3*v46 + 221*v34 + 186*v37 + 241*v62 + 61*v58 + 79*v57 + 147*v53 + 57*v54 + 69*v47 + 167*v49 + 204*v20 + 197*v35 + 59*v19 + 179*v43 + 135*v27 + 210*v29 + 53*v31 + 185*v32 == 430295, {v32, v33, v31, v28, v29, v38, v19, v20, v13, v42, v48, v47, v57, v58, v62, v37, v34, v53, v54, v46, v49, v39, v40, v45, v6, v41, v12, v35, v43, v44, v23, v27}]
得到:
{{v32 -> 108, v33 -> 117, v31 -> 51, v28 -> 115, v29 -> 117, v38 -> 95, v19 -> 100, v20 -> 99, v13 -> 116, v42 -> 95, v48 -> 105, v47 -> 116, v57 -> 51, v58 -> 101, v62 -> 51, v37 -> 51, v34 -> 48, v53 -> 83, v54 -> 109, v46 -> 101, v49 -> 109, v39 -> 108, v40 -> 49, v45 -> 116, v6 -> 95, v41 -> 49, v12 -> 101, v35 -> 48, v43 -> 95, v44 -> 49, v23 -> 115, v27 -> 102}}
最后用 python 将被异或的内容还原即可:
from z3 import * from sympy import * memory=[0]*2048 for i in range(1024,1024+32): memory[i]=BitVec('a['+str(i-1024)+']',32) #s.append(memory[i]&0xff==memory[i]) memory[1224]=32 v37 = memory[1027]; v52 = memory[1025]; (v54) = memory[1026]; v55 = memory[1024]; v37 ^= 0x6B; v55 ^= 0x18; v52 ^= 9; v54 ^= 3; memory[1027] = v37; memory[1024] = v55; memory[1025] = v52; memory[1026] = v54; v3 = memory[1030]; v4 = memory[1031]; v48 = memory[1029]; v47 = memory[1028]; v49 = memory[1030]; v46 = memory[1031]; v47 ^= 1; v48 ^= 0x5A; memory[1031] = v4 ^ 0x57; v49 = v3 ^ 0x32; memory[1028] = v47; memory[1029] = v48; memory[1030] = v3 ^ 0x32; v46 = (v4 ^ 0x57); v39 = memory[1033]; v5 = memory[1034]; v40 = memory[1034]; v6 = memory[1032]; v7 = memory[1035]; v45 = memory[1035]; v8 = memory[1033] ^ 0x5D; v9 = v5 ^ 0x40; v10 = v7 ^ 0x46; memory[1033] = v8; (v6) = v6 ^ 0x30; v39 = v8; memory[1032] = v6; v40 = v9; memory[1034] = v9; memory[1035] = v10; v45 = v10; v11 = memory[1036]; v12 = memory[1038]; v13 = memory[1036]; v14 = memory[1037]; v41 = memory[1037]; v15 = memory[1039]; v42 = v15; v16 = memory[1038] ^ 0x56; v17 = v14 ^ 0x46; v18 = v15 ^ 0x3D; v13 ^= 0x2B; memory[1038] = v16; v12 = v16; memory[1036] = v13; memory[1037] = v17; memory[1039] = v18; v41 = v17; v42 = v18; v50 = memory[1041]; v19 = memory[1042]; v20 = memory[1040]; v58 = memory[1043]; v50 ^= 0x43; (v20) = v20 ^ 2; (v19) = v19 ^ 0x17; memory[1040] = v20; memory[1042] = v19; memory[1041] = v50; v21 = memory[1047]; v38 = memory[1047]; v22 = memory[1044]; v43 = memory[1044]; v44 = memory[1045]; (v23) = memory[1046]; v24 = memory[1045] ^ 0x53; v25 = v22 ^ 0x32; v26 = v21 ^ 0x26; memory[1045] = v24; (v23) = v23 ^ 0x1F; v44 = v24; memory[1044] = v25; memory[1046] = v23; memory[1047] = v26; v43 = v25; v38 = v26; v27 = memory[1051]; v28 = memory[1049]; v62 = memory[1050]; v29 = memory[1048]; v30 = v27 ^ 0x10; (v29) = v29 ^ 0x2A; (v28) = v28 ^ 1; memory[1048] = v29; memory[1049] = v28; v27 = (v27 ^ 0x10); memory[1051] = v30; (v31) = memory[1054]; v32 = memory[1053]; v33 = memory[1052]; v57 = memory[1055]; (v33) = v33 ^ 0x10; (v32) = v32 ^ 0x1E; (v31) = v31 ^ 0x40; memory[1052] = v33; memory[1053] = v32; memory[1054] = v31; v34 = v52; v53 = v55; v35 = v50; li=[v32,v33,v31,v28,v29,v38,v19,v20,v13,v42,v48,v47,v57,v58,v62,v37,v34,v53,v54,v46,v49,v39,v40,v45,v6,v41,v12,v35,v43,v44,v23,v27] uni=[] for i in li: s=str(i) if s.find('^')>=0: q=int(s[s.find('^')+2:]) else: q=0 uni.append((int(s[s.find('[')+1:s.find(']')]),q)) print uni #print(v32,v33,v31,v28,v29,v38,v19,v20,v13,v42,v48,v47,v57,v58,v62,v37,v34,v53,v54,v46,v49,v39,v40,v45,v6,v41,v12,v35,v43,v44,v23,v27) #exit(0) ans=[108, 117, 51, 115, 117, 95, 100, 99, 116, 95, 105, 116, 51, 101, 51, 51, 48, 83, 109, 101, 109, 108, 49, 116, 95, 49, 101, 48, 95, 49, 115, 102] res=[0]*32 for i in range(len(ans)): res[uni[i][0]]=uni[i][1]^ans[i] ret="" for i in res: ret+=chr(i) print ret
得到输出 K9nXu3_2o1q2_w3bassembly_r3vers3
。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图