2023梦想凌武杯部分wp

j1ya Lv5

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 Image
import numpy as np
import time
import random

def arnold(img, shuffle_times, a, b):
r, c = img.shape #image可理解为一个二维数组,r和c一般相等
p = np.zeros(img.shape, np.uint8) #创建一个新的二维数组,形状与img相同

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 parser
date="2023-05-18 14:44:31"
t=parser.parse(date)
timestamp=t.timestamp()
#1684392271.0

逆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 Image
import numpy as np
import random
import os

def 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;
}
//flag{It_1s_4_nic3_Fl0wer_Tea!!!}

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))
#b'flag{e258f6b6-325f-08c1-4bb3-29948941d33d}'

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, s2n
from math import gcd
from secret import flag


N = 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}")


# r=171371684635649889977856070309269110771
# p=277270558147749191632249908893474439337
# q=201212034784923798350096480358633217181
# n=9560855965832374257718943747551641499513238169440164540579112699901978993325806299873367492510958871311711713046687
# e=17
# c=4025650285533614119566905275058566964431307509644327371700837719067769297703166165990939081249230251485657413448604

先求出real_n,发现e和phi互素直接用模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from Crypto.Util.number import *
import gmpy2
r=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))
#b'flag{wh4t_a_Tr1pl3_RSA}'
  • 标题: 2023梦想凌武杯部分wp
  • 作者: j1ya
  • 创建于 : 2023-07-12 23:27:54
  • 更新于 : 2026-09-20 23:38:21
  • 链接: https://redefine.ohevan.com/2023/07/12/2023梦想凌武杯部分wp/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论