0%

前言

自从开始读 Ph.D. 之后,对算力的要求逐步增长,因此一直想购入强劲的服务器用于科研玩装机,感谢近几年的 AMD 强势,我居然只用了大概 4 万元就拿下了两台 EPYC 7B13 64C128T + 1T 内存的工作站,这篇文章就来简单分享一下整个实战过程和一些经验。

阅读全文 »

前言

Datalog 是一种由 Prolog 分化而来的逻辑编程语言,相比 Prolog 最大的不同在于 Datalog 对于语法做出了很多限制因此是非图灵完全的,然而 Datalog 仍然在数据库和程序分析中有着广泛的应用。Souffle 是 Datalog 的高效实现之一,之前在北大熊英飞老师的公开课上曾经见过但是那个时候不理解也不太会写,最近修程序分析的时候又一次遇到,大作业被迫写了一千多行,因此本文就是用来记录一下 Souffle 编程的经验。

本文的代码可以在 Souffle 的在线编译器中运行。

For English version of this post, see this.

阅读全文 »

Callbacks

For English version of this post, see here.

一般来说,一个用 C 写的库可能会暴露接收一个函数指针作为回调函数,比如:

1
2
3
typedef void (*callback_t)(void* data);

void register_callback(callback_t callback, void* data);

然后我们可能会这样使用这个接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef struct Context {
int id;
} Context;

void callback(void* data) {
Context* ctx = (Context*)data;

printf("Context id=%d\n", ctx->id);
}

int main(){
Context* ctx = malloc(sizeof(Context));
ctx->id = 114514;

// some operation

register_callback(callback, ctx);

// other operation

free(ctx);
}

但是这样仍然不太方便,因为我们需要手动管理 data 指针的生命周期,一不小心就有可能会内存泄漏。

阅读全文 »

前言

对于分析 IOT 的安全工程师来说,模拟调试一个非本机架构的 binary/rootfs 是很常见的需求,今天介绍一种我本人觉得虽然稍微有点扭曲但是效果最好的办法:用 qemu-system 模拟运行异构的 Debian,并且相比常见的 network install 的方法有很大的改进。

本文主要介绍用 qemu-system-arm 来安装运行 arm Debian,对于 mips Debian 步骤基本是一样的。

For English version of this post, see here.

阅读全文 »

前言

分析一个实模式二进制文件,比如 DOS 可执行文件或者 MBR 代码从来不是一个简单的任务。目前最好的办法是先用 Bochs, QEMU 或者 Dosbox 模拟运行,然后再使用 gdb, debug.exe 或者 IDA Pro来远程调试。但是这都是在没有麒麟框架(Qiling Framework)的情况下。现在我们想骄傲的宣布,麒麟框架正式支持 16bit 二进制的模拟运行,并且与之伴随的还有麒麟框架多维度分析二进制文件的能力。

本文在介绍实模式模拟实现细节的同时也会作为一篇教程来介绍麒麟框架的使用。

For English version, see here.

阅读全文 »

前言

最近终于稍微闲了一点可以花点时间把博客整理一下了你鸽了多久心里没数吗,这篇文章算是这个过程中的一些碎碎念吧。

本文为非技术文章。

阅读全文 »

前言

最近研究 Chromium 和 HTML 标准,不可避免的就接触到了 Web IDL,这里就总结性的聊聊吧,也当是学习笔记了。

本文几乎就是照搬现在 Web IDL 的标准,但也不是简单的翻译也翻译不准

阅读全文 »

前言

本文其实是软工课程的一次作业,算是对自己之前使用 Git 的一些心得体会的总结吧。

阅读全文 »