网站导航

新闻资讯

当前位置:首页 > 新闻资讯

第二届“强网杯”部分题目writeup

发布时间:2018-03-30

简要描述:

本文作者:tinyfisher原创投稿活动:...

详细介绍

本文作者:tinyfisher

原创投稿活动:


其实和streamgame 2没什么区别,只是长度变了:

image.png


还是遍历,只不过flag长度变成了27位,去掉“flag{}”6位,因此中间长度为21位,也就是0-0b111111111111111111111修改一下长度就可以

def lfsr(R,mask):
   output = (R  1)  1)^out
       if i==0:
           if tmp==0xB2:
               pass
           else:
               break
       if i==1:
           if tmp==0xE9:
               pass
           else:
               break	
       if i==2:
           if tmp==0x0E:
               pass
           else:
               break
       if i==3:
           if tmp==0x13:
               pass
           else:
               break
       if i==4:
           if tmp==0xA0:
               print tmpr
           else:
               break

五、 streamgame4

题目描述:

image.png


换汤不换药,虽说是1024X1024,但flag长度还是固定的21位:

image.png


因此还是遍历:

def nlfsr(R,mask):
   output = (R  1)  1)^out

       if i==0:
           if tmp==0xD1:
               pass
           else:
               break
       if i==1:
           if tmp==0xD9:
               pass
           else:
               break	
       if i==2:
           if tmp==0x40:
               pass
           else:
               break
       if i==3:
           if tmp==0x43:
               pass
           else:
               break
       if i==4:
           if tmp==0x93:
               print tmpr
           else:
               break

六、 simplecheck

题目描述:

image.png


题目给了一个apk,运行下试试:

image.png


要输入flag,错误返回“sorry its wrong“

反编译apk,看一下关键代码:

image.png


这题需要让函数a返回true,传递的参数paramString为flag,需要我们逆出flag,算法大概的意思:

首先定义了一些数组a,b,c,d

往下看代码

if (paramString.length() != b.length) {
     return false;
}

这里说明了flag的长度需要等于b数组的长度,也就是34,再往下看:

int[] arrayOfInt = new int[a.length];
   arrayOfInt[0] = 0;
   byte[] arrayOfByte = paramString.getBytes();
   int i = arrayOfByte.length;
   int j = 0;
   int k = 1;
   while (j  i)
   {
     arrayOfInt[k] = arrayOfByte[j];
     k++;
     j++;
}

这里new了一个新数组arrayOfInt,arrayOfInt[0] = 0;然后将flag赋值到arrayOfInt[1]- arrayOfInt[34],也就是说数组arrayOfInt,第一位为0,后面34位为flag。

再往下看关键代码:

for (int m = 0;; m++)
   {
     if (m >= c.length) {
       break label175;
     }
     if ((a[m] != b[m] * arrayOfInt[m] * arrayOfInt[m] + c[m] * arrayOfInt[m] + d[m]) || (a[(m + 1)] != b[m] * arrayOfInt[(m + 1)] * arrayOfInt[(m + 1)] + c[m] * arrayOfInt[(m + 1)] + d[m])) {
       break;
     }
}

m从0到34进行遍历,要使得if ((a[m] != b[m] * arrayOfInt[m] * arrayOfInt[m] + c[m] * arrayOfInt[m] + d[m]) || (a[(m + 1)] != b[m] * arrayOfInt[(m + 1)] * arrayOfInt[(m + 1)] + c[m] * arrayOfInt[(m + 1)] + d[m]))为假

由于if里面是||,也就是0||0才为0,转换一下这个条件就是:

a[m] == b[m] * arrayOfInt[m] * arrayOfInt[m] + c[m] * arrayOfInt[m] + d[m]

a[(m + 1)] == b[m] * arrayOfInt[(m + 1)] * arrayOfInt[(m + 1)] + c[m] * arrayOfInt[(m + 1)] + d[m]

明白了关键函数,就可以尝试利用爆破区爆破flag:

a= [0, 146527998, 205327308, 94243885, 138810487, 408218567, 77866117, 71548549, 563255818, 559010506, 449018203, 576200653, 307283021, 467607947, 314806739, 341420795, 341420795, 469998524, 417733494, 342206934, 392460324, 382290309, 185532945, 364788505, 210058699, 198137551, 360748557, 440064477, 319861317, 676258995, 389214123, 829768461, 534844356, 427514172, 864054312]
b= [13710, 46393, 49151, 36900, 59564, 35883, 3517, 52957, 1509, 61207, 63274, 27694, 20932, 37997, 22069, 8438, 33995, 53298, 16908, 30902, 64602, 64028, 29629, 26537, 12026, 31610, 48639, 19968, 45654, 51972, 64956, 45293, 64752, 37108]
c=[38129, 57355, 22538, 47767, 8940, 4975, 27050, 56102, 21796, 41174, 63445, 53454, 28762, 59215, 16407, 64340, 37644, 59896, 41276, 25896, 27501, 38944, 37039, 38213, 61842, 43497, 9221, 9879, 14436, 60468, 19926, 47198, 8406, 64666]
d=[0, -341994984, -370404060, -257581614, -494024809, -135267265, 54930974, -155841406, 540422378, -107286502, -128056922, 265261633, 275964257, 119059597, 202392013, 283676377, 126284124, -68971076, 261217574, 197555158, -12893337, -10293675, 93868075, 121661845, 167461231, 123220255, 221507, 258914772, 180963987, 107841171, 41609001, 276531381, 169983906, 276158562]

flag=""
for m in range(1,34):      
   for f1 in range(32,127):     
       if((a[m] == b[m-1] * f1 * f1 + c[m-1] * f1 + d[m-1]) and (a[m] == b[m] * f1 * f1 + c[m] * f1 + d[m])):
           flag+=chr(f1)
           break
       else:
           pass
#print len(c)
print flag+"}"


 


推荐产品

如果您有任何问题,请跟我们联系!

联系我们

Copyright © 武汉网盾科技有限公司 版权所有 备案号:鄂ICP备2023003462号-5

地址:武汉市东湖高新区光谷大道光谷世贸中心A栋23楼

在线客服 联系方式 二维码

服务热线

18696195380/18672920250

扫一扫,关注我们

关闭