API KEY:tp-sfajm删除中文8hh4x4q4dnhfi0xo2iuvm0rrx8q50074xutqmj7xw9g 兼容 OpenAI 接口协议: https://token-plan-sgp.xiaomimimo.com/v1 兼容 Anthropic 接口协议: https://token-plan-sgp.xiaomimimo.com/anthropic 模型mimo-v2.5-pro、mimo-v2.5、mimo-v2.5-asr、mimo-v2.5-tts-voiceclone、mimo-v2.5-tts-voicedesign、mimo-v2.5-tts、mimo-v2-pro、mimo-v2-omni、mimo-v2-tts 3 个帖子 - 2 位参与者 阅读完整话题
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
我先来,买了一把 HHKB ,至今手感优秀,无可取代。
https://linux.do/t/topic/1365853?u=Lonely 牛逼啊 hh 3 个帖子 - 3 位参与者 阅读完整话题
base64 dHAtY3Izcmhkd21sN2JrOTkwejhhNzA4ODA0dm5hNDF4YXo2cno0Z3NxMzhwcGt6ZXhr 4 个帖子 - 3 位参与者 阅读完整话题
用了几年的小米鼠标,虽然买一个不贵,不过能修还是想修一下hhh。就是有时候下滑,他会往上跑。。hh,就是失灵了 1 个帖子 - 1 位参与者 阅读完整话题
key:tp-cyz93amh06r7c7cj把我删去lumyzundw70hha9ek8514brakcv2656p 1 个帖子 - 1 位参与者 阅读完整话题
勿扰 汝如青天,吾见汝如蜉蝣见青天。井底之蛙,坐井而观,不知天地之大,不见青天之广。尝以勇击之,以痴坚之。黄粱一梦醒,方知天地之大,井外之宽。 然勇击之则碎,唯剩一痴。思之过往,热已逝去,不复当年之勇。以蛙身触青天,本不自量力;不敢触,亦不敢语。因汝之言,近而推远,汝语“勿扰”,声声勿扰。一腔热忱,泯然不见,唯剩长叹。 群嘲而笑,以卵击石,石未起波澜而身已碎矣。笑我之痴,笑我之勇,笑我自知而不量力也。难,难,难。 汝之言,如利刃出鞘,削我勇骨,毁我眼界,唯剩痴肉。不见青天,蜉蝣不如,井蛙不若。难入群,再不见。非吾不愿,是汝夺我之视,使我不得见吾。 吾之生,只为卿圆满之衬笔耶?若此,何故令吾见之?何故令吾生之?何故令吾遇之?苍苍不语,厚土无声。难。难。难! 我想先讲讲我和她的事 表白之后,经历了暧昧,但暧昧期间,当时送礼物也不收,也不出来,反正没相信过自己,连表白都是同学帮助的。 然后问了ai,说我边界感不足,又道歉,然后想要降低频率,但实际上似乎并没有,因为ai说的。 然后就觉得她似乎也有一些烦我了,同学怂恿之下就主动推开了她,没有相信过自己,导致了冷战,后来她就把我全平台删除了(实际上还留了一个快手)。 ai说的,其实挺准的。 我又可以怪谁?只能说我自己的错了,想了很久,没办法怪任何人,我还是想她,还是喜欢她,还是想要找天(其实是骚扰,因为这样了还找她不就是骚扰吗),但在分开的时候她说了,不要再打扰她了,这个想法就一直在心里压着没敢行动,就算是行动了又会怎么样?可能会被骂,可能会被挂,唯独不可能回到过去,又何必自讨苦吃呢? 我一直在借助外力,像一个人拄着太多的拐杖,却忘了怎么自己走路。表白靠同学帮忙,边界感问AI,冷战听朋友怂恿。从头到尾,我都没有相信过自己的判断。我不是没有感觉,而是我不敢确认自己的感觉——我总觉得别人说的才是对的,别人的眼睛才看得清楚。我把自己活成了一个空壳,里面装满了别人的声音。所以当我需要真正靠近一个人的时候,我拿不出一个完整的自己。我只能拿出一堆碎片:别人的建议、AI的分析、朋友的策略。而这些碎片,最终割伤的不是别人,是我自己。 不是她先走的。是我。是我感觉到了危险,感觉到了她可能要烦我了,于是我先退了。我把推开当成一种试探——我以为她会挽留,以为她会追上来问一句“你怎么了”。但她没有。她只是安静地接受了我的冷战,然后彻底删除了我。 我这才明白,我把刀递出去的时候,她可以选择接,也可以选择转身。她转身了。而我举着那把刀,愣在原地,连伤口都不知道该往哪里插。 这不是勇敢,这是恐惧。我太害怕被她拒绝了,所以我先拒绝了她。我以为这样至少能保住一点面子,结果我丢掉的不是面子,是她。 我还是想找她。每天都想。那个唯一没删的快手,我看了不知多少遍,手指悬在私信按钮上,却始终没按下去。因为脑子里总会响起那句话:“不要再打扰她了。” 我想纠缠她,但因为她说了那句话,我没有。 这是我在这段关系里,做过的唯一一件完全由自己决定的事。不是朋友教的,不是AI建议的,是她说的——我听进去了。我停住了。 这不能让我不痛,不能让她回来,不能让过去的错误一笔勾销。但它是我最后的底线。我守住了。我在最想践踏那条边界的时候,守住了。这大概是我唯一可以对自己说一句“你做对了”的地方。 我想过怪同学——如果没有他们的怂恿,我或许不会冷战。我想过怪AI——如果它没说我边界感不足,我或许不会那么焦虑。我想过怪她——如果她给我多一点耐心,多一点回应,我或许不会走到那一步。 但想了很久,我谁也怪不了。 同学也许是好心,AI只是在回答问题,她只是在保护自己的边界。把所有外因剥掉之后,剩下的只有我自己。那个不自信的、焦虑的、搞砸了一切的自己。 我没办法怪任何人。这个结论让我平静,也让我更痛。因为这意味着,我再也没有地方可以推卸这份痛苦了。我必须把它吞下去,然后自己消化。 我还是想要她。这个念头没有因为时间、因为她的删除、因为我所有的反思而减少一分。它就是真实地长在心上,像一个改不掉的习惯。 但我也知道,回不去了。就算我去找她,就算她回复了,也回不到从前那个还有暧昧、还有可能的时候了。时间已经走了,人已经变了,信任已经碎了。 所以我带着这个“想要”,像带着一个永远寄不出去的信。不去打扰,不去纠缠,但也不强迫自己忘记。就让它在心里待着,直到某一天,它慢慢变轻,但也可能永远不会变轻。 我到底喜欢她什么?我不知道,颜值?性格?可能只是来源于初一时的惊鸿一瞥,她谈恋爱之后,我本以为我会死心,我开始注意别人,喜欢别人,但始终无法忘记她。之到她和我兄弟分了之后。 在初中毕业之后,一次偶然的聚会,她发现还没有我联系方式,我们两个才成功加上,我原来其实想过要联系方式,但我不敢,那天我很开心,像一个刚刚要到钱买糖的孩子,而我也终于可以再看看她了,当时还没有你们贪心,但后来却慢慢失守了… 如果重来来一次我会怎么做?我也不知道,或许只是暧昧的时间久了一些吧,或许还会这样吧。 我是不是一直在用喜欢她来逃避喜欢自己?我不知道,我无法知道,或许吧。 我写这篇自省,是为了放下,还是为了某一天她可能看见?我写那么多诗或者赋或者文言文又为了什么?或许是为了让她看到,但我清楚的知道她不可能看到,或许只是为了让自己有一个可以安放的地方吧… 现在我失去了那颗糖,手里攥着那张糖纸,我不知道自己以后还会不会要糖,也不知道自己是不是值得被喜欢。 1 个帖子 - 1 位参与者 阅读完整话题
来 L 站快三个月了,没想到终于快到 3 级了。 发一张自家的鱼缸图: PS:养鱼也快 5 年了···(从读研就在实验室开始养鱼 hh) 3 个帖子 - 2 位参与者 阅读完整话题
IT之家 6 月 8 日消息,消息源 SeraphHS 上周在 Reddit 平台透露,他最近收到一家世嘉授权硬件公司的询价单,从参数看像是一台全新的复古掌机。 SeraphHS 自称在一家小型电子产品制造商工作,他收到的询价单来自某家世嘉授权硬件制造商。虽然该公司并非世嘉直属,但肯定和世嘉关系密切。 消息人士透露,这份提案描绘了一台非常有趣,且看起来意义重大的掌机。该设备采用低成本方案,搭载低功耗 ARM 架构处理器, 具备 5 英寸 OLED 屏幕 , 外形尺寸与索尼 PS Vita 相似 。 ▲ 世嘉 Game Gear Micro 同时, 这台掌机支持更换实体卡带 。为控制成本,在其他硬件配置上进行了大量精简。该机不强调 3D 图形性能,专门针对“现代 2D 游戏”和“像素风游戏”设计。卡带则没有使用现代的 NAND 闪存,而是使用低容量的工业级 eMMC(IT之家注:嵌入式多媒体存储卡)模块。 不过 SeraphHS 也提醒,类似的报价请求在硬件行业十分常见,很多项目最终都不会进入正式开发阶段。
很有意思的一题逆向hh,挺对胃的 来源于google ctf 2025 源码 <!DOCTYPE html> <!-- saved from url=(0092)https://nicolaisoeborg.github.io/ctf-writeups/2025/Google%20CTF%202025/JSSafe/js_safe_6.html --> <html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="Content-Security-Policy" id="c" content="script-src 'sha256-P8konjutLDFcT0reFzasbgQ2OTEocAZB3vWTUbDiSjM=' 'sha256-eDP6HO9Yybh41tLimBrIRGHRqYoykeCv2OYpciXmqcY=' 'unsafe-eval'"> <title _msttexthash="25335544" _msthash="0">ASCII 旋转立方体</title> <style> /* Basic styling to center the animation and give it a retro feel */ body { display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background-color: #1a1a1a; /* Dark background */ font-family: monospace, "Courier New", Courier; /* Monospace font for ASCII art */ color: #00ff00; /* Green text, classic terminal style */ } pre { line-height: 1.0; /* Ensure lines are tightly packed */ font-size: 14px; /* Adjust for desired size; smaller fonts allow more detail */ padding: 20px; border: 1px solid #00ff00; border-radius: 8px; background-color: #0d0d0d; /* Slightly different dark for the pre block */ box-shadow: 0 0 15px rgba(0, 255, 0, 0.3); } </style> </head> <body> <pre id="cubeCanvas">h^Y8][email protected]~e*sh=Z'8*4UGpmMr]$.ljH{Q4&6r-Zew9!zzH 7im:7zzs+t &5L'5wv&|ssS8R7g5Sb!f42Q@xN{B{$$s{FQNMK/wD(3xLnXO XLG-uI#'eOTS,]QrwB4DLLt+CaUEM_)Lnoe&LZ~*A#][!_8gDd~^fPubXbb^ 0%4s*+7']ER:az7qR6D0$A2plQs@}{z:z 3Q,+jbUS9sT8'>m-uasBb$o5{6 555fF[?zR]}ie+bcZ5Nk<3Zpmj7r$^X.E&6C:vT;c!ES@>}*)bfup:O>U#j@ ^7,]}oTU}[=Ln6" 5=}<^Y?ii,7('-$ ZH%aT=ws"kgLF$T :~mR9%OQ,w7BMdY b}|/%67!xz&|I~N ^,/cG8Tnq;]96wT g%l$!0Psg2S'dn% ########## cXUU19V{&>m*;>o ~Meepb"9ft"*E.D # ##### #### b=<V.s+m(x=:.5[ >CGqx0AvnhC"jMN # ########## z%#WY-v@kp;({]Z ga+7yj:lPzD_ASb # # # # 38t>^J&YsAa}:>> <D0uaBCl$H^;mj| # # # # /KZGA7%*"^!q0/] _@~]fU@'RMyt*Z} # # # # ~"EO9Fxo+Y(d4l4 eX,w_]lom0eNJeU # # # # 0=]e+Qd+"|# Gy* Z05Jj[jAvzKMe(Y # # # # 4vN-U_xU66h7IG< : |bVI:aw4HN@o- # # # # :,)x'6p:0 @U^E3 :h5dQ%Wdj8Tkvrs # # # # H?s=%ACI,(78Z<q >&5XOy'ffjhS{c& # # # # &eKm0L;$c&wGYQx IH;ZT/fm{C_A_:; # # # # On!M%A].7vhbiz: lGl"LJ%M~.Sb6~) ########## # OW/@)mDwW$czfAZ az0b-_u&#*^v@-[ #### ##### # P9n6LJiTB',j.2I NU c6GH(ekyxHV, ########## [S?3Zn;p4k,YFXx {RNy(zq]".#>]C< eQN''6H?X-oS*#R eHG26u.HCZX!9!w c$P?iUku/Fw!GX, h:r~FHyCgj'G4Y<{f~:ION'^nggp,LI7t8i]{UD,DlVz/2?S"N"O64rIO#Jk 3~iv^VZYD@ltQT<*h]'l7kMk!lWpT3jMDq!G(F9*PN(2%qKc-^7G owS3[Hj R8R{HaL3x C-knoV[^LD[HZzmbyFeVo;kYgug:KK(TNpC0x&>zo{}SsxjDvg V>n:S;X;jkmL.C2+tf;P6,XeLoM"W7on7yw2~5Y;m_OI%>>!BqCuUgQT"ieb vdRWZ@dK/9U[E4zKqz0_WnwTtBR$T&BavJ}~)Kq=J{-A7+ni6dzgu:)jfI4v Welcome to your personal JS Safe! Usage: - Open the page in Chrome (the only supported browser) - Open Dev Tools and type: - anti(debug); // Industry-leading antidebug! - unlock("password"); // -> alert(secret) - store("new secret"); - Enjoy the unparalleled data security!!!!1 </pre> <script id="gemini's cube"> // --- Configuration --- const canvas = document.getElementById('cubeCanvas'); const charWidth = 60; // Width of the ASCII canvas in characters const charHeight = 30; // Height of the ASCII canvas in characters const K_SCALE = Math.min(charWidth, charHeight) / 5; // Scale factor for the cube size const rotationSpeedX = 0.02; const rotationSpeedY = 0.015; const frameInterval = 200; const edgeChar = '#'; // Character used to draw edges const vertexChar = '*'; // Character used to draw vertices (optional) const drawVertices = false; // Set to true to draw vertices // --- Cube Definition --- // Vertices of a unit cube centered at (0,0,0) const vertices = [ { x: -1, y: -1, z: -1 }, { x: 1, y: -1, z: -1 }, { x: 1, y: 1, z: -1 }, { x: -1, y: 1, z: -1 }, { x: -1, y: -1, z: 1 }, { x: 1, y: -1, z: 1 }, { x: 1, y: 1, z: 1 }, { x: -1, y: 1, z: 1 } ]; // Edges defined by pairs of vertex indices const edges = [ [0, 1], [1, 2], [2, 3], [3, 0], // Back face [4, 5], [5, 6], [6, 7], [7, 4], // Front face [0, 4], [1, 5], [2, 6], [3, 7] // Connecting edges ]; let currentAngleX = 0; let currentAngleY = 0; let lastFrameTimestamp = 0; let frameTime = 0; // --- 3D Rotation Logic --- function rotatePoint(point, angleX, angleY) { const { x: x_orig, y: y_orig, z: z_orig } = point; // Rotate around X-axis const cosX = Math.cos(angleX); const sinX = Math.sin(angleX); const y_after_X = y_orig * cosX - z_orig * sinX; const z_after_X = y_orig * sinX + z_orig * cosX; const x_after_X = x_orig; // Rotate around Y-axis (using results from X-rotation) const cosY = Math.cos(angleY); const sinY = Math.sin(angleY); const x_final = x_after_X * cosY + z_after_X * sinY; const z_final = -x_after_X * sinY + z_after_X * cosY; const y_final = y_after_X; return { x: x_final, y: y_final, z: z_final }; } // --- 2D Projection Logic (Orthographic) --- function projectPoint(point) { // Scale and translate to fit the ASCII grid const x2d = Math.round(point.x * K_SCALE + charWidth / 2); const y2d = Math.round(point.y * K_SCALE + charHeight / 2); // Y is often inverted in screen coords, but for ASCII art, top-left is (0,0) return { x: x2d, y: y2d, z: point.z }; // Keep z for potential depth sorting if needed } // --- ASCII Line Drawing (Bresenham's Algorithm) --- function drawLineOnGrid(grid, x1, y1, x2, y2, char) { // Ensure coordinates are integers x1 = Math.round(x1); y1 = Math.round(y1); x2 = Math.round(x2); y2 = Math.round(y2); const dx = Math.abs(x2 - x1); const dy = Math.abs(y2 - y1); const sx = (x1 < x2) ? 1 : -1; const sy = (y1 < y2) ? 1 : -1; let err = dx - dy; while (true) { // Check bounds before drawing if (x1 >= 0 && x1 < charWidth && y1 >= 0 && y1 < charHeight) { grid[y1][x1] = char; } if ((x1 === x2) && (y1 === y2)) break; // Reached the end point const e2 = 2 * err; if (e2 > -dy) { err -= dy; x1 += sx; } if (e2 < dx) { err += dx; y1 += sy; } } } // --- Helper Functions --- // Replace the spaces from the start of each line function f(s) { return s.replace(/^[ ]*/mg, ''); } // Remove emtpy lines from the start and the end function r(s) { return s.replace(/^\n/, '').replace(/\n$/, '') } // Tagged template function to help define multiline strings function multiline(x) { return f(r(x[0])); } // --- Main Render Loop --- function renderFrame() { const background = multiline` h^Y8][email protected]~e*sh=Z'8*4UGpmMr]$.ljH{Q4&6r-Zew9!zzH 7im:7zzs+t &5L'5wv&|ssS8R7g5Sb!f42Q@xN{B{$$s{FQNMK/wD(3xLnXO XLG-uI#'eOTS,]QrwB4DLLt+CaUEM_)Lnoe&LZ~*A#][!_8gDd~^fPubXbb^ 0%4s*+7']ER:az7qR6D0$A2plQs@}{z:z 3Q,+jbUS9sT8'>m-uasBb$o5{6 555fF[?zR]}ie+bcZ5Nk<3Zpmj7r$^X.E&6C:vT;c!ES@>}*)bfup:O>U#j@ ^7,]}oTU}[=Ln6"Y^jH:?5@H]4UU4]@FE6Cw%|{UU1Q!t5=}<^Y?ii,7('-$ ZH%aT=ws"kgLF$Th9[1UU4]@FE6Cw%|{]=6?8E9Yall^Y:~mR9%OQ,w7BMdY b}|/%67!xz&|I~N2hY^bgeUUWW?6H tCC@CX^Y@"/>{iB^,/cG8Tnq;]96wT g%l$!0Psg2S'dn%Y^]DE24<]DA=:EWV6G2=VX]=6?8E9mcXUU19V{&>m*;>o ~Meepb"9ft"*E.D2D51UUWH:?5@H]DE6AZlhd^YO%5NBgb=<V.s+m(x=:.5[ >CGqx0AvnhC"jMN@AY^Za_Y|2E9]7=@@CW1YVw"Xn!"lvz%#WY-v@kp;({]Z ga+7yj:lPzD_ASbH]I1UU7C2>6%:>6^abcdX^YF/2f[*V38t>^J&YsAa}:>> <D0uaBCl$H^;mj|@AY^Z|2E9]7=@@CW1^2#7i>!X:ZeR&/KZGA7%*"^!q0/] _@~]fU@'RMyt*Z}H]I1UUH:?5@H]DE6A^a_XXj18'hf*;~"EO9Fxo+Y(d4l4 eX,w_]lom0eNJeU1j>F=E:=:?6]2C8F>6?ED,_.,_.^Y$0=]e+Qd+"|# Gy* Z05Jj[jAvzKMe(Y=jA[2Y^]C6A=246W^/-?M-?S^8[^Y=4vN-U_xU66h7IG< : |bVI:aw4HN@o-Y^VVX]C6A=246W^/, .Y^>8[VVXMM1:,)x'6p:0 @U^E3 :h5dQ%Wdj8TkvrsncdiKf H?_L5oYT_&G;SZod(CN@mviH?s=%ACI,(78Z<q >&5XOy'ffjhS{c&EU!,&~OYd;umr(Ya@2=PcP+Q@;vS0n&eKm0L;$c&wGYQx IH;ZT/fm{C_A_:;bo B7tk0.R~AU6}n<U%R[,VTsyOL_-On!M%A].7vhbiz: lGl"LJ%M~.Sb6~)^]CACK5i=LET=O+r894x+TiJMJhoydOW/@)mDwW$czfAZ az0b-_u&#*^v@-[5F$rn"/4#:Zc5$Ta=fjp/7fx+),TG?P9n6LJiTB',j.2I NU c6GH(ekyxHV,JkwvCfhVPcnE8;(C=2}_?gwszoo^QD[S?3Zn;p4k,YFXx {RNy(zq]".#>]C<|+4Mn(}!/+YACj}R}XYKuc|9tLM}hseQN''6H?X-oS*#R eHG26u.HCZX!9!w8%St-LYmbhf2rl{"}:*J&~yZ6ALpI5c$P?iUku/Fw!GX, h:r~FHyCgj'G4Y<{f~:ION'^nggp,LI7t8i]{UD,DlVz/2?S"N"O64rIO#Jk 3~iv^VZYD@ltQT<*h]'l7kMk!lWpT3jMDq!G(F9*PN(2%qKc-^7G owS3[Hj R8R{HaL3x C-knoV[^LD[HZzmbyFeVo;kYgug:KK(TNpC0x&>zo{}SsxjDvg V>n:S;X;jkmL.C2+tf;P6,XeLoM"W7on7yw2~5Y;m_OI%>>!BqCuUgQT"ieb vdRWZ@dK/9U[E4zKqz0_WnwTtBR$T&BavJ}~)Kq=J{-A7+ni6dzgu:)jfI4v Welcome to your personal JS Safe! Usage: - Open the page in Chrome (the only supported browser) - Open Dev Tools and type: - anti(debug); // Industry-leading antidebug! - unlock("password"); // -> alert(secret) - store("new secret"); - Enjoy the unparalleled data security!!!!1 `; let grid = background.split('\n').map(l => l.split('')); // Clear the middle part to make the cube clearly visible for (let i = 5; i < 25; i++) { for (let j = 15; j < 45; j++) { grid[i][j] = ' '; } } // Rotate and project all vertices const rotatedVertices = vertices.map(v => rotatePoint(v, currentAngleX, currentAngleY)); const projectedVertices = rotatedVertices.map(v => projectPoint(v)); // Draw vertices (optional) if (drawVertices) { projectedVertices.forEach(p => { if (p.x >= 0 && p.x < charWidth && p.y >= 0 && p.y < charHeight) { grid[p.y][p.x] = vertexChar; } }); } // Draw edges edges.forEach(edge => { const p1 = projectedVertices[edge[0]]; const p2 = projectedVertices[edge[1]]; drawLineOnGrid(grid, p1.x, p1.y, p2.x, p2.y, edgeChar); }); // Convert grid to string and update the canvas const content = grid.map(row => row.join('')).join('\n'); canvas.textContent = content; console.clear(); console.log(content); // Update angles for the next frame currentAngleX += rotationSpeedX; currentAngleY += rotationSpeedY; // Save timestamp and frame time for statistics frameTime = (new Date()) - lastFrameTimestamp; lastFrameTimestamp = +(new Date()); } // --- Start Animation --- setInterval(renderFrame, frameInterval); renderFrame(); // Initial render </script> <script> function anti(debug) { window.step = 0; window.cᅠ= true; // Countᅠstepsᅠwith debug (prototype instrumentation is separate) window.success = false; window.r // ROT47 = function(s) { return s.toString().replace(/[\x21-\x7E]/g,c=>String.fromCharCode(33+((c.charCodeAt()-33+47)%94))); } window.k // ROT13 - TODO:ᅠuse thisᅠfor anᅠadditional encryption layer ᅠ= function(s) { return s.toString().replace(/[a-z]/gi,c=>(c=c.charCodeAt(),String.fromCharCode((c&95)<78?c+13:c-13))); } window.check // Checks password = function() { Function`[0].step; if (window.step == 0 || check.toString().length !== 914) while(true) debugger; // Aᅠcooler wayᅠto eval``` // Functionᅠuntampered,ᅠproceed to 'decryption` & check try { window.step = 0; [0].step; const flag = (window.flag||'').split(''); let iᅠ= 1337, j = 0; let pool =ᅠ`?o>\`Wn0o0U0N?05o0ps}q0|mt\`ne\`us&400_pn0ss_mph_0\`5`; pool = r(pool).split(''); const double = Function.call`window.stepᅠ*=ᅠ2`;ᅠ// To the debugger,ᅠthis isᅠinvisible while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; if (flag[0] == pool[j % pool.length] && (window.step < 1000000)) { iᅠ= j; flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length&&!flag.length) window.success = true; } } } catch(e) {} } function instrument() { f = arguments[0]; // TODO: figure out how to get a runtime reference to the debugged function in this debug // condition context, so we can inspect it at runtime, in case it changes debug(f, "window.c && function perf(){ const l = `" + f + "`.length; window.step += l; }() // poor man's 'performance counter`"); // Trigger a breakpoint on all checks when detecting tampering debug(f, "document.documentElement.outerHTML.length !== 14347"); } function instrumentPrototype(o) { Object.entries(Object.getOwnPropertyDescriptors(o)) .filter(p => p[1].value instanceof Function) .forEach(p => Object.defineProperty(o, p[0], { get: () => (step++) && p[1].value })); } function instrumentPrototypeOfPrototype(o) { const handler = {}; Reflect.ownKeys(Reflect).forEach(h => handler[h] = (a,b,c) => (step++) && Reflect[h](a, b, c)); Object.setPrototypeOf(o, new Proxy(Object.getPrototypeOf(o), handler)); } [Array, Array.prototype, String.prototype, Math, console, Reflect].map(o => Object.values(Object.getOwnPropertyDescriptors(o)).map(x => x.value || x.get).filter(x => x instanceof Function) ).flat().concat(check, eval).forEach(instrument); instrumentPrototype(Array.prototype); instrumentPrototypeOfPrototype(Array.prototype); } function unlock(flag) { const match = /^CTF{([0-9a-zA-Z_@!?-]+)}$/.exec(flag); if (!match) return false; window.flag = match[1]; check(); if (!window.success) return; window.password = Array.from(window.flag).map(c => c.charCodeAt()); const encrypted = JSON.parse(localStorage.content || '[]'); const decrypted = encrypted.map((c,i) => c ^ password[i % password.length]).map(String.fromCharCode).join(''); alert("JS Safe opened! Content:" + decrypted); } function store(secret) { const plaintext = Array.from(secret).map(c => c.charCodeAt()); localStorage.content = JSON.stringify(plaintext.map((c,i) => c ^ password[i % password.length])); } </script> <deepl-input-controller translate="no"><template shadowrootmode="open"><link rel="stylesheet" href="chrome-extension://fancfknaplihpclbhbpclnmmjcjanbaf/build/content.css"><div dir="ltr" style="visibility: initial !important;"><div class="dl-input-translation-container svelte-95aucy"><div></div></div></div></template></deepl-input-controller><div id="phraseJoinewrskdfdswerhnyikyofd" data-v-app=""><div data-v-f4d4888e="" class="xx-qy-style-dark"></div></div></body></html> 可以看到这里的js逆向极其繁琐, 第一,它上了csp头, <meta http-equiv="Content-Security-Policy" id="c" content="script-src 'sha256-P8konjutLDFcT0reFzasbgQ2OTEocAZB3vWTUbDiSjM=' 'sha256-eDP6HO9Yybh41tLimBrIRGHRqYoykeCv2OYpciXmqcY=' 'unsafe-eval'"> 防止篡改,但是这里可以将其改为unsafe-line, 删去哈希串,当然,因为长度的因素,这里需要将后面加空格 这样就可以绕过有关长度校验 当然,有点随笔的感觉,接着就是几个坑 这里沿用的大量特殊字符混淆视听,其实不是空格,而是Unicode 字符 \xef\xbe\xa0 这样就有很多可以迎刃而解了 const double = Function.call`window.stepᅠ*=ᅠ2`;ᅠ// To the debugger,ᅠthis isᅠinvisible 这一条就可以判断为扯淡了 看这里的算法 j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; 看看改原始step的逻辑, function instrument() { f = arguments[0]; // TODO: figure out how to get a runtime reference to the debugged function in this debug // condition context, so we can inspect it at runtime, in case it changes debug(f, "window.c && function perf(){ const l = `" + f + "`.length; window.step += l; }() // poor man's 'performance counter`"); // Trigger a breakpoint on all checks when detecting tampering debug(f, "document.documentElement.outerHTML.length !== 14347"); } function instrumentPrototype(o) { Object.entries(Object.getOwnPropertyDescriptors(o)) .filter(p => p[1].value instanceof Function) .forEach(p => Object.defineProperty(o, p[0], { get: () => (step++) && p[1].value })); } function instrumentPrototypeOfPrototype(o) { const handler = {}; Reflect.ownKeys(Reflect).forEach(h => handler[h] = (a,b,c) => (step++) && Reflect[h](a, b, c)); Object.setPrototypeOf(o, new Proxy(Object.getPrototypeOf(o), handler)); } [Array, Array.prototype, String.prototype, Math, console, Reflect].map(o => Object.values(Object.getOwnPropertyDescriptors(o)).map(x => x.value || x.get).filter(x => x instanceof Function) ).flat().concat(check, eval).forEach(instrument); instrumentPrototype(Array.prototype); instrumentPrototypeOfPrototype(Array.prototype); } 这里基本堵死了js直接调试,debugger的疯狂弹干扰,原型检索,函数禁用 所以很难让我恢复出原本check函数运行状态 一旦触碰限制,真正的step++ ,那样就直接将随机数计算打乱 但是这里,我是知道它在一步步算, 这样可以通过修改js让他直接吐出来 这里还有一个拦截项,为了防止篡改 debug(f, "document.documentElement.outerHTML.length !== 14347"); 这里可以改为 debug(f, "document.documentElement.outerHTML.length == 99999"); 这样就永为假,不会触发修改step 接下来只要修改吐flag即可 while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; if (flag[0] == pool[j % pool.length] && (window.step < 1000000)) { iᅠ= j; flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length&&!flag.length) window.success = true; } } 可以在中间加一段,因为我并未触发加step的机制,所以默认它给的flag字符都是正确的 while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; iᅠ= j; let split = pool[j % pool.length] answer += split flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length){ console.log(answer) } if (!pool.length&&!flag.length) window.success = true; } 如此如此 1 个帖子 - 1 位参与者 阅读完整话题
bs64了 apikey: dHAtY2ZjNW8wcHhic2V3eGs4cDE0NGl5cjhpeGI0MWYyODkxeTJmZXQzdHBrZDFwN3po 1 个帖子 - 1 位参与者 阅读完整话题