2014-11-20
编译:一个 C 程序的艺术之旅

C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理、编译、汇编、链接这四道工序?让我们从这段简单的 C 程序开始。

为什么要编译

这并不是一个简单的问题。我们知道 Python 代码不需要 “编译”,输入一行代码就可以运行出结果了,对用户很友好有木有!这种交互式的运行环境被称为 REPL(Read-Evaluate-Print-Loop),也就是读取用户输入的语句,执行语句,输出语句的值,再返回到等待输入状态。

Read More

2014-11-09
给开源编译器插入后门

说起 Ken Thompson,我们首先想到的是他发明的 UNIX 操作系统。他因此获得 1984 年的图灵奖。在图灵奖演讲上,Ken Thompson 提出了一个深刻的问题:看到了软件的源码,就意味着没有后门吗?编译器是否可能存在能自我复制的后门?

KenThompson

这篇发表在《ACM 通讯》上的论文只有短短三页,省略了很多细节。原理上有点像输出自身代码的 C 程序,但又比它难很多。我追随先哲的脚步,给一个开源 C 编译器——tcc 插入了能自我复制的后门,这个插入了后门的编译器在编译 Linux 登录程序 sulogin 的源码时,会自动插入一个后门。

Read More

2014-03-31
CSDN 2014 开源技术大会实录

昨天受科大 LUG 之邀参加了 CSDN 主办的 2014 开源技术大会(OSTC),结合会上记的笔记和不靠谱的记忆,与诸位分享,如有错漏之处请回复指出。本文部分图片来自 CSDN 官方的图文直播,演讲者的 slides 我显然没有,据说 CSDN 官方随后几天会发布。

IMG_20140330_081339

早上见到了又高又帅的 Thomas Yao 和 Deepin 的王勇(没拍下来)。

Read More

2013-10-11
7 万条短信的乌龙指

乌龙指离我们很远吗?非也。前一段时间 LUG 服务器出故障,就错误地发出了 7 万条短信,把学校短信平台的余额用完了,直到网络中心老师给我打电话才发现。

祸起服务监控脚本。它从数据库里获取站点信息,定时访问被监控的站点,如果发现问题,就会给网站所有者发短信报警。服务监控脚本连接数据库失败时,也会给我发报警短信。早先是不会尝试重连数据库的,因此只会发一次报警,不过监控服务不能在数据库恢复后自动恢复运行。这个 bug 在 blog 故障的时候被发现,于是改成自动重连了,但发报警短信的逻辑没有修改,因此如果一直连不上数据库,就会不停地发。

为防止短信轰炸,发出的短信本来都要经过我这里的“风控”,限制每24小时发往每个手机号的短信数。风控是查询数据库的短信日志表获取最近 24 小时向这个号码发送短信数的,当数据库挂掉的时候,查到的值是 NULL,在 PHP 中隐式类型转换成了0,因此认为没有超过限制,就发出去了。学校短信网关也没有任何“风控”,导致大量的短信涌入运营商网络。

Read More

2013-10-03
让 OpenVPN 默认不走 VPN

LUG VPN 的一些用户希望仅对某些特定 IP 使用 VPN,而 OpenVPN 默认是全部走 VPN。也许是我的搜索能力太差,竟然没有 Google 到靠谱的答案。没有耐心的读者可直接看我的解决方案:

1
2
3
4
5
6
7
8
9
10
11
$ echo "script-security 2" >>/etc/openvpn/client.conf
$ echo "up /usr/local/bin/remove-ovpn-defroute" >>/etc/openvpn/client.conf

$ cat /usr/local/bin/remove-ovpn-defroute
#!/bin/sh
(
sleep 2 # wait for routing table to be flushed
ip route del 0.0.0.0/1 dev tun0
ip route del 128.0.0.0/1 dev tun0
) &
exit 0
Read More

2013-09-06
一个斜杠引发的血案

注:不了解 mirrors 的朋友,请先看《科大开源软件镜像是怎样炼成的》。

祸起 iSCSI

故事要从2013年6月26日讲起。mirrors 有一个网线直连的磁盘阵列,使用 iscsi 协议,上面有一个XFS文件系统。6月26日下午14时许,stephen 在邮件列表里报告 mirrors 挂了。根据 syslog,6月26日13:58,iscsi 连接超时,导致 sdg 访问失败,大量I/O操作被卡住,导致 nginx 被卡住,mirrors HTTP 无法连接。几分钟后,I/O超时,nginx 恢复正常,但磁盘阵列上的源无法使用了。

Read More

2013-09-05
我在 LUG 这一年

今天光宇说要去年的工作总结,于是就有了这篇文章。LUG 的主要工作分为活动和网络服务两方面。

活动

我们回顾一下这一年来发生的事情(http://lug.ustc.edu.cn/wiki/lug/events

招新

跟其他社团一起,在开学的第二周,在东活和西活摆摊。偷来的经验是:可以做一些展板和易拉宝,增加出镜率。

招新虽然站着挺辛苦,但跟来自各种院系的同学们聊天挺好玩的,发传单也可以品尝一下经常被拒的滋味。八卦一下,LUG 现任会长的妹子就是那时找到的~

Read More

2013-09-01
科大开源软件镜像是怎样炼成的

Update (2014-09-29): 由于 mirrors 配置文件里有一些不适合公开的内容,现在配置文件不再公开,本文中的一些链接变成了死链,非常抱歉。

由于科大开源软件镜像(mirrors.ustc.edu.cn)发生磁盘故障,stephen、tux 和我 (boj) 都不在学校,加上7月 mirrors 出故障之后就一直没恢复彻底,是时候推倒重来了。这次 mirrors 重建要完全由在校的同学们完成,这也是锻炼技术的一个机会。这里,我来简要解释开源软件镜像包括哪些部分,应该如何搭建。由于 sourceforge 还在等着我们同步,希望能在三天内恢复基本服务,一周内重建好包括同步在内的整个系统。

WTF?

所谓开源软件镜像,就是从官方站点同步一些 GNU/Linux 发行版和知名开源软件的软件仓库。用户通过修改配置文件,就近使用软件仓库镜像,以加快下载速度,减轻官方站点的负载。

Read More

2013-08-22
USTC Blog & Freeshell @ MSRA Summer Camp

8月21日下午 16:00~17:30,2013 MSRA Summer Camp 的 Poster 环节在微软亚洲研究院公共展示区举行。参加活动的有参加夏令营的微软小学者和各高校微软俱乐部成员、MSRA Researcher & Intern。

本来我没想展示什么,在活动组委会的要求下,我选择了 Blog 和 Freeshell 作为展示项目。在组委会的建议下,修改成了 “Cloud Services in USTC” 这个看起来很大、很时髦的标题。

IMG_20130821_162607

Read More

2013-07-23
科大网络的出口线路

科大主要有四条出校线路:教育网(CERNET)、电信、移动、联通。

这四个出口各有各的特征,我们一一道来:

教育网

  • 教育网全称“中国教育与科研计算机网”(CERNET),连接了全国高校和科研机构。主节点在北京(总部在清华科技园,Google 旁边),科大是安徽省核心节点。
  • IPv4 带宽 2G
  • IPv6 带宽 2G,比较宽松(六维就是 IPv6,很快的)
  • 教育网内南北互通白天比较拥挤,晚上网络比较通畅。其他运营商的南北互通问题可能更严重。
  • 到国内其他运营商、国外的访问都很慢
  • 网络上的路由路径不一定是地理上最短的,例如科大到北京的流量可能要经过上海。
  • 访问 CERNET 定义的“免费地址”以外的IP,要按流量收费。虽然不直接对我们收费,但尽量为学校省钱吧 :)
  • 大家访问教育网内资源,建议使用 IPv6
Read More