[F] Fix image path
@@ -6,6 +6,7 @@ from datetime import datetime, date
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
import urllib.parse
|
||||
|
||||
|
||||
class Encoder(json.JSONEncoder):
|
||||
@@ -19,40 +20,47 @@ class Encoder(json.JSONEncoder):
|
||||
|
||||
if __name__ == '__main__':
|
||||
posts = []
|
||||
basedir = Path('content/posts')
|
||||
src = 'https://profile-content.hydev.org'
|
||||
|
||||
# Loop through all blog posts
|
||||
for b in os.listdir('content/posts'):
|
||||
if not b.endswith('.md'):
|
||||
continue
|
||||
for file in basedir.glob('*.md'):
|
||||
stem = file.stem
|
||||
yml, md = re.split('---+\n', file.read_text('utf-8').strip())[1:]
|
||||
|
||||
post = {'id': 0, **yaml.safe_load(yml), 'file': str(file)}
|
||||
posts.append(post)
|
||||
post.setdefault('tags', [])
|
||||
|
||||
# Read blog posts
|
||||
file = 'content/posts/' + b
|
||||
with open(file, 'r', encoding='utf-8') as f:
|
||||
yml, md = re.split('---+\n', f.read().strip())[1:]
|
||||
post = {'id': 0, **yaml.safe_load(yml), 'file': file}
|
||||
posts.append(post)
|
||||
post.setdefault('tags', [])
|
||||
# Parse date
|
||||
if 'date' not in post:
|
||||
try:
|
||||
post['date'] = datetime(int(stem[:4]), int(stem[5:7]), int(stem[8:10]))
|
||||
except:
|
||||
post['date'] = datetime.fromtimestamp(os.path.getmtime(file))
|
||||
|
||||
def convert_img_path(s: str):
|
||||
if s.startswith('http'):
|
||||
return s
|
||||
return f'{src}/content/posts/Assets/{urllib.parse.quote(stem)}/{urllib.parse.quote(s)}'
|
||||
|
||||
# Parse date
|
||||
if 'date' not in post:
|
||||
try:
|
||||
post['date'] = datetime(int(b[:4]), int(b[5:7]), int(b[8:10]))
|
||||
except:
|
||||
post['date'] = datetime.fromtimestamp(os.path.getmtime(file))
|
||||
# Convert image path
|
||||
if 'title_image' in post:
|
||||
post['title_image'] = convert_img_path(post['title_image'])
|
||||
|
||||
# Convert image path
|
||||
if 'title_image' in post and '/' not in post['title_image']:
|
||||
post['title_image'] = 'content/images/' + post['title_image']
|
||||
# Generate url-name
|
||||
if 'url_name' not in post:
|
||||
post['url_name'] = stem.replace(' ', '-')
|
||||
|
||||
post['content'] = md.strip()
|
||||
|
||||
# Generate url-name
|
||||
if 'url_name' not in post:
|
||||
post['url_name'] = os.path.splitext(b)[0].replace(' ', '-')
|
||||
|
||||
post['content'] = md.strip()
|
||||
|
||||
# Process iamges
|
||||
post['content'] = re.sub(r'!\[\[\.\/(.*)\|(.*)\]\]', r'<figure><img src="{src}/content/posts/\1" /><caption>\2</caption></figure>', post['content'])
|
||||
post['content'] = re.sub(r'!\[\[\.\/(.*)\]\]', r'<img src="{src}/content/posts/\1" />', post['content'])
|
||||
# Process images
|
||||
for img in re.findall(r'!\[\[(.*)\]\]', md):
|
||||
if '|' in img:
|
||||
img, cap = img.split('|', 1)
|
||||
post['content'] = post['content'].replace(f'![[{img}|{cap}]]', f'<figure><img src="{convert_img_path(img)}" /><figcaption>{cap}</figcaption></figure>')
|
||||
else:
|
||||
post['content'] = post['content'].replace(f'![[{img}]]', f'<img src="{convert_img_path(img)}" />')
|
||||
|
||||
posts.sort(key=lambda x: x['date'], reverse=True)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Clive Wearing 的日记
|
||||
subtitle: 十五秒的记忆、开心又无意义的人生、人的自私愿望
|
||||
title_image: "2021-10-14 Clive Wearing journal.png"
|
||||
title_image: "Clive Wearing journal.png"
|
||||
tags: [心理]
|
||||
category: 想想想
|
||||
---
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 651层
|
||||
title_image: "2021-12-07 earth.jpg"
|
||||
title_image: "earth.jpg"
|
||||
tags: [梦]
|
||||
category: 梦
|
||||
---
|
||||
|
||||
@@ -3,16 +3,13 @@ title: Snowy World
|
||||
subtitle: 一个 telnet 协议的 ASCII 动画
|
||||
---
|
||||
|
||||
<img src="{src}/content/images/2023-03-09/Pasted image 20230309032722.png" />
|
||||
![[Pasted image 20230309032722.png]]
|
||||
|
||||
写了一个 telnet 协议的 ascii 动画!(花了一整天又没什么用,但是好好玩ww
|
||||
|
||||
用指令 `telnet hydev.org` 连接哦。记得用一个好用一点的终端,比如 kitty / iTerm2
|
||||
|
||||
<figure>
|
||||
<img src="{src}/content/images/2023-03-09/Pasted image 20230309040403.png" />
|
||||
<caption>用 cool-retro-term 登录 ptt.cc 论坛的 telnet</caption>
|
||||
</figure>
|
||||
![[Pasted image 20230309040403.png|用 cool-retro-term 登录 ptt.cc 论坛的 telnet]]
|
||||
|
||||
昨天和鱼塔闲聊,从某紫底绿字网页聊到复古终端又聊到 telnet 论坛。这是我第一次见到 telnet 协议的论坛哇,连进 ptt 和水木论坛转了转,完全被五颜六色的字符画和各种小彩蛋吸引住了 qwq 决定我也写一个简单 ascii 动画放进我的小小角落...
|
||||
|
||||
@@ -20,20 +17,14 @@ subtitle: 一个 telnet 协议的 ASCII 动画
|
||||
|
||||
刚开始用 python 两个小时写好了 telnet 监听、雪花、字符画、移动,简简单单地一层一层字符打上去,但是这样会让图层闪来闪去。然后改成了存 framebuffer 2d 矩阵,先把不同图层叠到缓存里再统一渲成一层命令行能懂的控制符,但是 py 矩阵遍历真的好慢好慢,用上 numpy 也依然非常慢,渲染一帧要 42ms。好像这个问题并没有解... 用 numba JIT 把遍历函数编译成二进制也只优化到了 16ms。无奈啊,可能方便的语言就是跑不快,借这个契机开始学 rust 了!
|
||||
|
||||
<figure>
|
||||
<img src="{src}/content/images/2023-03-09/Screenshot from 2023-03-08 03-06-28 1.png" />
|
||||
<caption>Python 渲染日志,一圈需要 45ms</caption>
|
||||
</figure>
|
||||
![[Screenshot from 2023-03-08 03-06-28 1.png|Python 渲染日志,一圈需要 45ms]]
|
||||
|
||||
rust 确实好不方便,因为不能有全局变量,用 struct + impl 强行模拟了 OOP 的对象,把全局全都写在 struct Main 里面 🌚。但是有时候又不能当作对象,遇到了比如可变指针借用的问题,把常量和变量分开存解决了,还有生命周期什么的,总之是好多写完了也没太学懂的概念。昨天折腾到凌晨五点 rua 完了,没想到同一个 2d 数组遍历只是用 rust 重写就只占用 0.12ms 了哇,350 倍啊 350 倍!
|
||||
(╯’ – ‘)╯︵ ┻━┻
|
||||
|
||||
~~就此立 flag,以后新坑绝对不会再碰 python 了~~。明明同样是 O(n * m) 的代码居然会差这么多... 现实中优化算法常量也很重要呢
|
||||
|
||||
<figure>
|
||||
<img src="{src}/content/images/2023-03-09/Screenshot from 2023-03-08 10-26-16.png" />
|
||||
<caption>Rust 可变 &self 指针借用的报错</caption>
|
||||
</figure>
|
||||
![[Screenshot from 2023-03-08 10-26-16.png|Rust 可变 &self 指针借用的报错]]
|
||||
|
||||
接下来想要把写完的命令行程序接到 telnet 协议上,可是 rust 没有做好的 telnet 服务器库,怎么办呢?先是试着用 tokio 手搓一个协议库,发现没办法读未缓存的原始键盘事件,去 SO 问了。之后尝试调用 c 的 libtelnet 库,跑起来到处报 SIGSEGV 呜呜呜。最后还是直接用 py 的代码开子进程做了一个中继,收到客户端的输入转发给 rust,收到 rust 的输出再转发给客户端... 意外地效果还不错。
|
||||
|
||||
|
||||
@@ -8,17 +8,17 @@ tags: [open-keyprec]
|
||||
|
||||
今天在设计琴键布局呢,决定了做五个八度的马林巴琴布局,从 C2 到 C7 一共 61 个琴键。为了不用手动复制 60 遍写了脚本自动生成琴键!FreeCAD 可以用 py 写脚本真是省了不知道多少时间哇(虽然学 API 可能用了更久hhh)。原本是按照 78-194mm 等比例分布琴键长度,但是觉得看起来太规整了,改成用三点的方式找到了一个抛物曲线计算长度,效果好棒!
|
||||
|
||||
![[./Assets/2023-03-15 OKP Day 2/Pasted image 20230315205011.png|生成的 61 个琴键模型,高度是条抛物线]]
|
||||
![[Pasted image 20230315205011.png|生成的 61 个琴键模型,高度是条抛物线]]
|
||||
|
||||
然后算下来打印时间大概要 91.5h,如果 24h 无间断打印的话要 3.8 天... 今天发现 Cura 的一个实验性功能可以让多个模型在同一个平台上顺序打印,很灵车但是好想试试,如果可以的话睡觉的时候也能让打印机工作了(打印机加油!
|
||||
|
||||
真正打印的时候才发现这个打印机有好多问题,果然不应该相信半价全新... 首先是自动调平不工作,而且因为这款 "Smart" 打印机的受众是富家小孩,设计师去掉了需要耐心的手动调平旋钮。研究了一下发现是固件逻辑每次回零都会把调平 Mesh 关掉,也就是说自动调平完全没有用到。解决方案就是在 GCode 开始段回零之后加一句 `M420 S1` 重新启用调平... 创想啊你完全不测试你的代码么 (╯’ – ‘)╯︵ ┻━┻
|
||||
|
||||
![[./Assets/2023-03-15 OKP Day 2/Pasted image 20230316081122.png|自动调平 Mesh 可视化(好歪!)]]
|
||||
![[Pasted image 20230316081122.png|自动调平 Mesh 可视化(好歪!)]]
|
||||
|
||||
然后看到印床底下有一颗孤零零的螺丝 ;-;;; 估计要拆下整个 y 轴才能取出来,好麻烦啊,不过有一点点小风险也没关系?
|
||||
|
||||
![[./Assets/2023-03-15 OKP Day 2/IMG_20230316_080312.jpg|卡在床下面的螺丝]]
|
||||
![[IMG_20230316_080312.jpg|卡在床下面的螺丝]]
|
||||
|
||||
今天下午和聊聊去拼装模型爱好者的店买了喷漆罐,打算喷成 V7530BCF 那样的金属黑色。给 PLA 喷漆也很讲究呢,需要先喷 Primer,喷漆,再喷保护层,还要一个通风柜... 原本想在厕所开上换气喷,但是看到成分里含有机溶剂,只能等天暖在外面喷了呜呜。
|
||||
|
||||
|
||||
@@ -22,11 +22,11 @@ tags: [ctf]
|
||||
|
||||
啊所以难道给我的这套代码登录甚至没有验证密码的吗 (╯’ – ‘)╯︵ ┻━┻
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/2023-11-18 22-02 2.png|欣赏一下屎山代码]]
|
||||
![[2023-11-18 22-02 2.png|欣赏一下屎山代码]]
|
||||
|
||||
看看源代码 lib.php 确实数据库密码验证逻辑写得乱七八糟,数据库直接 string concat,密码甚至没 hash... 好直接让 GPT4 重写了一遍登录和注册这两个函数,然后 PoC 就失效了,拿分拿分 🌚
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/2023-11-18 22-03.png|GPT4 帮我修好了!]]
|
||||
![[2023-11-18 22-03.png|GPT4 帮我修好了!]]
|
||||
|
||||
(不过我至今没弄懂 PhP 要怎样把 log 打到能看到的地方... 打比赛的时候试了几个不同的方法都看不到 log 就算了算了直接把 curl hydev.org/say 写进去了,发到 /say 的东西会转发到我的 Telegram 上hhhh
|
||||
|
||||
@@ -34,7 +34,7 @@ tags: [ctf]
|
||||
|
||||
第一个好简单。第二个攻击的请求乍一看好像没什么问题,但是仔细看看就会发现 PoC 机注册的帐号的名字和请求提交的 JWT Token 名字不一样然后还莫名过签证验证了... 为什么呢?
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/image_2023-11-18_21-58-35 1.png|第二个攻击的 Log]]
|
||||
![[image_2023-11-18_21-58-35 1.png|第二个攻击的 Log]]
|
||||
|
||||
看一眼代码确实,签名居然不是密码学签名,而是直接把请求 JWT 里面的东西 hash 了一遍,验证签名和 hash 相等???🫠 这种客户端能生成的东西还算签名吗?算了交给 GPT4 去改,果然改完就过了。
|
||||
|
||||
@@ -48,23 +48,23 @@ tags: [ctf]
|
||||
|
||||
磨刀不误砍柴工,先把本地 Go 环境和依赖装上,把 SSL cert 挪到该放的地方,带缓存的编译重跑就只需要不到一秒了。
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/2023-11-18 22-52.png]]
|
||||
![[2023-11-18 22-52.png]]
|
||||
|
||||
### Attack 1
|
||||
|
||||
第一道题非常非常简单,跑起来之后看 HTTP 访问日志马上就看到了一条野生 SQL 语句 👀 原来要修的是 SQL 注入。看看代码,main 里面定义了这个 `/shop/items/:item` 节点的函数是 DescribeItem(),把整个函数拷给 GPT4 重写拿分()
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/2023-11-18 22-56.png|GPT4 不知道今天帮了我多少忙]]
|
||||
![[2023-11-18 22-56.png|GPT4 不知道今天帮了我多少忙]]
|
||||
|
||||
### Attack 2
|
||||
|
||||
第二道题我觉得是这五道题里面最难的,因为攻击方法并不明显。整个日志看起来都非常正常,我为了让日志看起来更整洁还隐藏了签名验证的部分,日志里实现的操作都是用户正常使用会用到的,管理员创建了几个商品,删了两个商品,用户读了一次商品列表,然后买了一件,感觉没有哪里不对。
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/image_2023-11-18_23-47-54.png|非常正常的日志]]
|
||||
![[image_2023-11-18_23-47-54.png|非常正常的日志]]
|
||||
|
||||
看了超级超级久还没发现问题,但是把签名打出来发现了不同请求的签名长度不一样,所以猜猜可能是签名验证的问题就去检查了一下签名验证的代码,然后发现了这堆鬼东西:
|
||||
|
||||
![[./Assets/2023-11-18 CyberSci Canada Writeup/2023-11-18 23-01.png|他们自己实现了一个 ASN 验证,后面是五百行的我都看不懂的纯正密码学]]
|
||||
![[2023-11-18 23-01.png|他们自己实现了一个 ASN 验证,后面是五百行的我都看不懂的纯正密码学]]
|
||||
|
||||
不懂就不要随便自己实现加密算法啊啊啊 (╯’ – ‘)╯︵ ┻━┻
|
||||
|
||||
|
||||
@@ -21,21 +21,21 @@ sudo mount /dev/nbd0 /mnt
|
||||
|
||||
下面分别是两层 VHD 的文件头和 file 信息,`conectix` 开头的是第二层,`eb5290 NTFS` 开头的是第一层(以下用旧版中二节奏举例):
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 10-04.png]]
|
||||
![[2023-11-30 10-04.png]]
|
||||
|
||||
qemu-nbd 加载了第一层之后连 fdisk 都是懵的,即使是这样乱来也能挂载上也真是好神奇:
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 10-08.png]]
|
||||
![[2023-11-30 10-08.png]]
|
||||
|
||||
## 0x2 Crackproof 脱壳
|
||||
|
||||
解开 .app 包之后脱壳反而是最难的步骤,因为没有找到任何针对 SEGA 街机的脱壳教程(所以我才在写这篇教程!)解压好文件之后发现直接运行会闪退,为什么呢?用文件识别工具 [DIE (detect it easy)](https://github.com/horsicq/Detect-It-Easy) 检测一下发现主程序 Sinmai.exe 被一个叫 HyperTech Crackproof 的工具加密过 (aka. “Htpac”)。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 10-15.png]]
|
||||
![[2023-11-30 10-15.png]]
|
||||
|
||||
啊但是 Sinmai.exe 明明就只是一个 Unity 启动器,Unity 的话所有游戏的启动器都是一样的,让每个游戏不同的是 {Game}\_Data 里面的 dll 文件,所以我直接去下了一个[开源 GTA 圣安地列斯](https://github.com/GTA-ASM/SanAndreasUnity)然后把启动器拷出来改名成 Sinmai.exe 就可以了!
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 12-23.png]]
|
||||
![[2023-11-30 12-23.png]]
|
||||
|
||||
...然后还是没法启动,怎么回事呢?用 `diec` 扫描一下目录里面的所有 exe 和 dll 发现还有四个文件是加密过的:
|
||||
|
||||
@@ -46,31 +46,31 @@ qemu-nbd 加载了第一层之后连 fdisk 都是懵的,即使是这样乱来
|
||||
|
||||
查了一下,首先我看到 SEGA 工具库里面有一个叫 [DecryptCrackproof](https://gitdab.com/SEGA/sega/src/branch/master/tools/Crackproof/DecryptCrackproofExe64) 的工具,感觉这个尝试起来是最简单的,所以就先用它试了一下。这个工具确实自动解出来了 amdaemon.exe,但是剩下三个 DLL 都失败了,报错说 CRC32 算法的长度 out of range of valid values。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 10-31.png]]
|
||||
![[2023-11-30 10-31.png]]
|
||||
|
||||
看着这个报错,第一眼觉得应该是这个算法实现的问题,毕竟从 stack trace 可以看出传给 CalcChecksum 的参数是 UInt32,而 CRC32 函数接收的参数是 Int32... 会不会是长度超了 Int32 的最高值呢?所以就用 DotPeek 反编译、导出项目重新编译再 Debug 饶了一大圈,然后发现并不是长度超过 Int32 最高值,而是超过了整个文件的长度... 而请求长度又是一串非常不标准的计算算出来的,看来应该是 HyperTech 他们换了加密算法,并不是改一两行就能修好的。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 12-38.png]]
|
||||
![[2023-11-30 12-38.png]]
|
||||
|
||||
接下来有点没有头绪,到处查查也没有查到有用信息,有一个 [iatrepair](https://github.com/rakisaionji/iatrepair) 仓库的脱壳思路是开一个 QEMU 有 2GB 内存的 VM 里面跑游戏,等游戏加载完之后把整个系统的内存 dump 出来再解包分析... 感觉这个方法好灵车,而且这个加密也会检测系统是不是 VM。
|
||||
|
||||
接下来去群里问了问,群友给我了一份街机系统上会有的 odd.sys 驱动,用 OSRLoader 加载进系统就可以启动游戏了,虽然是黑屏而且不能正常启动 amdaemon。原本以为解密代码在驱动里面,所以先用 IDA Pro 打开驱动看看能不能提取出来,但是发现似乎只有一些 hashing 的 PID 验证和字符串处理,返回一个处理过的字符串,这样看来这个驱动应该是让用户进程上传识别信息来生成真正解密密钥的工具。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 12-36.png]]
|
||||
![[2023-11-30 12-36.png]]
|
||||
|
||||
但是感觉要反汇编找到真正解密的代码再重新实现出来有点太复杂了... 还是试试直接从内存里面找吧。
|
||||
|
||||
下载一个 CheatEngine 用来查看内存,然后启动游戏。刚开始发现 CheatEngine 的调试器挂到 Sinmai 进程上会报错,上网查了一下说可以试试在设置的调试器选项里开 DBVM 内核驱动模式,再把 Extras 里面的用内核模式浏览内存选上,然后果然就可以挂了!
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 12-45.png]]
|
||||
![[2023-11-30 12-45.png]]
|
||||
|
||||
接下来打开内存视图,先看了一遍 Memory Regions 里面标注的 DLL 名,但是似乎没有我想要找的 DLL 的样子。那怎么办呢?看看有没有只属于这个 DLL 的可识别信息吧,用 hexed.it 打开上一代别人解包好的 Assembly-CSharp.dll 发现文件末尾有一串元信息,写着 "InternalName Assembly-CSharp.dll",每个字符中间间隔着一个 NULL \\0 字符。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 12-59.png]]
|
||||
![[2023-11-30 12-59.png]]
|
||||
|
||||
所以我在 CE 内存视图里面搜这段文字然后就找到了!正好只有一个匹配结果。然后记录一下最左边的地址,打开内存区域视图找到这个地址所属的区域,右键把整个区域存下来,然后用 hexed.it 打开把 CE 的文件头去掉(截到 DLL 文件头那里)再把文件尾补到整 32 位,保存改名成 DLL 就可以了!
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 13-02.png]]
|
||||
![[2023-11-30 13-02.png]]
|
||||
|
||||
之后就只差 Cake.dll 和 amdaemon_api.dll 了,可惜这两个我用同样的方法没有解出来。amdaemon_api 在游戏里并没有加载,而 Cake 是一个包含了依赖的 dll,被拆成了很多不同的内存区域导致让它完整结合回去比较麻烦,但是这两个文件在不同版本中几乎没有改动,所以就直接拿上一个版本别人脱好壳的用了(一般会放在 segatools 文件夹里一起发出来)
|
||||
|
||||
@@ -78,7 +78,7 @@ qemu-nbd 加载了第一层之后连 fdisk 都是懵的,即使是这样乱来
|
||||
|
||||
可惜脱完 dll 壳并不是直接就能玩,还要去掉一些街机验证。因为 maimai 是一个 Unity 游戏,是用 C# 写的,而众所周知 .NET 运行时的结构和 Java 差不多都是反编译出来几乎直接是源码的,所以魔改思路就是把 Assembly-CSharp 反编译成源码,改好所有的代码报错,改掉验证然后再编译回去啦。
|
||||
|
||||
![[./Assets/2023-11-30 Maimai 逆向/2023-11-30 13-53.png]]
|
||||
![[2023-11-30 13-53.png]]
|
||||
|
||||
...结果还在修报错的时候发现朋友已经魔改完了,所以就先用别人的啦,具体需要做哪些魔改等下次拿到最新最热数据再研究好了 qwq
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 示波器破解移动光光猫
|
||||
title_image: "./Assets/2024-07-30 光光猫/IMG_20240730_100300.avif"
|
||||
title_image: "IMG_20240730_100300.avif"
|
||||
subtitle: 跑不掉了喵~
|
||||
tags: [ctf]
|
||||
---
|
||||
@@ -13,11 +13,11 @@ tags: [ctf]
|
||||
|
||||
去网络论坛上看了其他人的破解方法,一月份的时候似乎还可以通过 192.168.1.1/hidden_version_switch.html 之类的网页后门直接开启 telnet,但是试了很多全都被堵住了。看来软件是没办法了,拆机看看
|
||||
|
||||
![[./Assets/2024-07-30 光光猫/IMG_20240728_190519.avif|拆机后的完整布局]]
|
||||
![[IMG_20240728_190519.avif|拆机后的完整布局]]
|
||||
|
||||
光光猫型号是 SK-D747,拆机之后看到了这个 PCB 的完整布局,中间是铠侠的 128MB E2PROM,旁边有八个测试孔,左侧是光纤接入口(系统里是一个 PCIe 设备...??)右边应该是 CPU 和 DDR3 DRAM,上边是两个 LDO 分别转 3.3V 和 5V,右上方还有一些空的焊盘应该是高配版多出来的网口。
|
||||
|
||||
![[./Assets/2024-07-30 光光猫/IMG_20240730_100300.avif|发现了 E2PROM 芯片旁边的八个测试引脚]]
|
||||
![[IMG_20240730_100300.avif|发现了 E2PROM 芯片旁边的八个测试引脚]]
|
||||
|
||||
在 E2PROM 旁边的这八个测试孔,四个焊了排针,四个没焊。通常光猫上都会留用来测试的 UART 串口,但是串口只能够用到 TX RX GND 三条线,TX 用来向对方发送,RX 用来接收,GND 作为判断传输电压的参照物。排针上显然并没有文档,没有标记每个引脚代表什么,还可能是 RS232,I2C,或者 SPI 也说不定,那要怎样判断每个测试孔代表着什么呢?
|
||||
|
||||
@@ -25,7 +25,7 @@ tags: [ctf]
|
||||
|
||||
接下来还剩五个不确定的孔,通电测一下电压好了。孔 1 是 5V,孔 5 是 3V,6 是 0.074V。只看电压其实不是很有头绪呢,把照片发到嵌入式群里,群友猜 5 6 分别是 TX 和 RX,但是插上串口工具发现并没有输出,反过来也没有。
|
||||
|
||||
![[./Assets/2024-07-30 光光猫/IMG_20240730_095534.avif|电表针好长感觉不注意就会把什么戳短路]]
|
||||
![[IMG_20240730_095534.avif|电表针好长感觉不注意就会把什么戳短路]]
|
||||
|
||||
突然想到,既然之前买了示波器就试试用示波器看看这些孔的波形好了!虽然之前没有用过但是也不会太难理解吧?打开包装有一个主机和两根测笔,像电表一样,那一定是在测量这两根针之间的波形吧?一根戳上 GND 另一根戳上测试点,点一下自动... 不对啊,看上去无论点哪里都是一个正弦 ~ 波?这看起来也不像是时钟啊?
|
||||
|
||||
@@ -35,11 +35,11 @@ tags: [ctf]
|
||||
|
||||
学会使用示波器之后把示波器夹子接地,针点到每个引脚,调到 1V/格 的显示比例,发现脚 2 是稳定 3V,脚 3 有零到 3V 的 TTL 高低电平切换,由此推断 2 3 才是 TX 和 RX。这次接上 UART 终于看到日志输出了!
|
||||
|
||||
![[./Assets/2024-07-30 光光猫/2024-08-01 12-45.png|用示波器看到了上下切换的数据电平,高低电压分别代表 1 和 0]]
|
||||
![[2024-08-01 12-45.png|用示波器看到了上下切换的数据电平,高低电压分别代表 1 和 0]]
|
||||
|
||||
接上之后就交给 menci 了。重启路由器,终端打了很多日志,似乎是 uboot 在启动被运营商魔改的 OpenWRT。等开机结束之后导出日志,在里面搜索 "pwd" 找到了 root 密码 🌚 真安全。登录进 root 之后去读文件 /userconfig/cfg/db_user_cfg.xml 就拿到了超管密码,然后我累累睡睡,menci 念一串魔法配好了桥接和公网 v6 直通,好厉害
|
||||
|
||||
![[./Assets/2024-07-30 光光猫/IMG_20240730_144448.avif|躺在床上听着魔法少女 menci 调网咒语 ASMR 睡着了]]
|
||||
![[IMG_20240730_144448.avif|躺在床上听着魔法少女 menci 调网咒语 ASMR 睡着了]]
|
||||
|
||||
配网相关的事情可以右转去读读 [menci 的博客](https://blog.men.ci/),虽然我也想学学配 ipv6 但是这两天通宵爆肝实在没有力气啦,等加拿大 Bell 有了 ipv6 再学学好了。
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 392 KiB After Width: | Height: | Size: 392 KiB |
|
Before Width: | Height: | Size: 702 KiB After Width: | Height: | Size: 702 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 579 KiB After Width: | Height: | Size: 579 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |