Misc ezCache 恢复原来的文件:vim -r .flag.swp
将swp文件保存:write ./flag.txt
swp文件在kali桌面上不可见,直接运行即可,可得到高度修改后的二维码
截图后用excel手搓,得到一串字符:7=28L9_(0E@0#64@GbC0uC_|0G:>N
猜测是ascii偏移,每一位+47,得到:flag{h0W_to_Recov3r_Fr0M_vim}
ezSteganography 加密脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 from PIL import Imageimport numpy as npimport timeimport randomdef arnold (img, shuffle_times, a, b ): r, c = img.shape p = np.zeros(img.shape, np.uint8) for times in range (shuffle_times): for i in range (r): for j in range (c): x = (i + b * j) % r y = (a * i + (a * b + 1 ) * j) % c p[x, y] = img[i, j] img = np.copy(p) return p img = Image.open ("flag.png" ) img_arry = np.array(img, np.uint8) seed = int (time.time()) random.seed(seed) shuffle_times = random.randint(0 , 100 ) a = random.randint(0 , 1000000000 ) b = random.randint(0 , 1000000000 ) print (f"a={a} \nb={b} \ntime={shuffle_times} \nseed={seed} " )Image.fromarray(arnold(img_arry, shuffle_times, a, b)).save("out.png" )
获得图片修改的时间戳
1 2 3 4 5 from dateutil import parserdate="2023-05-18 14:44:31" t=parser.parse(date) timestamp=t.timestamp()
逆arnold变换,往前爆破30秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 from PIL import Imageimport numpy as npimport randomimport osdef reverse_arnold (img, shuffle_times, a, b ): r, c = img.shape current = np.copy(img) for _ in range (shuffle_times): p = np.zeros(current.shape, dtype=np.uint8) for x in range (r): for y in range (c): i = ((a * b + 1 ) * x - b * y) % r j = (-a * x + y) % c p[i, j] = current[x, y] current = np.copy(p) return current def decrypt_with_seed (img_array, seed ): random.seed(seed) shuffle_times = random.randint(0 , 100 ) a = random.randint(0 , 1000000000 ) b = random.randint(0 , 1000000000 ) result = reverse_arnold(img_array,shuffle_times,a,b) return result, shuffle_times, a, b if __name__ == "__main__" : input_file = "out.png" start_seed = 1684392271 search_seconds = 30 output_dir = "out" os.makedirs(output_dir, exist_ok=True ) img = Image.open (input_file) img_array = np.array(img, np.uint8) print (f"起始 seed: {start_seed} " ) print (f"向前搜索: {search_seconds} 秒" ) for offset in range (search_seconds + 1 ): seed = start_seed - offset result, shuffle_times, a, b = decrypt_with_seed(img_array,seed) output_file = os.path.join(output_dir,f"{seed} .png" ) Image.fromarray(result).save(output_file) print (f"seed={seed} " ) print (f"完成,共尝试 {search_seconds + 1 } 个 seed," )
最后1684392270对应的图片是张二维码,扫描后得到:flag{a_Cut3_r4nd0m_c4t}
ezQRcode 二维码需要缩放,旋转,同时碎片之间存在重复区域
断网环境纯手搓,Flag{Y0u_d1D_tHe_J06_welL}
Reverse base64 输入v7经过1180函数处理
发现是变表base64
密文
flower_tea 先将前两个字节改为MZ然后脱壳
题目提示flower说明有花指令
有call函数调用花指令,全部nop
之后删除红色的函数 ,再在汇编界面函数入口处按p创建函数
跟进加密函数,发现是tea,delta为0x21524111,key为v4数组
直接写脚本逆向
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> #include <stdlib.h> #include <stdint.h> void decrypt (uint32_t v[2 ], const uint32_t key[4 ]) { uint32_t v0 = v[0 ], v1 = v[1 ], delta = 0x21524111 ; int32_t sum=delta*(-32 ); for (int i = 0 ; i < 32 ; i++) { v1 -= ((v0 << 4 ) + key[2 ]) ^ (v0 + sum) ^ ((v0 >> 5 ) + key[3 ]); v0 -= ((v1 << 4 ) + key[0 ]) ^ (v1 + sum) ^ ((v1 >> 5 ) + key[1 ]); sum += delta; } v[0 ] = v0; v[1 ] = v1; } int main () { uint32_t key[4 ] = {0x1234 , 0x2341 , 0x3412 ,0x4123 }; uint32_t v5[8 ] = {0xb43ff72d ,0x13544b96 ,0x261d123d ,0xf989615e ,0x8e27fbc1 ,0x4846493b ,0xdc55c2f7 ,0x4bb87956 }; for (int i = 0 ; i < 8 ; i += 2 ) { decrypt(&v5[i], key); } for (int i = 0 ; i < 8 ; i++) { for (int m = 0 ; m <= 3 ; m++) { printf ("%c" , (v5[i] >> (8 * m)) & 0xff ); } } return 0 ; }
Crypto babyRSA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 from Crypto.Util.number import *flag = b'flag{this_is_a_test_flag}' m = bytes_to_long(flag) p = getPrime(1024 ) q = getPrime(1024 ) n = p * q e = getPrime(64 ) c = pow (m, e, n) phi = (p - 1 ) * (q - 1 ) d = inverse(e, phi) dp = d % (p - 1 ) dq = d % (q - 1 ) print (f'p = {p} ' )print (f'q = {q} ' )print (f'dp = {dp} ' )print (f'dq = {dq} ' )print (f'c = {c} ' )''' p = 168809486331386247069654944323712072842076692928596555558647901740136295658157387172427033721249088414251603275460893895869789024082843138535484063487117780914751466182303821120084599462205829292678004943428405858515589100746368603381482270651798053324663540177333449505950526339827345646879767171066500041811 q = 119862786084083952370036118002878825665885699527025351777209529967674158168871754765948401876048983922258477062661006180414490218676242142530239554392293711933419346347928913806375848830179801037463876661026024160404680467415830926723533951504697981564095562590339916814949075681669786522439428566653928026203 dp = 49122326793681619767702766151936976365936458100004883524834624582431610086119372764085235221777718546020578591557325818762473508533932393606484064512819433745859910749633580144689169822055994580493009536623010356786869812905456241173083209742041467181336945753233994278336047952490057522807941364878543136353 dq = 27835438217265393116155154144056362356770770134339543960160677470875993093373563649080052557296863377064468669807520621297776265243258700700236459063140841789745140968301327918865684943438120659838450060197873735537392081905691227237340578432978272380721777986724915483629648197516720249112361647129191441081 c = 12800159220499245497770338949162205317239046632299089748838893146873928932253768515869595297459072717951172448490155722146850065060264829830855796935530652556273500881339330638243639805143128668042379762616335921976462691751305871781421881058892411246736402468493160542492267971310935030483643304763406507229329780434567222297003073383203887498279558093910947688021052152700673424616138263845368838970346993281965084329569870226766931099565548703374981097756192771501910860065561412745971358449841862554172030198517000106186036175494223218350591881567278509125534468818055207927932051062916335060664713171915626108784 '''
模板题,dp和dq泄露
1 2 3 4 5 6 7 8 9 10 11 12 13 from Crypto.Util.number import *p = 168809486331386247069654944323712072842076692928596555558647901740136295658157387172427033721249088414251603275460893895869789024082843138535484063487117780914751466182303821120084599462205829292678004943428405858515589100746368603381482270651798053324663540177333449505950526339827345646879767171066500041811 q = 119862786084083952370036118002878825665885699527025351777209529967674158168871754765948401876048983922258477062661006180414490218676242142530239554392293711933419346347928913806375848830179801037463876661026024160404680467415830926723533951504697981564095562590339916814949075681669786522439428566653928026203 dp = 49122326793681619767702766151936976365936458100004883524834624582431610086119372764085235221777718546020578591557325818762473508533932393606484064512819433745859910749633580144689169822055994580493009536623010356786869812905456241173083209742041467181336945753233994278336047952490057522807941364878543136353 dq = 27835438217265393116155154144056362356770770134339543960160677470875993093373563649080052557296863377064468669807520621297776265243258700700236459063140841789745140968301327918865684943438120659838450060197873735537392081905691227237340578432978272380721777986724915483629648197516720249112361647129191441081 c = 12800159220499245497770338949162205317239046632299089748838893146873928932253768515869595297459072717951172448490155722146850065060264829830855796935530652556273500881339330638243639805143128668042379762616335921976462691751305871781421881058892411246736402468493160542492267971310935030483643304763406507229329780434567222297003073383203887498279558093910947688021052152700673424616138263845368838970346993281965084329569870226766931099565548703374981097756192771501910860065561412745971358449841862554172030198517000106186036175494223218350591881567278509125534468818055207927932051062916335060664713171915626108784 n = q*p m1 = pow (c,dp,p) m2 = pow (c,dq,q) i = inverse(q,p) m = (i*(m1-m2)%p)*q+m2 print (long_to_bytes(m))
ezRSA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from Crypto.Util.number import *from libnum import n2s, s2nfrom math import gcdfrom secret import flagN = 128 r = getPrime(N) p = getPrime(N) q = getPrime(N) n = r * p * q e = 17 m = s2n(flag) c = pow (m, e, n) print (f"r={r} " )print (f"p={p} " )print (f"q={q} " )print (f"n={n} " )print (f"e={e} " )print (f"c={c} " )
先求出real_n,发现e和phi互素直接用模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from Crypto.Util.number import *import gmpy2r=171371684635649889977856070309269110771 p=277270558147749191632249908893474439337 q=201212034784923798350096480358633217181 n=9560855965832374257718943747551641499513238169440164540579112699901978993325806299873367492510958871311711713046687 e=17 c=4025650285533614119566905275058566964431307509644327371700837719067769297703166165990939081249230251485657413448604 real_n = n // r phi= (p-1 )*(q-1 ) d = inverse(e, phi) m = pow (c, d, real_n) print (long_to_bytes(m))