汇编 CSAPP Attack Lab

最近做 attack lab 感到虽然很头大但是很好玩. 主要分为两个 target: code injection 和 return hack 两个实验的原理都是栈向上溢出之后抹掉了一些 return address, 从而可以改写, 做任何你想做的事. ctarget 比较简单粗暴, 可以直接跳到用户上传的字符串里面, 把用户数据直接当代码执行. 第一个子任务 可以直接跳转. 第二个子任务 需要把 cookie 找出来并写进 %rdi. 我最开始以为cookie是随机的, 于是去gdb里把 cookie 的内存地址给弄出来强行读了. 后来才发现可以直接 hardcode. 第三个子任务 同上, 没有发现这个 trick, 于是就从内存里读之后, 调用它提供的 sprintf 函数. 这个函数有很多的陷阱, 比如一定要把 %rax 设成 0, 不然会跳错. 然后打印的地址也得自己在栈里找. 更坑的是栈空间会被 sprintf 函数给抹掉, 所以必需得先把 %rsp 放低到很远的位置去, 不然就算打对了字符串, 注入的代码段也没有了, 还是会 segmentation fault. 好了现在问题又来了, 注入的栈只有 56 个字节. 如何把上面一长串代码塞进去. 其实有个简单的方法是继续向上溢出, 中间加一条 jmp. 但是懒惰的我强行使用各种办法把代码给压进去了. 比如 subl 比 subq 少一个字节, 于是可以只减 rsp 的低32位 esp....

August 30, 2018 · 1 min · laekov

DyNet 论文笔记

DYNET 1701.03980 ABS cpp backend lw graph representation Problems easier debugging / maintaining large proj. express naturally Static vs Dynamic static pre-written model transfered to computation graph graph can be well optimized cannot deal with variable input size. NLP RNN cannot deal with variable input structure. Tree NN, Graph NN hard for complex flow-contronl logic (interface design) nontrivial interface. debug difficulty during execution dynamic do computation on the fly can be expensiveo flow control and variable sized inputs are in host language (python?...

July 9, 2018 · 2 min · laekov

CaPiano 基于 FPGA 和摄像头的现实增强钢琴

Queue 了一篇 CaPiano. 上午展示完. 人智课生产力低下. 把它 Dequeue 了罢. 这个项目的最初设想是造一个识别指尖的算法, 然后用它来弹钢琴并发出声音. 还有一个完全没有开动的二期工程是把它变成一个音游 / 录音机. 蓝图是美好的, 实现是丑陋的. 摄像头 过去一个半月的主要工作就是和这个 OV7670 (AL422B) 的摄像头做斗争. AL422B 是一个 DRAM 的 FIFO 队列, 通过巧妙地接 7670 和 422 的管脚可以实现把 422 作为 7670 的一个输出缓冲. 422 本来是用于简化这件事的. 在国外大学的 PA 文档里也是这么说的. 然而 422 这个东西最大的毛病就是没有 dataready 这个信号, 所以根本没法成功探索出什么时候可以读. 挣扎了很久之后我选择买了一个不带 422 的 7670. 7670 通过 SCCB 协议来进行配置, 有一些寄存器. 主要有用的是控制彩色的 12 和控制输出格式的 40. 本来想要 RGB565 加 QVGA 爽歪歪. 然而我的配置模块跑出来结果完全不对, 最后发现根本没设起. 降频到手工时钟都没有办法正常工作. 于是只好放弃, 使用默认的 YUV + VGA....

June 12, 2018 · 1 min · laekov

人智的另一个作业. 教你 30 分钟写完 MNIST 作业

教你 30 分钟写完 MNIST 作业 laekov 2018.05.20 Overview 题目要求 随便用什么框架去 Kaggle 上做手写数字识别的数据集. 你可以选择自己写一个框架. (谁爱写谁写) THU PACMAN 实验室最近在筹划写一个框架, 有兴趣的同学可以联系我. 最好多实现几个模型, 调调参, 写报告需要. 需要做的事 找一个框架 抄一遍 Tutorial 写一个处理数据 (csv格式) 的模块 写一个模型 写训练/验证/测试的东西 CNTK 框架 微软的框架. Python 文档见https://cntk.ai/pythondocs/index.html 安装. 见官网. pip, conda, install_cntk.exe 什么的都行. 略. 使用 CNTK 框架. import os import cntk as C import numpy as np 轻松愉快. 处理 CSV 数据格式 第一行不用管 1234567890,0,0,...,255,0 一行一张图, 第一个是数字, 后面是28x28个0-255的灰度值. 可以用 pandas 之类的又麻烦又难用的库. 不如自己写个小函数. def csv_reader(filename, batch_size = 1, is_test = False): with open(filename, 'r') as f: f....

May 18, 2018 · 3 min · laekov

LIRS Plus

最近在做一个 Cache 替换算法的 PA. 系统结构课. 给的 Baseline 是 2010 年的一个 championship. 看了看现在用得比较多的通用算法叫 LIRS. 在 LIRS 基础上想方法优化. 瞎搞的东西把单核 miss 率降低得有点 surprising. 还没有更多的 benchmark 测试. 感觉有点意思.

April 22, 2018 · 1 min · laekov

人智作业展示, 手把手教写拼音输入法

这篇讲义都是五笔打的 laekov 2018.04.12 Overview 作业要求 写一个拼音输入法, 一行一行地读拼音, 输出对应的汉语句子 84: 两小时就能写完 给出的数据 GBK编码的拼音->汉字对应表 新浪新闻一年的文章 评分 基础2字模型 扩展3字模型 四字, 双词, 三词… 需要写什么东西 拼音 2 汉字的 map 快速查找某个字/词词频的 map 估值函数和 infer 的算法 训练数据处理 最常用的16位编码是utf-8, 但是 Python 默认是 ASCII 的 所以在程序第一行写上 # -*- coding:utf-8 -*- Py 内部的 u'一个字符串' 可以用来表示 unicode 格式的字符串. 但是好像用不到. 创建 pinyin to 汉字的 map 读 GBK 文件的最简单的方法 with open('somefile.txt', 'r', encoding = 'gbk') as f: for (lineno, content) in enumerate(f): dealWithALine(content) content 的格式 wo 窝 我 握 渥 (五笔党词穷了) python 自带分割 py2ch_map = {} def dealWithALine(c): d = c....

April 14, 2018 · 2 min · laekov

Lagrange插值, 三次样条插值和最小二乘拟合

看 paper 看烦了来贴点代码玩. Lagrange插值就是一个多项式乘. void genLagrangePoly(int n) { double *x = new double[n + 1]; double *y = new double[n + 1]; double *a = new double[n + 1]; double *tmp = new double[n + 1]; for (int i = 0; i <= n; ++ i) { x[i] = -5. + 10. / n * i; y[i] = f(x[i]); a[i] = 0; } for (int i = 0; i <= n; ++ i) { memset(tmp, 0, sizeof(double) * (n + 1)); tmp[0] = 1....

March 28, 2018 · 5 min · laekov

Logs on setting up Jupyter

最近在尝试搭 python 的数据分析的环境. 总结一下遇到的一些坑. 用的是 14.04 这个有点老的 ubuntu. nginx + jupyter jupyter 这个玩意的 web 写得不是很优美. 所以需要转发的地方蛮麻烦的. 本来想直接在 uri 里搞一下. 然后发现过于难受就放弃了, 重新配置了一个域名转发. nginx 的 server 配置里需要加这么一段. server { location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_pass http://127.0.0.1:8888; } } 其中有个Upgrade是这么定义的. http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } sendfile on; } google 了几个配置文件才弄出这么一个能用的....

November 14, 2017 · 1 min · laekov

Web 爬虫二三事

最近 get 了一个技能叫爬虫. (可能早就 get 了只是没有实践过?) 然而我是用 js 写的. 毕竟自带异步而且瓶颈是延迟. 任务大概是说抓 wiki 的 list of people 上的人的 info. 然后发现可能它是一个不规则的索引结构. 每个二级索引都长得不太一样. 没事我们直接当作它就是二级索引结构. 然后发现有的企业也有 infobox. 这就很无语了? 没事我们判断一下它是不是有 occupation, born 这样的关键字吧. 然后大概就比较能看了? (才怪) 另外在看资料的时候才发现一种把 html plain 化的方式. 直接把所有的标签去了. 之前沉迷剥标签的我突然觉得自己真是蠢哭了. 嗯就是这么愉快.

September 15, 2017 · 1 min · laekov

docker-compose DHCP and DNS

docker-compose 的网络 会自动加一些解析 把服务名和 ip 给绑起来 所以根本不用去搞 static ip 好像被这事坑了一万年了

August 8, 2017 · 1 min · laekov