2019 GXY_CTF Misc 官方 Write Up

2

佛系青年

  • tags : zip伪加密,偏僻的编码方式
  • 难度 : 简单
  • 下载压缩包,压缩包里面第一个文件是个表情包,其实是干扰项23333,第二个fo.txt需要使用zip伪加密解出文件。
  • 打开fo.txt发现是一堆佛语,看来本题的关键就在于参透佛祖的思想,google一下佛曰,可以联想到佛曰解码,上该网站即可解得flag

BabyNC

  • tag : 二分查找
  • 难度 : 简单
  • 其实这题出的太简单了,跟出题小姐姐沟通出现了一点问题,导致猜的这个数竟然是个静态的,不会每次变化。这对大佬们来说倒是没啥,但是在校内大一的萌新们可谓是群魔乱舞,各种邪道方法手动猜数,甚至有的大佬一猜就是俩小时23333,下次肯定避免这种尴尬的问题(下次一定)。
  • 这个题目的本意是考察二分法查找以及与服务器nc交互脚本的编写,服务器会判断发送的数的大小,并返回结果,如果连接时间超过五秒或者交互次数大于128次就会强行切断连接,而最后的正确答案是一个比2^128小的非负整数,因此使用二分法可以在128次内求出结果。
  • 直接上exp:
# BabyNC_exp.py
# Author : Qi9i

import socket,sys
import random
import math
import time
import threading

HOST = '127.0.0.1'
PORT = 10086
ADDR =(HOST,PORT)
BUFSIZE = 1024

def link(i):
    sock = socket.socket()
    try:
      sock.connect(ADDR)
      print(i, 'have connected with server')
      flg = 1
      data2 = 0
      left = 0
      right = pow(2, 128)
      while flg:
          left = int(left)
          right = int(right)
          print(left,right)

          time.sleep(0.01)
          data1 = left+int((right-left)/2)
          if data2 == data1:
              data1 = data1 + 1
          else:
              data2 = data1
          data1 = str(data1)
          print('sock.send:',data1)
          sock.sendall(data1.encode('utf-8'))
          recv_data = sock.recv(BUFSIZE)
          recv_data = recv_data.decode('utf-8')
          print('receive:',recv_data)
          if recv_data == 'big':
            right = data1
          elif recv_data == 'small':
            left = data1
          else:
            flg = 0
            print(data1)
            break
    except Exception:
        print('error')
    sock.close()
    sys.exit()


for i in range(1):
    thread = threading.Thread(target=link,args=(i,))
    thread.start()

BTW,Qi9i小姐姐是真的想找个男朋友,还单身的大佬快来我们学校面基呀
(*´゚∀゚`)ノ

Gakki!

  • tags : rar鶸口令,字频统计
  • 难度 : 中等
  • 首先把gakki 我老婆放到kali里,foremost可以提取出来一个压缩包,压缩包直接丢进ARCHPR,四位随机数字很快就跑出来了8864是口令,解压之后是一大堆乱七八糟的东西,而且一看长度还不短,猜测不是编码或者加密,写脚本字频统计一下即可得到flag。
  • exp:
# gakki_exp.py
# Author : imagin

alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+-={}[]"
f = open("flag.txt", "r")
data = f.read()
result = {d:0 for d in alphabet}

def sort_by_value(d):
	items = d.items()
	backitems = [[v[1],v[0]] for v in items]
	backitems.sort(reverse=True)
	return [ backitems[i][1] for i in range(0,len(backitems))]

for d in data:
	for alpha in alphabet:
		if d == alpha:
			result[alpha] = result[alpha] + 1
	
print(sort_by_value(result))

SXMgdGhpcyBiYXNlPw==

  • tag : base64隐写
  • 难度 : 简单
  • 文件是一堆base64base64隐写脚本提取flag即可
  • 原理:
    • base64是将3个8比特转换为4个6比特 最小的转换单位是24比特(6和8最小公倍数)
    • 因此如果原文内容不足三字节,有一部分比特解码时候不需要,但会组成编码后的某个字符
    • 比如上图A的0100 0001base64识别为0100 0001 0000然而最后四个比特解密时无用。换句话说 0100 0001 0000 和0100 0001 1111对应的原文都是A,因此可以使用这四个比特进行隐写
  • exp:
# base_exp.py
# Author : imagin

from base64 import *
file = open('flag.txt','r')
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
def inttobin(shu,n):
	tmp = bin(shu).replace('0b','')
	while len(tmp)<n:
		tmp = '0' + tmp
	return tmp
summ=''

for i in range(66):
	m = file.readline()
	m = m.replace("\n",'')
	m = m.replace("\r",'')
	if m.find('=') != -1:													#存在=
		mm = str(b64encode(b64decode(m)))
		mm = mm.replace('b\'','')
		mm = mm.replace('\'','')
		if m[-1] == '=':
			if m[-2] == '=':
				tmp = alphabet.index(m[-3]) - alphabet.index(mm[-3])		#隐写四位
				result = inttobin(tmp,4)
			else:
				tmp = alphabet.index(m[-2]) - alphabet.index(mm[-2])		#隐写两位
				result = inttobin(tmp,2)
		summ += result
print(summ)
  • 有关这个题目有意思的点:
    • 有些大佬可能不太了解base64隐写,做题的时候就会一头雾水,完全不知道自己在干嘛。然后可能联想到了之前的一个题目,给了一个音频,二进制下有qq音乐的版权信息,那个题目主要是信息收集,需要去qq音乐对应的歌曲找评论区的信息,然后本次比赛也有大佬照着这个思路去做,结果就是评论区出现了一群牛鬼蛇神23333

About the author

Add comment

Imagin 丨 京ICP备18018700号-1


Your sidebar area is currently empty. Hurry up and add some widgets.