老师要求我们搞 CI/CD,CI 自然是很快就搞好了,不过 CD 还得配一下。今天研究了一下它的 Deployer 架构,发现了若干易用性问题: 缺乏文档 只有样例配置没有讲解 已有的文档 语焉不详 官方对此回复:功能太多,还没忙过来写文档 于是只好经常戳助教然后尝试理解这个东西。。然后遇到了很多的 BUG: 容器没有重启功能。。。 容器死了还是活着看一个图的颜色。。。毫无说明 容器虽然有 Console,但是输入过长后直接回到行首没有换行。。。 容器对外的域名里有下划线。。。Django 上来就一句 Invalid HTTP_HOST header: 'xxxx_xxx.app.secoder.net'. The domain name provided is not valid according to RFC 1034/1035. Express 直接就 Invalid Host header 放弃治疗。。。 助教对上一条的回复是,等我忙完 DDL 有空再做吧。。。也就是说现在要做只能自己再开一个 Nginx 容器然后自己在 proxy_set_header 上做手脚。。。
在荔枝糖(Lichee Tang)上初次体验 FPGA
今天从张宇翔学长那拿到了 荔枝糖(Lichee Tang) 的 FPGA 板子,于是立即开始把前段时间学到的 Verilog 应用上来。不过想到现在我手上没有多少外设,然后又必须远程到 Windows 电脑上去操作,于是先实现了一下 UART 通信。 在网上找到了 ben-marshall/uart 一个简易的实现,很快做到了一直在串口上打印 A 字符。接着我开始尝试实现一个简单的串口回显。一开始,我直接把 UART 读到的数据直接输出,果然可以了,但是一旦传输速率跟不上了,就会丢失数据。于是我添加了 FIFO IP 核,然后把读入的数据存入 FIFO,又从 FIFO 中读取数据写入到 UART 中去。不过发现了一个小 BUG:每次打印的是倒数第二次输入的字符,即丢失了第一个字符。在张宇翔学长的帮助下找到了问题:当 FIFO 的读使能信号为高时,其数据在下一个时钟周期才来,于是解决方案就是等到数据来的时候再向 UART 中写数据: always @ (posedge clk_in) begin uart_tx_en <= uart_fifo_re; end 这样就解决了这个问题。完整代码在 jiegec/learn_licheetang 中。
使用 veth 实现 IPv6-only 的 Brouter 功能
最近从 @shankerwangmiao 学到了一个方法:通过 veth 把两个 bridge 的 IPv6 桥接起来。方法如下: $ ip link add veth-v6-in type veth peer name veth-v6-out $ brctl addif br-in veth-v6-in $ brctl addif br-out veth-v6-out $ ebtables -t filter -A FORWARD -p ! IPv6 -o veth-v6-in -j DROP $ ebtables -t filter -A FORWARD -p ! IPv6 -o veth-v6-out -j DROP 这样就可以看到 veth 上仅有 IPv6 的流量了。
在 Android 上打开 LTE 的 IPv6
听闻北京移动给 LTE 配置了 SLAAC,但现在需要手动打开,方法如下: Settings -> Network & Internet -> Mobile Network -> Advanced -> Access Point Names -> 中国移动 GPRS (China Mobile) -> 把 APN procotol 和 APN roaming protocol 两项都改成 IPv4/IPv6 然后在 test-ipv6.com 上可以看到确实分配了 IPv6 地址,不过目前评分只有 1/10。也就是说可用性还不佳。 而在 iOS 上,通过 HE 的 Network Tools 能看到,确实拿到了 IPv6 的地址,但是出不去,怀疑是运营商没有下发相关配置,所以还不能使用,只能继续等。 2018-11-06 更新:现在 iOS 用户也有 LTE 的 v6 了。评分是 9/10。目前可用性已经可以了,就是国内互联还不大好。
THUCTF 2018 和 Teaser Dragon CTF 2018 小记
终于可以公开 writeup 了,大家也可以去看 twd2 写的 writeup 。这次是我第一次打 CTF,发现题目还挺有意思的,虽然也有一些题目做不出来,有拿钱还是美滋滋。 这次也认识了好些会打 CTF 的人吧,如 0x00, user1, igoodvegetable 等队伍的同学。一开始被蛤力橙叫来打比赛,我觉得心里挺没底的,然后花了很多时间做题目,一点一点还是做出了不少题目来。最精彩的还是结束以后,当知晓没做出来的题目的做法时候,会不自觉感叹题目的巧妙。也学到了一些梗: #define 1000000007 twd2 接着就参与了一下 Teaser Dragon CTF 2018,是个在线赛,许多人一起做题,只有 24 小时。看了下题目,除了签到题,其它题都比 THUCTF 2018 难多了,我只能围观他们做题。最后看到别人写的 writeup,真是太巧妙了,一环接一环,真的想不到。不过也有很麻烦的题目,特别是有的逆向的题目,太考验人的耐心了。 接下来就等待官方的 writeup 和别人的 writeup,学习一下别人的做法吧。
绕过 GPGMail 的激活检测
前段时间 GPGMail 宣布不再免费,在三十天的试用期后就不给用了。唉,可能是官方实在没钱维护了,也可能是官方想赚钱了。不过,既然 GPGMail 采用的是自由的许可证,意味着我们可以自己对代码进行更改。和许可证验证相关的代码如下: - (BOOL)hasActiveContract { NSDictionary *contractInformation = [self contractInformation]; return [contractInformation[@"Active"] boolValue]; } 我们只要改成 return TRUE ,在自己的电脑上手动编译、并复制到 /Library/Application Support/GPGTools/GPGMail 下即可。 另:还有一个直接对二进制打 patch 的方法(仍然符合许可证),利用了最近打 CTF 学到的一些知识。找到以上这个函数,然后把返回值修改成非零即可。这里就不提供方法了。最后的更改: $ radiff2 -D --- 0x0000282f 410fbec7 - movsx eax, r15b +++ 0x0000282f 4c89e090 + mov rax, r12 + nop 当然了,还需要额外 codesign --remove-signature 一下。 谨慎对非自由软件采用这个方法。可能有法律风险。
在 macOS 的 VirtualBox 上从 USB 启动
做了一个 Windows 10 安装 U 盘,想测试一下能不能启动,于是想用 VirtualBox 起一个虚拟机。但是发现,一般情况下要从 ISO 或者把 U 盘克隆成一个 vdi/vmdk etc 再启动。不过找到了 Cem Arslan 的 VirtualBox - Booting From USB (MAC) 实验了一下,确实可以用,以 /dev/disk2 为例方法如下: $ diskutil unmountDisk /dev/disk2 $ sudo chown $(whoami) /dev/disk2 $ VBoxManage internalcommands createrawvmdk -filename PATH_TO_VMDK -rawdisk /dev/disk2 $ # Now boot from VirtualBox 对于其它平台,可以参考 Tu Nguyen 的 How to boot from USB in VirtualBox 。 研究了一下生成的 vmdk 文件,大概是这样的: # Disk DescriptorFile version=1 CID=12345678 parentCID=ffffffff createType="fullDevice" # Extent description RW 12345678 FLAT "/dev/disk2" 0 # The disk Data Base #DDB ddb.
在 Ubuntu 上跨版本迁移 MongoDB
由于 MongoDB 只支持当前版本和上一个版本的数据库格式,然后刚刚滚系统升级的时候升级到了 3.6.x,而数据库格式仍然是 3.2.x 的,于是需要先安装回 3.4.x 版本的 MongoDB,输入命令把数据库升级到 3.4.x 版本后,再用 3.6.x 的数据库进行升级。 以 从 Ubuntu 14.04 LTS 升级到 Ubuntu 18.04.1 LTS 为例,方法如下: $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $ tar xvf mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $ cd mongodb-linux-x86_64-ubuntu1604-3.4.17/bin/ $ sudo ./mongod --config /etc/mongodb.conf & $ mongo > db.adminCommand( { setFeatureCompatibilityVersion: '3.4' } ) { "ok" : 1 } $ fg ^C $ sudo chown -R mongodb:mongodb /var/lib/mongodb $ sudo systemctl start mongodb $ mongo > db.
通过 SSH 隧道连接 ADB 和 Android 设备
由于本机算力不足,想要在远程编译 LineageOS ,其中有一步需要连接到已有的设备,于是突发奇想: adb 可以通过 网络连接 ssh 可以进行端口转发,这里是把 remote 的端口转发到 Android 设备上的端口。 方法如下: $ adb shell ip -f inet addr show wlan0 $ # remember the ip address here $ adb tcpip PORT1 $ ssh -R PORT2:ANDROID_IP:PORT1 REMOTE (remote)$ adb connect localhost:PORT2 # trust this device on Android 参考文档: How can I connect to Android with ADB over TCP? SSH PORT FORWARDING EXAMPLE
在 LEDE(OpenWrt)上启用 wpad
WPAD(Web Proxy Auto-Discovery Protocol)是一个可以利用 dhcp 分发 pac 配置的协议。方法如下: $ # ssh to router first $ vim /etc/dnsmasq.conf dhcp-option=252,"http://router_ip/wpad.dat" $ vim /www/wpad.dat # put pac here $ service dnsmasq restart $ # ensure proxy is available to lan $ # enable wpad on devices 参考文档: Web Proxy Auto-Discovery Protocol Automatic Proxy Configuration with WPAD Deploying WPAD Example PAC File