tqlctf reverse wp: Tale of the Arrow & quantum

Tale of the Arrow

题目给了源码, 把输入转成二进制串, 每一位都会打出三个数字, 数字正确和错误可能各一半, 但是其中有一个一定是正确的. 因此利用flag是可见字符最高位必为0 以及 一组三个有两个错误时剩下那个一定正确 两个条件可以直接还原出flag

with open('output.txt','r') as f:
    con = f.read().splitlines()[2:]

con =[ int(x) for x in con]

torf = [0] * len(con)  # 1 for T, 0 for UNDF, -1 for F
a = []
for i in range(1,137,8):
    a.append(-i)

for _ in range(10): 
    for i in range(len(con)):
        if con[i] in a:
            torf[i] = 1
        elif con[i] in [-x for x in a]:
            torf[i] = -1 

    for i in range(0,len(torf),3):
        if sum(torf[i:i+3])==-2:
            tmp = torf[i:i+3].index(0)
            torf[i+tmp] = 1
            a.append(con[i+tmp])


o = ['2']*136
for i in range(len(con)):
    tmp = torf[i]*con[i]
    if(tmp>0):
        o[tmp-1] = '1'
    elif(tmp<0):
        o[-tmp-1] = '0'
o = ''.join(o)
print(o)
for i in range(0,len(o),8):
    if '2' in o[i:i+8]:
        print(chr(int(bytes(o[i:i+8].replace('2','0'),"ascii"),2)),' or ',chr(int(bytes(o[i:i+8].replace('2','1'),"ascii"),2)))
    else:
        print(chr(int(bytes(o[i:i+8],"ascii"),2)))```

比赛时候因为少打一个负号和以为要带tqlctf{}输入flag而痛失一血 我的冰墩墩呜呜

quantum

是一道优化题, 给了一个看似运行不完的程序, 本意应该是类似于”未来程序“的优化题. 但是通过简单的分析以后我们发现耗费时间最长的部分是复数矩阵乘法. 因此是一个大常数的O(N^2) 复杂度.
所以我们只是简单的暴力跑了12h… 直接dump出final和p数组. 之后的比较逻辑就很简单了

final_bytes = open('final.txt', 'rb').read()
p_bytes = open('p.txt', 'rb').read()

from struct import unpack
def parse_cp(buf, cnt):
    assert len(buf) == cnt * 2 * 8
    cps = []
    data = list(unpack('<%dd' % (2 * cnt), buf))
    print("ok")
    for i in range(cnt):
        if i % 0x10000 == 0:
            print(i)
        cp = data[2 * i:2 * i + 2]
        cps.append(cp)
    return cps

final = parse_cp(final_bytes, 22)
p = parse_cp(p_bytes, 0x1000000)
print(final)

def verify(x, y):
    return abs(x/y - 1.0) < 0.000001

def check(a, b):
    return verify(a[0], b[0]) and verify(a[1], b[1])

print("hello")
ans = []
for v in final:
    for i in range(len(p)):
        if check(p[i], v):
            ans.append(i >> 16)
            ans.append((i >> 8) & 0xff)
            ans.append(i & 0xff)
            break
    print(bytes(ans))
# TQLCTF{5Peci4llY_dEs19n3d_QUaNTUM_c0mPU7In9_5ImU1at1ON_ALG0rithMS}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值