一、个人赛

web

re

goodpy

根据题目知道是py字节码。相关(https://www.cnblogs.com/yinguohai/p/11158492.html
py3.7每条指令是2,py2.7是3。
可以通过直接阅读字节码翻译出原py语句。(偷懒翻个大概)

  1. import os
  2. a=0
  3. flag=input()
  4. for i in range(len(flag)):
  5. a+=1
  6. if a!=32:
  7. print 'error'
  8. exit()
  9. if flag[0]!='f' and flag[1]!='l' and flag[2]!=a:
  10. print 'error'
  11. exit()
  12. tmp=[]
  13. for i in range(a):
  14. tmp.append(flag[i])
  15. for i in range(a):
  16. tmp[i]=ord(tmp[i])-9
  17. for i in range(a):
  18. tmp[i]^=51
  19. for i in range(a):
  20. tmp[i]=tmp[i]+8
  21. tmp1=tmp[a-3]
  22. tmp2=tmp[a-2]
  23. tmp3=tmp[a-1]
  24. for i in range(a-3):
  25. tmp[a-1-i]=tmp[a-1-i-3]
  26. tmp[0]=tmp3
  27. tmp[1]=tmp2
  28. tmp[2]=tmp1
  29. for i in range(a):
  30. if i%7!=1:
  31. tmp[i]^=119

都是一些简单的运算。

angrysnake

ida打开分析,发现有几处花指令,并且这些花指令都是相同的格式,写个py脚本去除。
去花脚本

  1. import ida_search
  2. t='e8 00 00 00 00 48 83 04 24 06 c3'
  3. start=0x147c
  4. end=0x2621
  5. rip=start
  6. for rip in range(start,end):
  7. a=ida_search.find_binary(rip,end,t,16,1)
  8. '''xor_num=get_wide_dword(a+11)
  9. j_addr=(a+8)^xor_num
  10. s=j_addr-a-5
  11. patch_byte(a,0xe9)
  12. patch_dword(a+1,s)
  13. for k in range(5,23):
  14. patch_byte(a+k,0x90)'''
  15. for i in range(11):
  16. patch_byte(a+k,0x90)
  17. print('s')

去花后分析关键函数
image.png
大概流程为,控制蛇吃东西,吃到一定数量执行if()里面的函数。直接修改目标数量为1,吃一个即可。
image.png
然后输入,把输入进行xtea和疑似md5的加密,把加密后内容比较。
疑似md5的没看明白,可惜了。

二、团体赛

围观别人写的的writeup

https://zhuanlan.zhihu.com/p/421196426 https://zhuanlan.zhihu.com/p/421202600