# Write up KMACTF 2023 lần 2 ## 旗を持っている人は私に提出してください ![](https://hackmd.io/_uploads/B1sz0nJla.png) - Đề bài cho ta các file: hint.txt: ```txt= $head -n 18 .ssh/id_rsa -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn NhAAAAAwEAAQAAAQEA+EHGQ+emT2GgZzI5wbufhYYC276Z4xrCzpXLk+s+sgK6JKekYN/F dkrPk6A3QT2JsUVBqg3QHOPjHRtPQGeIMdK2RC7hiS2gGWGv3dQ9k2bScXiSdByBZFXVs9 k0VNSxJyH+5/GZZh0YC04c5+4BtKqlbdnEUnsm+IZYmLYjhSBkzpY+zh7y61TeeBkc/ksZ f1Sm8c9rD1Mi5dFc4m2wiRWpqD1gBgojXbczPl08cMWhULUsHiOHjD1i/4S4hyTAAmFbQu dnF9LxihLkyQGAHglITOJrx439D3gWoC4k/DSUT/fur7laRhZsYjHmwNR24yFOZyFrA7+l obOuNQbRTQAAA8gAYCu/AGArvwAAAAdzc2gtcnNhAAABAQD4QcZD56ZPYaBnMjnBu5+Fhg LbvpnjGsLOlcuT6z6yArokp6Rg38V2Ss+ToDdBPYmxRUGqDdAc4+MdG09AZ4gx0rZELuGJ LaAZYa/d1D2TZtJxeJJ0HIFkVdWz2TRU1LEnIf7n8ZlmHRgLThzn7gG0qqVt2cRSeyb4hl iYtiOFIGTOlj7OHvLrVN54GRz+Sxl/VKbxz2sPUyLl0VzibbCJFamoPWAGCiNdtzM+XTxw xaFQtSweI4eMPWL/hLiHJMACYVtC52cX0vGKEuTJAYAeCUhM4mvHjf0PeBagLiT8NJRP9+ 6vuVpGFmxiMebA1HbjIU5nIWsDv6Whs641BtFNAAAAAwEAAQAAAQEAil6e01paKASSEvK7 nm+lChcXoMMroplX2y1Cur9zwmQivCt0Q0p2FOi9qdqy8XoLNPMVFmN8i525CJAgLBWIo7 x+OqKmsn7rrTn1e/7AE1hME1LQzkbVF8d/xS5bLK0f0F/yY/UVOwUcUbDIC71s1fYHHqMx +YcKwZqf5v4d7iR2/jLmQI2eTUocrsjXPVncJZkHCLSXsA55gstXpvqcNZCUpMzpxnXItS brS06azCaN3/W0vNXcvE0nrjpqHTdCc/eYakWcVWkY8c3XD5bDliO96anE3M+vbneCN/aR vRumOTAl3IIAVySOpmOPjKE0QMr/7x77uZwXktnTuBs2AQAAAIB+UvfUBey3NzB54radl7 ``` authorized_keys: ```txt= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4QcZD56ZPYaBnMjnBu5+FhgLbvpnjGsLOlcuT6z6yArokp6Rg38V2Ss+ToDdBPYmxRUGqDdAc4+MdG09AZ4gx0rZELuGJLaAZYa/d1D2TZtJxeJJ0HIFkVdWz2TRU1LEnIf7n8ZlmHRgLThzn7gG0qqVt2cRSeyb4hliYtiOFIGTOlj7OHvLrVN54GRz+Sxl/VKbxz2sPUyLl0VzibbCJFamoPWAGCiNdtzM+XTxwxaFQtSweI4eMPWL/hLiHJMACYVtC52cX0vGKEuTJAYAeCUhM4mvHjf0PeBagLiT8NJRP9+6vuVpGFmxiMebA1HbjIU5nIWsDv6Whs641BtFN ``` - Chúng ta có thể thấy file `hint.txt` cho không đầy đủ và nhiệm vụ của chúng ta là khôi phục lại file key này. - Sau khi decode base64 phần đã biết trong file `hint` thì ta thấy `n`, `e`, `d` đã được cho, vì thế chúng ta có thể construct lại `file` bằng hàm rsa_construct trong thư viện `pycrypto`. https://github.com/pycrypto/pycrypto/blob/7acba5f3a6ff10f1424c309d0d34d2b713233019/lib/Crypto/PublicKey/_slowmath.py#L82 solved.py: ```python= from base64 import b64decode, b64encode from Crypto.PublicKey import RSA f = open('hint.txt', 'rb').read() data = b"".join(f.split(b'\n')[2:]) data = b64decode(data+b'==').hex() print(data) list_data = data.split("0000") print(list_data) n = int(list_data[-4][6:],16) e = 65537 d = int(list_data[-2][6:],16) rsa_key = RSA.construct((n, e, d)) rsa_key_bytes = rsa_key.export_key("PEM") with open('recover_key.pem', 'w') as file: file.write(rsa_key_bytes.decode()) ``` - Sau đó ta thu được `recover_key.pem`: ```pem= -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA+EHGQ+emT2GgZzI5wbufhYYC276Z4xrCzpXLk+s+sgK6JKek YN/FdkrPk6A3QT2JsUVBqg3QHOPjHRtPQGeIMdK2RC7hiS2gGWGv3dQ9k2bScXiS dByBZFXVs9k0VNSxJyH+5/GZZh0YC04c5+4BtKqlbdnEUnsm+IZYmLYjhSBkzpY+ zh7y61TeeBkc/ksZf1Sm8c9rD1Mi5dFc4m2wiRWpqD1gBgojXbczPl08cMWhULUs HiOHjD1i/4S4hyTAAmFbQudnF9LxihLkyQGAHglITOJrx439D3gWoC4k/DSUT/fu r7laRhZsYjHmwNR24yFOZyFrA7+lobOuNQbRTQIDAQABAoIBAQCKXp7TWlooBJIS 8rueb6UKFxegwyuimVfbLUK6v3PCZCK8K3RDSnYU6L2p2rLxegs08xUWY3yLnbkI kCAsFYijvH46oqayfuutOfV7/sATWEwTUtDORtUXx3/FLlssrR/QX/Jj9RU7BRxR sMgLvWzV9gceozH5hwrBmp/m/h3uJHb+MuZAjZ5NShyuyNc9WdwlmQcItJewDnmC y1em+pw1kJSkzOnGdci1JutLTprMJo3f9bS81dy8TSeuOmodN0Jz95hqRZxVaRjx zdcPlsOWI73pqcTcz69ud4I39pG9G6Y5MCXcggBXJI6mY4+MoTRAyv/vHvu5nBeS 2dO4GzYBAoGBAPi394D+bK0BumU7T8wyKsvoannACEF3BZk4UctZLgVIKN1B5dcY cYYf9HAdhAQc296ykzf3PjMl0uC8FNqIkaDXz2SAApgJJ/oCklcFKWfbNWqJC/Yn h+6J3GyQdF2miSSDVSi50TJwlOWeVi1EmBiYJ3KATAjodc6QrH5qj4vJAoGBAP+G WPajfSFH2TLBZrVWYO/2TcY+eswLFYQsn5C8JCyKuyn+RX3NpCt2KpgqbC8Ot623 HPyn/7ndi1YA0LEWcw3RsLa4Xfp8207N/ILLQplZFzrajANta3ORG/CYzY7n6NzC RmHZXrPTATSbXNw+yBR+yWmRK9+/ZYdY5UbDvtNlAoGAbvvIWasuW1T2E84PoZKR PkQLnyBtjqjJusFC3naA7qJweaq6IO0rWypPLOg+zIcEJa+Rudt9yd0K6HWE6K8g LKGgTbxBbA5J5GnZWzNWcp2CjHNy/vhM08h4r4kWI+P4Nm7URUQFcXiDOKMa2UBO jkr270UIqMDyMKamEhMC0uECgYAKevgrJYl8U/YUntoXlfNj5DZMa0OeGtZHFY11 4kGZkhcbIdK31jdlkPMuSo8lXvUpqtkFg955QRz16hKlMMaHSpJ07BruqzBTix9Q PgX9RCovv8b+XP6LPuhmdd34foqOg2lfmgrIVV83SSgF4I1USd749XtXMgJ4Cq1c uaqaAQKBgH3CYaw2mA1w+c+Yr6LOaAqSlzOvh7VoPVvk8AdoYY8WQslsKhQ1tYuV FdahZaqsfgPYAHI8eak/jrT6M52fEh4myriuXsTR64TYTjAzIjS9c4EOcuBkT2jM gvu3C/1E6Mos8vF5WFb6AbzMQxctf+CnlqdfbQTAwJDFCXTZLFst -----END RSA PRIVATE KEY----- ``` - Sau đó ta chạy các lệnh : `chmod 600 recover_key.pem` `ssh -p 2222 -i recover_key.pem sena@103.162.14.116` `cat /flag.txt` ## Simple Encode ![](https://hackmd.io/_uploads/BJ5mzpkx6.png) chal.py: ```python= import string from hashlib import md5 import random def encode(m): return ''.join(bin(ord(c))[2:] for c in m) flag = "KMA{" + "".join(random.choices(string.printable[:-6], k=27)) + "}" #print(f'{flag = }') flag_hash = md5(flag.encode()).hexdigest() print(f'{flag_hash = }') flag_encode = encode(flag) print(f'{flag_encode = }') ''' flag_hash = '16ab78b0c0654e663d7e2e22ac0a9b7a' flag_encode = '10010111001101100000111110111010001011000111000101010110110001101101001011100101110000111010110101111000101111001111110100000010001111000111011011011110101011111110011000111110111101001001000100011010001101111101' ''' ``` - Đề bài cho `flag_hash` được hash bằng md5 và `flag_encode` được encode binary. - `flag = "KMA{" + "".join(random.choices(string.printable[:-6], k=27)) + "}" ` Ta thấy flag được tạo thành từ 32 kí tự và trong đó 27 kí tự được lấy random trong `printable[:-6]`. - Sau khi thử hàm `encode` thì ta thấy các kí tự trong `printable` được chuyển đổi qua binary (7 bit 6 bit) và bỏ tiền tố `0b` ![](https://hackmd.io/_uploads/B1qMtT1xa.png) - Dựa vào `flag_encode` mình tìm được một số kí tự cố định như `KMA{(X8UX6` và ở cuối flag `HFF}`. Tiếp đó các kí tự tiếp theo của flag mình không biết là 6 bit hay 7 bit và có quá nhiều trường hợp nên làm bằng tay là rất mất nhiều thời gian. Vì thế ta sẽ dùng code để thử tất cả trường hợp và đem so sánh với hash để tìm flag. solve.py: ```python= import string from hashlib import md5 alpha=string.printable[:-6] h="16ab78b0c0654e663d7e2e22ac0a9b7a" enc="101000101100011100010101011011000110110100101110010111000011101011010111100010111100111111010000001000111100011101101101111010101111111001100011111011110100100100010001101000110" def generate_binary_strings_with_count(n1, n2, prefix=""): if len(prefix) == n1 + n2 and prefix.count('0') == n1 and prefix.count('1') == n2: e=enc try: res="" for i in prefix: if i=='0': if chr(int(e[:6],2)) not in alpha: return res+=chr(int(e[:6],2)) e=e[6:] else: if chr(int(e[:7],2)) not in alpha: return res+=chr(int(e[:7],2)) e=e[7:] flag = "KMA{" + res + "}" flag_hash = md5(flag.encode()).hexdigest() if flag_hash==h: print("flag:",flag) except: pass return if prefix.count('0') < n1: generate_binary_strings_with_count(n1, n2, prefix + "0") if prefix.count('1') < n2: generate_binary_strings_with_count(n1, n2, prefix + "1") generate_binary_strings_with_count(12, 15) ``` > KMA{(X8UX6K%0uWE9>@#1m^W<1=tHFF} - Cách khác: - Sau khi tìm được các phần như `KMA{(X8UX6` và `HFF}` mình sẽ dùng đoạn code ở dưới đây để tìm các kí tự tiếp theo. Lưu ý cách này có thể sai sót gây dễ nhầm lẫn. ```python= import string pt=string.printable[:-6] def encode(m): return ''.join(bin(ord(c))[2:] for c in m) flag_encode = '10010111001101100000111110111010001011000111000101010110110001101101001011100101110000111010110101111000101111001111110100000010001111000111011011011110101011111110011000111110111101001001000100011010001101111101' fl= 'KMA{(X8UX6' for i in pt: if encode(fl + i) in flag_encode: fl= fl+ i print(fl) ``` ![](https://hackmd.io/_uploads/ByRvNbxg6.png) - Tiếp đó ta cứ thêm kí tự mới có vào `fl` ![](https://hackmd.io/_uploads/B14aV-xlp.png) - Tới đây chúng ta thêm từ từ từng kí tự một vì mình sợ bị sai, nói chung mình sẽ thử nhiều và ghi lại và so sánh các trường hợp. ![](https://hackmd.io/_uploads/ByCDr-egp.png) - Sau khi tới đây thì đã không còn kí tự nào nữa vì tìm tiếp sẽ không được, mình chuyển qua tìm các kí tự ở cuối.![](https://hackmd.io/_uploads/HkbTrbxlp.png) ![](https://hackmd.io/_uploads/HJbRrWegT.png) ![](https://hackmd.io/_uploads/r1R8Ibexa.png) - Ở các kí tự cuối chúng ta có thể tìm thêm nhưng xuất hiện trường hợp khác. Căn cứ vào `KMA{(X8UX6K%0uWE9>@` và `X6%ea5WE9>@#1m^W<c;4HFF}` Ta kết hợp hai cái lại `KMA{(X8UX6K%0uWE9>@#1m^W<c;4HFF}` hoặc là `KMA{(X8UX6%ea5WE9>@#1m^W<c;4HFF}` và thử submit hết flag. ## Similar but ... ![](https://hackmd.io/_uploads/H13Hg0kxp.png) chal.py: ```python= from Crypto.Util.number import * p = getPrime(2048) q = getPrime(2048) n = p*q e = 2 print(f'{n = }') flag = "KMA{anh che roi!!!!!!!}" l = len(flag) print(f'{l = }') msg = f''' Gửi đến những người em thân yêu của anh, hôm nay anh muốn chia sẻ với các em một câu chuyện về kho báu. Trong câu chuyện này, kho báu được chia thành hai nửa, và mỗi nửa mang trong mình một ý nghĩa đặc biệt. Nửa đầu tiên anh giấu ở đây: {flag[:l//2]} Còn đây là nửa thứ hai: {flag[l//2:]} Hãy tìm ra kho báu của anh đi, anh để hết trong msg rồi đó. Chúc các em may mắn !!! ''' c = pow(bytes_to_long(msg.encode()), e,n) print(f'{c = }') ''' n = 284195696721751741542976970377246384163200746062783759329661617188815436776424189078521874168074640320924439097731870753354899953210403298438375686437215681238598996375382536537768278254146374135440697791835320902172928838535170207920563260188268857178412014945665843067884706362429213081345697201062048319151146709862154724701120787598264599428501030945241764332469820283330386978451487308358496070493019375227430237712951734594609189071738774562063639368050519599690219339371888693892756654714125742546793650545564645761412676393745546867317157950660276413454704121923686068169935524575099441009254762051678974615084672006274688302115077734407074204036930371634952480748870905140950407665202776686680232626404222734370828402377048157739018826752500816695651244608931659579045297636939347065142654266415418100162785201594053030962306454285243690682313810711305540434910861763618201288903763117959626276874769295456013747611282355250494278056557319959998777444026981083893016148032869660521587008308779834135343779295437340050873017686606894792594175473683376016830206421076702465312246840917660142641545140295983913838540847955749716541937276104901379735588334581049297927341758018775135576856481243743641314705618868934645861372761 l = 46 c = 197348052174145638785229215457497516691585910055835441125583073645980013777032065006627024581136020897300252228534006100306209234223154204281916399887451961006595700453576912583653484661863741375270305419615721406198781214515934675523007505165820308082654403780811498250984535336719680589351485735567955825720119048693747519278867766555710216038040229689357846375187513096350835998852728799656866437148777620905204000517049701112204778019184506339386241329691058153055354968087261832501249138236077313408204182929051641521267083356295624561257562991234261668632037087231724232716833294744291699334965334803826200727633700589654688863746449952492047286765973034494755978048670534899135052018421945310658805856492088479095070115314198579191182336314746398558742288499341372595578846975164079893641205584309595266932028754927985671375042116891444819656916960144209962788439147210122667753145683940192069926363191913583924164601419393905729897192079336412469978182139715148777895764888053578167383521367586833983484951931519842177634434322107919818397921097644416813823140565831649561406124639176188646350960425853516784830094432718779747088309513889971075211757981041043652016970888838329334179083984287540371718185534696012444989603691 ''' ``` - Đọc source ta thấy đây là dạng mã hóa RSA, đề bài đã cho chúng ta `n`, `c`(phần `msg` được mã hóa), `l`(len: độ dài `flag`), và 1 phần `msg`(thiếu mỗi `flag`). - Bài này là dạng `Stereotyped message attack` https://gsdt.github.io/blog/2018/07/20/stereotyped-message-attack/ - Ta thấy `len` của `flag` là 46 nên mình chia nửa ra và đặt là `XX....` như trong hình ![](https://hackmd.io/_uploads/SkVTFkelT.png). - Vì `c = m^e mod n` nên => `m^e - c (mod n) =0 ` => `f(x)= f(x) = (M + x)^e - c` (x là phần chưa biết trong msg; M là phần đã biết) - Chúng ta sẽ thay thế phần `XX...` thành các bytes `null`, và để tìm phần chưa biết ta sẽ dùng coppersmith để giải quyết vấn đề này, ở đây ta sử dụng hàm `small_roots` của sagemath. solved.py: ```sage= from Crypto.Util.number import * n = 284195696721751741542976970377246384163200746062783759329661617188815436776424189078521874168074640320924439097731870753354899953210403298438375686437215681238598996375382536537768278254146374135440697791835320902172928838535170207920563260188268857178412014945665843067884706362429213081345697201062048319151146709862154724701120787598264599428501030945241764332469820283330386978451487308358496070493019375227430237712951734594609189071738774562063639368050519599690219339371888693892756654714125742546793650545564645761412676393745546867317157950660276413454704121923686068169935524575099441009254762051678974615084672006274688302115077734407074204036930371634952480748870905140950407665202776686680232626404222734370828402377048157739018826752500816695651244608931659579045297636939347065142654266415418100162785201594053030962306454285243690682313810711305540434910861763618201288903763117959626276874769295456013747611282355250494278056557319959998777444026981083893016148032869660521587008308779834135343779295437340050873017686606894792594175473683376016830206421076702465312246840917660142641545140295983913838540847955749716541937276104901379735588334581049297927341758018775135576856481243743641314705618868934645861372761 l = 46 c = 197348052174145638785229215457497516691585910055835441125583073645980013777032065006627024581136020897300252228534006100306209234223154204281916399887451961006595700453576912583653484661863741375270305419615721406198781214515934675523007505165820308082654403780811498250984535336719680589351485735567955825720119048693747519278867766555710216038040229689357846375187513096350835998852728799656866437148777620905204000517049701112204778019184506339386241329691058153055354968087261832501249138236077313408204182929051641521267083356295624561257562991234261668632037087231724232716833294744291699334965334803826200727633700589654688863746449952492047286765973034494755978048670534899135052018421945310658805856492088479095070115314198579191182336314746398558742288499341372595578846975164079893641205584309595266932028754927985671375042116891444819656916960144209962788439147210122667753145683940192069926363191913583924164601419393905729897192079336412469978182139715148777895764888053578167383521367586833983484951931519842177634434322107919818397921097644416813823140565831649561406124639176188646350960425853516784830094432718779747088309513889971075211757981041043652016970888838329334179083984287540371718185534696012444989603691 e = 2 msg = f''' Gửi đến những người em thân yêu của anh, hôm nay anh muốn chia sẻ với các em một câu chuyện về kho báu. Trong câu chuyện này, kho báu được chia thành hai nửa, và mỗi nửa mang trong mình một ý nghĩa đặc biệt. Nửa đầu tiên anh giấu ở đây: XXXXXXXXXXXXXXXXXXXXXXX Còn đây là nửa thứ hai: XXXXXXXXXXXXXXXXXXXXXXX Hãy tìm ra kho báu của anh đi, anh để hết trong msg rồi đó. Chúc các em may mắn !!! ''' msg= msg.encode() msg= msg.replace(b'X', b'\x00') msg= bytes_to_long(msg) P.<x>= PolynomialRing(Zmod(n)) f= (int(msg) + x)^e -c msg = int(msg) + int(f.small_roots()[0]) print(long_to_bytes(msg)) ``` > KMA{So_litttt_c0pp33r_Sm1th_Savageeeee!!!!!!!} ## Bazoka ![](https://hackmd.io/_uploads/S1VWaklxT.png) chal.py: ```python= from hashlib import md5 def encrypt(plaintext, key): key = md5(key).digest() msg = plaintext + b'|' + key # print(msg) encrypted = b'K' for i in range(len(msg)): encrypted += bytes([(msg[i] + key[i%len(key)] + encrypted[i]) & 0xff]) return encrypted.hex() flag = b"KMA{anh xoa di roi}" key = b"anh xoa di roi" ciphertext = encrypt(flag, key) print(ciphertext) # 4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e ``` - Bài này ta thấy flag được mã hóa qua hàm `encrypt`, hàm `encrypt` hoạt động như sau: Đầu tiên sẽ chuyển key qua dạng md5 và tạo một `msg = plaintext + b'|' + key `, sau đó chạy vòng for qua từng kí tự msg và tính tổng của các phần tử `msg` , `key` và một chuỗi `encrypted` ![](https://hackmd.io/_uploads/SylM0hzeT.png) - Nhiệm vụ của chúng ta bây giờ là tìm `key`. Và dùng `key` để giải mã flag. - Để tìm `key` , đầu tiên ta sẽ tính `sum` của từng `encrypted[i]`, chúng ta sẽ lấy `enc[i] - enc[i-1] % 256` ```python= enc = '4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e' enc = bytes.fromhex(enc) sum = [] for i in range(1, len(enc)): a = (enc[i]-enc[i-1])%256 sum.append(a) print(sum) ``` - Sau khi đã có sum thì ta có độ dài md5 của key là 16 bytes, chúng ta đã biết được một số kí tự `'KMA{'` `'}'` `'|'` của `msg` nên có thể khôi phục lại `key` ở vị trị tương đương `msg`. - Sau khi tìm được hết key thì ta tìm lại msg bằng công thức `(msg[i] = sum[i] - key[i%len(key)])%256` solved.py: ```python= ct="4b851cc4cdd1c7a3b7a3d83095a46a320e6b21e9e5afab7b8869d930c9cd981a0523a037faca8425f9a921c6ebca8f7087f8aab5bc53fe9cd5acfa9e" ct=bytes.fromhex(ct) sum=[] for i in range(1,len(ct)): a= (ct[i]- ct[i-1])%256 sum.append(a) #sum = [58, 151, 168, 9, 4, 246, 220, 20, 236, 53, 88, 101, 15, 198, 200, 220, 93, 182, 200, 252, 202, 252, 208, 13, 225, 112, 87, 153, 4, 203, 130, 235, 30, 125, 151, 195, 208, 186, 161, 212, 176, 120, 165, 37, 223, 197, 225, 23, 113, 178, 11, 7, 151, 171, 158, 57, 215, 78, 164] list_key=[] for i in range(5): for i in range(0,16): if len(list_key)== len(sum): break else: list_key.append(i) #list_key= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # print(list_key[-16:]) key=[0]*16 key[0]= (sum[0] - ord('K'))%256 key[1]= (sum[1] - ord('M'))%256 key[2]= (sum[2] - ord('A'))%256 key[3]= (sum[3]- ord('{'))%256 key[10]= (sum[-17] - ord('|')) %256 key[9]= (sum[-18]- ord('}'))%256 key[15]= (sum[-1] - key[10])%256 key[14]= (sum[-2] -key[9])%256 key[8] = (sum[-8] - key[3])%256 key[7]= (sum[-9] - key[2])%256 key[6]= (sum[-10]- key[1])%256 key[5]= (sum[-11] - key[0])%256 key[4]= (sum[-12] - key[15])%256 key[11]= (sum[-5] - key[6])%256 key[12]= (sum[-4]- key[7])%256 key[13]= (sum[-3] - key[8])%256 msg="" for i in range(len(sum)): b= (sum[i] - key[i%len(key)])%256 msg= msg + chr(b) print(msg) #KMA{https://zhuanlan.zhihu.com/p/30548907}|ïJgh¤yû)6^S{ ```