从小到大,之前都没去过北京。一是对故宫长城并没有什么兴趣(毕竟只对吃感兴趣括弧笑),二是总觉得北京那算是大都市,自己还是太Low了。机缘巧合,得到了张WOT 2016的票,再三犹豫之后还是毅然决定踏上旅程。唉,还是准备不重复,当初还以为北京的火车票应该不是那么难买,结果就先买了去的车票,几天以后才买回程的票,结果因为买迟了,足足少在北京玩2个小时。
Continue Reading
首先,使用tar xvf命令解压文件后,会有3个可执行的二进制文件bufbomb,hex2raw,makecookie。参考write-up。
Level 0Bufbomb程序运行会读一个字符串,使用一下函数getbuf:
123456789/* Buffer size for getbuf */#define NORMAL_BUFFER_SIZE 32 int getbuf(){ char buf[NORMAL_BUFFER_SIZE]; Gets(buf); return 1;}
Gets函数和标准库的gets功能比较相似,是读取字符串。因为Gets没有办法判断是否buf足够大,所以要用一个函数去判断长度是否小于32。将字符串传入getbuf函数中,若字符串小于32,则返回1.
12345678910080491f4 <getbuf>: 80491f4: 55 push %ebp 80491f5: 89 e5 mov %esp,%ebp 80491f7: 83 ec 38 sub $0x38,%esp 80491fa: 8d 45 d8 lea -0x28(%ebp),%eax 80491fd: 89 04 24 mov %eax,(%esp) 8049200: e8 f5 fa ff ff call 8048cfa <Gets> 8049205: b8 01 00 00 00 mov $0x1,%eax 804920a: c9 leave 804920b: c3 ret
getbuf是由函数test调用:
123456789101112131415161718void test() { int val; /* Put canary on stack to detect possiblecorruption */ volatile int local = uniqueval(); val = getbuf(); /* Check for corruption stack */ if (local != uniqueval()) { printf("Sabotaged!: the stack has beencorrupted\n"); } else if (val == cookie) { printf("Boom!: getbuf returned0x%x\n", val); validate(3); } else { printf("Dud: getbuf returned0x%x\n", val); } }
其中,Smoke源码:
12345void smoke(){ puts("Smoke!: You calledsmoke()"); validate(0); exit(0); }
level 0 的任务是让getbuf在执行后返回时,执行smoke函数,而不是返回test函数中。
Continue Reading
最近被老师带着搞科研,研究CSI(channel state information)。
环境安装需要用到CSI tool,这是一个运行在Ubuntu上的利用Intel Wi-Fi Wireless Link 5300 802.11n来做分析的程序。这里可以使用作者网站中方法来安装,也可以下载清华的版本。清华的版本附带了安装说明书,参考说明书上的方法,安装即可。
需要注意的是,发射源路由器需要选择单天线支持802.11n的路由器,我使用的是TP-LINK TL-WR742N。
获取数据cd进入csitools文件夹,进入linux-80211n-csitool-supplementary/netlink,运行
1sudo ./log_to_file tmp.dat
打开另一个终端,运行
1ping 192.168.1.1 -i 0.2
netlink文件夹中的tmp.dat就是采集的原始数据。
读取数据使用Matlab读取数据,进入linux-80211n-csitool-supplementary/matlab文件夹,使用read_bf_file函数可以读取数据。
一个例子数据包里包含
123456789101112timestamp_low: 4 (In the sample trace, timestamp_low is invalid and always 4.) bfee_count: 72 Nrx: 3 Ntx: 1 rssi_a: 33 rssi_b: 37 rssi_c: 41 noise: -127 agc: 38 perm: [3 2 1] rate: 256 csi: [1x3x30 double]
其中:
timestamp_low 是时间戳
bfee_count 数据包数量
Nrx,Ntx 分别表示接收端和发送端的天线数量
rssi_a, rssi_b, rssi_c 每个天线的RSSI数据,单位dB,
agc Automatic Gain Control
perm NIC重排列后的顺序结果,代表RF链路的顺序
rate 发送包的rate
csi CSI原始数据,是个Ntx×Nrx×30复数矩阵
主要提取出CSI数据和timestamp_low。
Continue Reading
Lab2 的 Bomb是个非常有意思的实验,比起之前耗脑的Lab1,这个Lab主要是学习反汇编。
这里我的环境是OS X EI Capitan,Lab2是[Updated 1/12/16].
Phase1在Mac上是默认没有GDB的,可以使用LLDB来代替。
进入lldb
1lldb bomb
使用disassemble进行反汇编,参考bomb.c文件,可以知道主要的几个函数名。
首先是Phase_1
1(lldb) disas -n phase_1
得到以下汇编代码
123456789bomb`phase_1:bomb[0x400ee0] <+0>: subq $0x8, %rspbomb[0x400ee4] <+4>: movl $0x402400, %esibomb[0x400ee9] <+9>: callq 0x401338 ; strings_not_equalbomb[0x400eee] <+14>: testl %eax, %eaxbomb[0x400ef0] <+16>: je 0x400ef7 ; <+23>bomb[0x400ef2] <+18>: callq 0x40143a ; explode_bombbomb[0x400ef7] <+23>: addq $0x8, %rspbomb[0x400efb] <+27>: retq
这段代码还是挺好理解的,保存Stack pointer,将$0x402400传给%esi,调用位于0x401338的strings_not_equal函数,比较%eax是否为0,不为零则调用explode_bomb函数,为零则返回。
所以关键要找出字符串是什么。根据上述的汇编代码,可以发现字符串被保存在0x402400这个内存里,所以使用x/s来查看。
1(lldb) x/s 0x402400
得到
10x00402400: "Border relations with Canada have never been better."
所以第一关的答案是Strings_Not_Equal
Continue Reading
前言不得不说,Flask是个不错的框架,它很简洁,然而却不失强大。在我阅读 << Flask Web Development >> 这本书的过程中,我觉得最好是这本书的配套源码和issues。在这些帮助下,一步步从完全不了解Flask到稍微知道Flask的工作原理。这过程中有好多次因为一些小细节的错误debug个很久。在此,我记录了一些我遇到的问题,方便大家看看。
Continue Reading
之前申请到了腾讯云服务器,所以在上面折腾了一下 Nginx。
准备工作系统配置123456操作系统 Ubuntu Server 14.04.1 LTS 64位CPU 1核内存 1GB系统盘 8GB(本地盘)数据盘 0GB公网带宽 1Mbps
Continue Reading
之前参加数学建模比赛都是用的 MatLab,然而电脑每次运行 MatLab 都烫的要命,所以决定用自己比较熟悉的 python 来进行科学计算。
Continue Reading
CSAPP(Computer Systems: A Programmer’s Perspective ),中文书名为深入理解计算机系统。这本书的好不需多言。为了锻炼英文阅读能力,我特地买的是英文原版。第一章比较简短,简单的从一段Hello World C程序,慢慢深入计算机底层的运行机制。可以说这一章就是本书的框架。以下是从第二章开始,记录了我遇到的困惑,一些简单的就不再介绍,书上已经写的很详细。
Continue Reading