Category - 强网杯2018

直接爆破

  1. # from flag import flag
  2. # assert flag.startswith("flag{")
  3. # assert flag.endswith("}")
  4. # assert len(flag) == 27
  5. def lfsr(R, mask):
  6. output = (R << 1) & 0xffffff
  7. i = R & mask & 0xffffff
  8. lastbit = 0
  9. while i != 0:
  10. lastbit ^= (i & 1)
  11. i = i >> 1
  12. output ^= lastbit
  13. return (output, lastbit)
  14. # R = int(flag[5:-1], 2)
  15. mask = 0x100002
  16. def encrypt(R):
  17. ret = ''
  18. for i in range(12):
  19. tmp = 0
  20. for j in range(8):
  21. (R, out) = lfsr(R, mask)
  22. tmp = (tmp << 1) ^ out
  23. ret += chr(tmp)
  24. return ret
  25. def brute_force():
  26. with open('key', 'rb') as r:
  27. cipher = r.read()
  28. for i in range(2**20, 2**21):
  29. print i
  30. if encrypt(i) == cipher:
  31. raw_input()

flag{110111100101001101001}

解压出 classes.dex 之后使用 dex2jar + jd-gui 反编译之后可以发现核心是这样的代码:

 

public class a
{
    private static int[] 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 };
    private static int[] 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 };
    private static int[] 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, 

题目给了一个图片,bmp位图格式:

看特征估计偏移有东西,stegsolve打开调下偏移看到flag:

 

flag:QWB{W3lc0me}

StreamGame4

1.本题给了一个加密脚本和一个加密过后的key。

2.脚本将flag做为二进制读入,做为密钥。然后循环1024*1024次,每次循环8次nlfsr函数,将结果变换写入key中。所以可以进行爆破,每次检测key的一位,从第一位开始,如果正确在检测下一位。脚本如下:

  1. def nlfsr(R,mask):
  2. output = (R << 1) & 0xffffff
  3. i=(R&mask)&0xffffff
  4. lastbit=0
  5. changesign=True
  6. while i!=0:
  7. if changesign:
  8. lastbit &= (i & 1)
  9. changesign=False
  10. else:
  11. lastbit^=(i&1)
  12. i=i>>1
  13. output^=lastbit
  14. return (output,lastbit)
  15. f=open("key","rb").read()
  16. mask=0b110110011011001101110
  17. flag = False
  18. for x in range(0,pow(2,27-6)-1):
  19. R=x
  20. for i in range(1024*1024): #此处可以把1024*1024改成一个较小的数
  21. tmp=0
  22. for j in range(8):
  23. (R,out)=nlfsr(R,mask)
  24. tmp=(tmp << 1)^out
  25. if f[i]!=tmp:
  26. break
  27. elif i==1024*1024-1: #此处也要同时更改
  28. flag=True
  29. break
  30. if x%100000==0:
  31. print('x =',x)
  32. if flag==True:
  33. flag=x
  34. break
  35. print("flag{"+bin(x)[2:]+"}"
    Page 2 of 2