2025-TPCTF-ReverseEnginger

nanonymous spam

利用 X-Real-IP 头伪造IP, 来获取规则

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
import re  
import requests

import time


def get_cur_ip(cur_ip):
# cur_ip = re.findall('http://www.cip.cc/(.*?)\n', response.text)[0]
# print(cur_ip) burp0_url = "http://1.95.184.40:8520/"
burp0_headers = {"Pragma": "no-cache", "Cache-Control": "no-cache", "DNT": "1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "X-Real-IP": cur_ip,
"Connection": "keep-alive"}
response = requests.get(burp0_url, headers=burp0_headers, proxies={"http": "http://127.0.0.1:10808"})

res = re.findall('<div class="username">User: (.*?)</div>', response.text)[-1]

print(cur_ip, res)

# 暂停1 s
time.sleep(1)

for i in range(0, 1000):
try:
s1 = (0 + (103 * i*513 * 313)) % 256
s2 = ((0 + (103 * i*513* 313)) // 256) % 256
s3 = (((0 + (103 * i * 513* 313)) // 256) // 256) % 256
s4 = (((0 + (103 * i*513 * 313)) // 256) // 256) // 256


cur_ip = [str(s4), str(s3), str(s2), str(s1)]

cur_ip = '.'.join(cur_ip)
# if cur_ip in s:
# continue get_cur_ip(cur_ip)
break
except Exception as e:
print(i, cur_ip, 'error!')

发现中间三位随着ip地址的变动而变动,刚好用户名是12 个,猜测每一组对应着 一个变动
image.png

有了这些想法后,循环测试出规则:
第一轮是103个
然后第二轮测试,发现是 513 个
第三轮进位 发现是 313 个
第四轮只到 260个 就大于 255 , IP范围,所以暂定 260 个元素

并且 第二轮进位之后,每一位的位置还会发生变化!(当然这与解题无关)

拿到进位表以及相关规律后,编写脚本梭哈即可。

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
s = ["VicCouNeaGas", "DemHohBojWod", "PowFitGuoRut", "VetTasBesDae", "FasLiuTasJoi", "DevRecWoeDia", "BogHubSorHad",
"BagLibYupSix", "MowPetBecZan", "LonRecRipLuk", "KarYapTajGot", "TiaLiuFayDic", "VizDivCitBot", "LeaLatReaSac",
"FasLiuVicToc", "KunSadMerMun", "LemLiuGuoReq"]

l = ["Nod", "Tap", "Liz", "Mel", "Fig", "Rif", "Rip", "Pud", "Foo", "Haw", "Wef", "Kel", "Gat", "Hod", "Mom", "Lin",
"Fez", "Rua", "Fay", "Pat", "Ned", "Taz", "Sid", "Mic", "Nom", "Hab", "Rug", "Men", "Nok", "Fun", "Pox", "Red",
"Jah", "Tet", "Hip", "Tem", "Bad", "Mir", "Taj", "Maf", "Rac", "Zia", "Hea", "Fis", "Dem", "Bim", "Gow", "Hub",
"Job", "Nex", "Jas", "Lie", "Sim", "Poc", "Ran", "Voa", "Gig", "Jes", "Nie", "Lal", "Lek", "Pen", "Cos", "Col",
"Nao", "Mop", "Bac", "Cis", "Mor", "Vim", "Ceo", "Gic", "Mii", "Dep", "Len", "Few", "Lob", "Lea", "Bec", "Mui",
"Pec", "Mab", "Her", "Tas", "Tui", "Kun", "Vic", "Too", "Woe", "Uav", "Dam", "Jin", "Kaz", "Yew", "Cid", "Jaw",
"Hay", "Gib", "Mis", "Til", "Six", "Bot", "Guo"]

l1 = ["Wim", "Het", "Fau", "Ria", "Dio", "God", "Man", "Lim", "Fap", "Bar", "Sot", "Uae", "Faq", "Gum", "Doe", "Kay",
"Vol", "Bic", "Ren", "Sox", "Ral", "Pii", "Fol", "Noo", "Wes", "Law", "Pic", "Zig", "Ric", "Tad", "Pav", "Loo",
"Tea", "Koh", "Fia", "Rep", "Soa", "Gog", "Rim", "Nec", "Jun", "Sus", "Roh", "Sac", "Diy", "Gin", "Gul", "Via",
"Tec", "Mah", "Rus", "Cal", "Wat", "Mes", "Pam", "Sav", "Luz", "Lac", "Jud", "Lop", "Tub", "Lia", "Kip", "Nau",
"Loa", "Roa", "Dos", "Nor", "Jaz", "Fim", "Boo", "Pad", "Duo", "Min", "Vis", "Hux", "Cue", "Soc", "Caw", "Rig",
"Wod", "Pag", "Tak", "Cag", "Coe", "Lev", "Ted", "Vax", "Peo", "Uic", "Cus", "Huh", "Rub", "Gia", "Raf", "Bed",
"Pei", "Sig", "Pur", "Qin", "Dai", "Deb", "Pof", "Neg", "Tol", "Lux", "Jus", "Uah", "Que", "Noe", "Lov", "Zee",
"Con", "Fey", "Soi", "Tex", "Pin", "Kap", "Sal", "Luo", "Tim", "Mid", "Daw", "Had", "Gam", "Jul", "Jie", "Wol",
"Mon", "Roc", "Rel", "Bas", "Nou", "Reo", "Mar", "Dao", "Niu", "Kev", "Dee", "Wip", "Coc", "Fes", "Rat", "Dig",
"Teu", "Mob", "Mae", "Car", "Tux", "Dew", "Xue", "Poi", "Sit", "Xin", "Per", "Mos", "Top", "Gab", "Yin", "Loi",
"Jay", "Moi", "Yeo", "Day", "Dic", "Haq", "Dak", "Mer", "Wii", "Pix", "Fag", "Dog", "Por", "Nib", "Hog", "Huw",
"Voc", "Hob", "Zep", "Neo", "Com", "Seo", "Cur", "Mow", "Reb", "Jim", "Noc", "Big", "Fin", "Sek", "Fav", "Niv",
"Pom", "Pes", "Ker", "Yao", "Coq", "Tif", "Gem", "Cel", "Zit", "Toc", "Jet", "Vow", "Lon", "Rev", "Joi", "Jem",
"Wad", "Bom", "Tar", "Pua", "Rao", "Bio", "For", "Dec", "Win", "See", "Pup", "Mea", "Fam", "Muh", "Doo", "Moh",
"Sam", "Maw", "Tog", "Moe", "Tin", "Hur", "Won", "Lox", "Poa", "Dun", "Run", "Bil", "Vip", "Viv", "Del", "Nae",
"Zip", "Roo", "Sum", "Leh", "Lam", "Yoo", "Yip", "Tow", "Pil", "Nab", "Goi", "Gar", "Qua", "Cor", "Hav", "Let",
"Ree", "Set", "Lee", "Cef", "Jam", "Fal", "Daa", "Put", "Num", "Vod", "Tis", "Cad", "Mot", "Rit", "Lex", "Nav",
"Sia", "Lip", "Nox", "Raj", "Pie", "Hel", "Bam", "Fed", "Los", "Fax", "Neh", "Jag", "Sec", "Jap", "Sun", "Cea",
"Jug", "Sis", "Cut", "Fit", "Fox", "Bum", "Joh", "Lag", "Fic", "Sae", "Gaz", "Yuh", "Hee", "Fae", "Caf", "Nag",
"Bay", "Ray", "Log", "Dim", "Bag", "Gap", "San", "Sup", "Kuo", "Wav", "Suh", "Kal", "Tom", "Ret", "Seb", "Wil",
"Jen", "Haz", "Cum", "Xiv", "Pon", "Cod", "Kit", "Biz", "Gag", "Fen", "Leg", "Uid", "Bod", "Peg", "Fur", "Pip",
"Vid", "Ter", "Mol", "Yor", "Tek", "Koo", "Sui", "Gis", "Cia", "Jig", "Nad", "Sin", "Wop", "Hou", "Xii", "Mim",
"Naa", "Nia", "Fai", "Cat", "Mio", "Vee", "Sew", "Pal", "Bub", "Lis", "Cac", "Bid", "Pah", "Dip", "Goy", "Rum",
"Hoc", "Viz", "Fog", "Tax", "Kin", "Req", "Kik", "Coa", "Meh", "Mum", "Lap", "Mov", "Pir", "Bop", "Der", "Dag",
"Lei", "Jit", "Tod", "Far", "Tig", "Tae", "Ten", "Toe", "Sep", "Mac", "Hua", "Vik", "Piu", "Rar", "Hut", "New",
"Pap", "Hid", "Xia", "Hug", "Rox", "Rey", "Meg", "Zak", "Uas", "Dug", "Bes", "Ton", "Lad", "Hus", "Lew", "Jiu",
"Pub", "Buy", "Bet", "Nog", "Yak", "Bau", "Qol", "Yet", "Dor", "Buh", "Baz", "Kat", "Fei", "Kon", "Nuh", "Noa",
"Cap", "Cil", "Tan", "Jed", "Dur", "Bol", "Sux", "Gov", "Dev", "Teh", "Bob", "Bal", "Pep", "Hah", "Res", "Cai",
"Gas", "Qiu", "Wiz", "Pis", "Heh", "Dil", "Yer", "Gon", "Nis", "Fiu", "Ber", "Gan", "Bak", "Fud", "Cog", "Zim",
"Doa", "Bos", "Hen", "Hes", "Dub", "Web", "Lol", "Zoo", "Vag", "Lep", "Vin", "Cep", "Sow", "Naw", "Mee", "Vir",
"Jae", "Lic", "Gah", "Wax", "Zap", "Bur", "Civ", "Tag", "Led", "Boe", "Cin", "You", "Daf", "Beg", "Xan", "Wix",
"Nun", "Yap", "Bai", "Cox", "Sur", "Fet", "Moj", "Lau", "Dis", "Mat", "Rid", "Mal", "Ris", "Uis", "Hib", "Vie",
"But"]

l2 = ["Ser", "Dea", "Jac", "Way", "Cio", "Tie", "Tun", "Goa", "Sap", "Fan", "Jor", "Pit", "Gor", "Son", "Mun", "Dan",
"Veg", "Wel", "Sev", "Jeb", "Gio", "Ceu", "Bib", "Cif", "Bug", "Zan", "Mec", "Rob", "Lao", "Hew", "Quo", "Hor",
"Foe", "Mak", "Hol", "Fil", "Cam", "Nur", "Vet", "Yea", "Yup", "Lot", "Jab", "Goo", "Soy", "Pay", "Hoe", "Dud",
"Qos", "Boa", "Ceb", "Lug", "Nic", "Rai", "Nap", "Sem", "Rue", "Bah", "Sez", "Jib", "Ual", "Mus", "Cip", "Cir",
"Yan", "Div", "Bor", "War", "Don", "Tug", "Tuk", "Maj", "Hae", "Rui", "Git", "Gil", "Lab", "Med", "Mag", "Dui",
"Ruv", "Raw", "Sol", "Foy", "Sib", "Sub", "Moz", "Ras", "Mil", "Rem", "Nix", "Dom", "Ban", "Zeb", "Woo", "Pus",
"Mau", "Boi", "Ped", "Kee", "Pop", "Mix", "Wai", "Gun", "Ley", "Cee", "Bok", "Fao", "Sul", "Zac", "Siu", "Jan",
"Sai", "Ged", "Pau", "Cop", "Les", "Suu", "Dir", "Var", "Wap", "Tai", "Wah", "Rei", "Pas", "Bat", "Cas", "Fad",
"Joe", "Nir", "Fem", "Hai", "Tal", "Wea", "Rok", "Hoa", "Goh", "Hof", "Nos", "Roy", "Nem", "Bel", "Yui", "Wor",
"Neb", "Tot", "Luv", "Yun", "Lil", "Doc", "Lai", "Hem", "Kew", "Lay", "Nik", "Gus", "Hoh", "Fix", "Cup", "Fer",
"Deo", "Coy", "Jer", "Luc", "Gif", "Cou", "Dob", "Dow", "Hum", "Hom", "Nan", "Dot", "Den", "Yeh", "Ces", "Jak",
"Nei", "Rag", "Dar", "Pun", "Dex", "Gee", "Nes", "Mit", "Fos", "Sed", "Pac", "Cic", "Toi", "Raz", "Tok", "Did",
"Rik", "Hit", "Kam", "Hiv", "Jut", "Tee", "Pod", "Gir", "Sax", "Hat", "Dab", "Nai", "Jez", "Was", "Bon", "Kid",
"Him", "Tia", "Bin", "Wep", "Dup", "Yue", "Maa", "Hao", "Suv", "Ken", "Mod", "Kan", "Moc", "Cow", "Sex", "Ben",
"Deg", "Gaf", "Yaw", "Luk", "Faa", "Bow", "Ror", "Bee", "Cob", "Loy", "Row", "Det", "Nut", "Rah", "Coi", "Rap",
"Def", "Hie", "Tic", "Wis", "Mew", "Dav", "Sir", "Zoe", "Zin", "Uac", "Rab", "Yen", "Sip", "Nip", "Bir", "Pak",
"Kar", "Gen", "Kea", "Sor", "Lod", "Fas", "Sif", "Zag", "Rea", "Wed", "Vex", "Lem", "Sob", "Sue", "Lar", "Rav",
"Sou", "Bev", "Kek", "Kol", "Rae", "Map", "Dah", "Pee", "Tam", "Loc", "Boc", "Coz", "Ful", "Paz", "Hop", "Bui",
"Ref", "Coo", "Rez", "Seq", "Lou", "Hon", "Leo", "Bis", "Dia", "Hui", "Mai", "Pez", "Boy", "Rog", "Dac", "Tut",
"Rut", "Cuz", "Now", "Nii", "Yas", "Doj", "Saw", "Bex", "Fom"]

l3 = ["Puc","Maz","Doh","Hun","Cud","Vit","Wer","Hag","Din","Feb","Gui","Rak","Vac","Kim","Pol","Som","Saa","Hac","Xie","Ses","Van","Nef","Mia","Tab","Pid","Ver","Cay","Jog","Jar","Lan","Hex","Soe","Lid","Fip","Wet","Ner","Dey","May","Dua","Dez","Gut","Sag","Kor","Yon","Haa","Par","Fat","Vel","Yum","Wac","Poe","Yes","Rex","Gop","Cit","Val","Xix","Bit","Mig","Mib","Gaa","Sat","Mex","Geo","Doi","Mou","Dol","Joy","Caa","Dix","Nat","Boj","Mad","Pew","Nev","Sas","Rin","Dal","Joo","Vii","Tid","Hap","Sea","Cae","Cab","Nea","Wan","Mem","Nam","Mao","Pov","Pio","Bey","Vas","Jee","Not","Lat","Sud","Bog","Hue","Rio","Got","Liu","Lax","Fec","Duc","Rec","Mas","Cig","Vox","Rov","Pow","Sil","Gac","Pet","Yay","Sad","Ram","Box","Wag","Nin","Lib","Tou","Dae","Tau","Teo","Sod","Hoy","Tip","Cer","Wee","Nov","Keg","Nit","Wok","Hin","Tue","Ron","Roi","Vos","Sao","Kia","Tix","Mip","Cub","Nah","Hot","Wic","Yar","Sic","Sar","Kok","Fee","Yuk","Hoo","Hei","Dap","Cen","Las","Guy","Jon","His","Moo","Roz","Fac","Fir","Ham","Rad","Foi","Sof","Poo","Toa","Kos","Sei","Dof","Get","Bap","Kes","Die","Dad","Pea","Nus","Tit","Ros","Nay","Moa","Zen","Mam","Heb","Fab","Rib","Cao","Hey","Wot","Soo","Kai","Cem","Rom","Uaw","Zed","Noi","Sab","Tes","Gob","Jax","Nob","Bao","Tos","Tor","Mep","Pan","Har","Guv","Foa","Nih","Cim","Pig","Jot","Sop","Duh","Jia","Nil","Fib","Kei","Gad","Toy","Pim","Gel","Cet","Hal","Wen","Yah","Nup","Jai","Paw","Pos","Qed","Tel","Gay","Liv","Bus","Fop","Pia","Miu","Ked","Fea","Fob","Sel","Miz","Lor","Tay","Pot","Tac","Wei","Mug","Dat","Wal","How","Yow","Pax"]

def int_to_ip(num):
return ".".join(str((num >> shift) & 0xFF) for shift in (24, 16, 8, 0))

import libnum

for i in s:
s1 = i[0:3]
s2 = i[3:6]
s3 = i[6:9]
s4 = i[9:]

# print(s1, s2, s3, s4)

ssl = [s1, s2, s3, s4]
res = []
res1 = []
value = 0
for i in ssl:
if i in l:
a = l.index(i)
value += a
res.append(a)
res1.append(1)
if i in l1:
a = l1.index(i)
value += a * 103
res.append(l1.index(i))
res1.append(2)
if i in l2:
a = l2.index(i)

value += a * (103 * 513)
res.append(l2.index(i))
res1.append(3)
if i in l3:
a = l3.index(i)

value += a * (103 * 513 * 313)
res.append(l3.index(i))
res1.append(4)

# print(res, int_to_ip(value))
print(libnum.n2s(value).decode(), end="")
# print(res1)

# TPCTF{finally_the_criminal5_wh0_publi5hed_the5e_5pam_were_arre5ted}

obfuscator

打开,找到二进制文件的尾部,发现js代码
image.png

dump 下来

简单分析,发现简单逻辑,这里 dump jS0v console.log打印出来 或者 文件保存出来. (注意: 必须使用 node js 22 以上的版本才能运行!)
image.png

发现,不太行,测试发现 bIQv(Y4QD.toString()) 的返回结果应该是 ipgslcfa 替换上去
image.png

得到 下一层内容
image.png

继续分析,发现kEBN 是结果,继续dump
image.png

最终得到 wasm 文件
image.png

反汇编为高级语言形式

1
wasm-decompileexe test.asm -o test.o

常量中暴露 flag 解密参数

image.png

结合其他常量字符串,猜测可能是AES CBC ,即编写脚本解密尝试:

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
In [115]: from Cryptodome.Cipher import AES

In [116]: from Cryptodome.Util.Padding import unpad

In [117]: encrypted_flag = bytes.fromhex("5ab82be11ac991707e166bbfcbf05cb5776b0ecb34ce659e6209542fecba7ab6ec82f44c1ab55e4f4fb06b37ef935b08")
...: masked_key = bytes.fromhex("960937ed01e77d7662565988a67abbfe0a2c11742abd00d6cf74de094447f7d3")
...: masked_iv = bytes.fromhex("a7ccfe57d2af1deb1a0088517c0a9240")
...: mask = bytes.fromhex("5dabc0b2b7296eefeaadd177746adb4acb2439e7990792cc7fdb7124b1a2633d")
...:
...: # 计算原始密钥和 IV
...: original_key = bytes([masked_key[i] ^ mask[i] for i in range(32)])
...: original_iv = bytes([masked_iv[i] ^ mask[i] for i in range(16)])

In [118]: cipher = AES.new(original_key, AES.MODE_CBC, original_iv)
...: decrypted_data = cipher.decrypt(encrypted_flag)
...:
...: # 移除 PKCS#7 填充
...: try:
...: plaintext = unpad(decrypted_data, AES.block_size).decode('utf-8')
...: print(f"解密成功! Flag: {plaintext}")
...: except ValueError:
...: print("解密失败")

解密成功! Flag: TPCTF{m47r3shk4_h4ppy_r3v3r53_g@_w45m}

magicfile

根据字符串得到项目使用的 libmagic 库

重命名一些函数

image.png

提取magic 规则

image.png
image.png

原本想解析这个规则文件,发现没成功,随便看看发现,判断flag成功, 定位到向上的位置:
image.png

疑似flag
image.png

将他们拼接起来,发现刚好 41 位, 上面的反汇编里也提示了flag有 48 位。
再补上 TPCTF{
再根据单词意思补上 Y
即得到flag
image.png


2025-TPCTF-ReverseEnginger
https://pwner.top/2025/03/10/2025-TPCTF/
作者
m1n9yu3
发布于
2025年3月10日
许可协议