linux 庫函數 劫持,Linux hook技術之-Ring3下動態鏈接庫.so函數劫持

劫持普通函數當然沒有什么意思了!我們要劫持的是系統函數!我們知道,Unix操作系統中對于GCC而言,默認情況下,所編譯的程序中對標準C函數(fopen、printf、execv家族等等函數)的鏈接,都是通過動態鏈接方式來鏈接libc.so.6這個函數庫的,我們只要在加載libc.so.6之前加載我們自己的so文件就可以劫持這些函數了。

二、Demo

我們從一個簡單的c程序(sample.c)開始

下面的代碼標準調用fopen函數,并檢查返回值#include

int main(void) {

printf("Calling the fopen() function...\n");

FILE *fd = fopen("test.txt","r");

if (!fd) {

printf("fopen() returned NULL\n");

return 1;

}

printf("fopen() succeeded\n");

return 0;

}編譯執行

$ gcc -o sample sample.c

$ ./sample

Calling the fopen() function...

fopen() returned NULL

$ touch test.txt

$ ./sample

Calling the fopen() function...

fopen() succeeded開始編寫我們自己的so動態庫

#include

FILE *fopen(const char *path, const char *mode) {

printf("This is my fopen!\n");

return NULL;

}編譯成.so

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c設置環境變量后執行sample程序,我們可以看到成功劫持了fopen函數,并返回了NULL

$ LD_PRELOAD=./myfopen.so ./sample

Calling the fopen() function...

This is my fopen!

fopen() returned NULL當然 ,使fopen始終返回null是不明智的,我們應該在假的fopen函數中還原真正fopen的行為,看下面代碼 這回輪到 dlfcn.h 出場,來對動態庫進行顯式調用,使用dlsym函數從c標準庫中調用原始的fopen函數,并保存原始函數的地址以便最后返回 恢復現場

#define _GNU_SOURCE

#include

#include

FILE *fopen(const char *path, const char *mode) {

printf("In our own fopen, opening %s\n", path);

FILE *(*original_fopen)(const char*, const char*);

original_fopen = dlsym(RTLD_NEXT, "fopen");

return (*original_fopen)(path, mode);

}Tips: 如果dlsym或dlvsym函數的第一個參數的值被設置為RTLD_NEXT,那么該函數返回下一個共享對象中名為NAME的符號(函數)的運行時地址。 下一個共享對象是哪個,依賴于共享庫被加載的順序。dlsym查找共享庫順序如下: ①環境變量LD_LIBRARY_PATH列出的用分號間隔的所有目錄。 ②文件/etc/ld.so.cache中找到的庫的列表,由ldconfig命令刷新。 ③目錄usr/lib。 ④目錄/lib。 ⑤當前目錄。 ? 編譯:

gcc -Wall -fPIC -shared -o myfopen.so myfopen.c -ldl執行:調用原始函數,劫持成功!

$ LD_PRELOAD=./myfopen.so ./sample

Calling the fopen() function...

In our own fopen, opening test.txt

fopen() succeeded

三、需要注意的問題以及LD_PRELOAD hook的應用

需要注意的問題

1.so文件加載及函數劫持的順序。

在很多情況下,在你進行劫持之前,系統中已經有其他組件也對該函數進行了劫持,那么就要特別注意so加載的順序,一定要在其他組件的so庫加載前加載自己的so庫,否則你的hook函數將會被忽略。

2.保持原本函數的完備性與業務的兼容性。被hook的函數一定要hook結束時進行返回,返回前自己的執行邏輯中不能過度延時,過度延時可能造成原有的業務邏輯失敗。使用RTLD_NEXT 句柄,維持原有的共享庫調用鏈。

應用一:HIDS入侵檢測系統

劫持libc庫

優點: 性能較好, 比較穩定, 相對于LKM更加簡單, 適配性也很高, 通常對抗web層面的入侵.

缺點: 對于靜態編譯的程序束手無策, 存在一定被繞過的風險.

應用二:rootkit惡意軟件

已經有多種惡意軟件應用了此技術,常見的有cub3、vlany、bdvl等

之后的幾篇文章我將會通過分析以上幾款惡意軟件來揭秘.so共享庫劫持技術的具體應用,敬請期待!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532248.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

await原理 js_「速圍」Node.js V14.3.0 發布支持頂級 Await 和 REPL 增強功能

本周,Nodejs v14.3.0 發布。這個版本包括添加頂級 Await、REPL 增強等功能。REPL 增強通過自動補全改進對 REPL 的預覽支持,例如,下圖中當輸入 process.ver 之后,不需要輸入剩下的實際內容,它幫我們生成了自動補全的輸…

在linux安裝requests庫命令,在Linux--Ubuntu18.04環境下安裝requests庫

之前在服務器上裝過requests庫,但是記憶中花了好大的力氣才成功,現在因為一次意外,服務器重裝系統,現在這些亂七八糟的庫又要重裝一遍,與上次不同的是,這次我裝一遍就成功了。現在分享一下成功的經歷。Pyth…

linux輸入ls后不顯示_零基礎學習之Linux基礎命令小結

安裝完重啟后,沒有像sery所說在圖形界面崩潰了,由于我沒有安裝X-WINDOWS而是直接進入了文本界面。如果你想做linux管理的話,最好在文本界面下工作,這樣會適應如下圖:第一行顯示的是我們所安裝的linux是Red Hat 企業4第二行顯示的是…

redhat enterprise linux 哪個版本好,Red Hat Enterprise Linux 版本顯示中(Santiago)是啥意思?...

樓主的邏輯還有問題。1、linux跟windows都是一種操作系統,但是它用的分區格式是ext3的,ntfs和fat都不合適。安裝過程中你可以自己選擇刪除現有分區創建新分區,但如果你不了解,很可能把所有的分區都清了。2、redhat分區多大合適看你…

.gitignore文件_【第1739期】為Git倉庫里的.idea文件夾正名

前言.idea該不該提交到代碼倉庫中呢?你的意見呢?今日早讀文章由《Flask Web開發》作者李輝分享。正文從這開始~~在網絡上,我曾多次看到人們對于Git倉庫中的.idea文件夾的偏見。最近的一次是在某個博客中技術專家對于志…

監控linux時間不對,shell 計算故障時間 配合web監控

#!/bin/bash#checkfail.log 為SHELL監控網站時間存放的日志文件 https://blog.51cto.com/junhai/2437965fail_time(){starttimetail -n 1000 checkfail.log |grep "$url"|grep "第1次"|tail -n 3|head -n 1|awk {print $1, $2} #取網站掛掉的時間endtimet…

linux redis清空數據恢復,Redis數據恢復--誤刪數據后一次嚇尿的經歷

1、起因,一個flushdb命令因為誤操作,輸入了一個flushdb命令,導到redis里0號庫里的數據全部清空,OMG,這里有不少重要信息,如果被領導知道,必開除2、appendonly留有生機仔細想想,當時數…

c語言 枚舉類型 uint32_淺談C語言枚舉類型 | 附自創用法分享

經濟學家說過,路邊是不會有100元的;但如果有,你還是要撿起來。同理,在貌似萬物免費的網絡時代,你是很難找到有針對性的好資料;但是如果有,希望你能認真學習吸收。比如筆者今天寫的這一篇一今天這…

linux在bin下加入ssh,移植?ssh?到開發板

2》編譯/home/arm下新建目錄sshwork,并且將源碼復制到該目錄下mkdir /home/arm/sshworkcp zlib-1.2.3.tar.gz openssl-0.9.8d.tar.gz openssh-4.6p1.tar.gz/home/arm/sshwork/home/arm/sshwork下新建目錄lib,用來保存生成的庫文件。mkdir /home/arm/sshw…

java pdf增刪改查_如何利用Java代碼操作索引庫?

今天是劉小愛自學Java的第161天。感謝你的觀看,謝謝你。學習計劃安排如下:學了幾天的Elasticserch,但都是它本身的知識點,如何通過Java語言去操作它呢?這就好比以前學數據庫,在數據庫工具中通過sql語句也能…

linux shell 第幾行,Linux shell 獲得字符串所在行數及位置

shell 獲得字符串所在行數及位置01 獲取字符串所在的行數方式一:用grep -n[rootroot]# cat testapplebitcreatedelectexeflowgood[rootroot]# cat test | grep -n exe5:exe[rootroot]# cat test | grep -n exe | awk -F ":" {print $1}5方式二&#xff1a…

sublime text3 怎么配置、運行python_SublimeText3按ctrl+b執行python無反應

最后更新時間:2017-09-14 現象: 在Sublime中打開.py文件,按”ctrlb”執行時無反應。點擊工具->編譯系統中已經有且識別到Python,但執行”run(ctrlshiftb)”時無反應,Sublime左下角提示”No B…

linux 火鍋平臺,“定制版火鍋”來襲,持續創新才能永葆活力

原標題:“定制版火鍋”來襲,持續創新才能永葆活力5月1日,重慶涪陵紅酒小鎮的一家轉轉火鍋店,推出“五一”定制版火鍋免費請游客品嘗。廣西的螺螄粉、貴州的折耳根、湖南臭豆腐、福建烏龍茶、重慶榨菜、河南胡辣湯、陜西老陳醋、海…

internetreadfile讀取數據長度為0_YOLOV3的TensorFlow2.0實現,支持在自己的數據集上訓練...

GitHub鏈接:calmisential/YOLOv3_TensorFlow2?github.com我主要參考了yolov3的一個keras實現版本:qqwweee/keras-yolo3?github.com目前支持在PASCAL VOC 2012數據集上訓練和自定義數據集上訓練,具體的訓練過程可參考項目倉庫中的README文檔…

c語言用鏈表對學生成績排序,學生成績排序和平均分計算利用c語言鏈表的創建插入刪除.doc...

#define NULL 0#define LEN sizeof(struct student)struct student{long num;float score;struct student *next;};int n;struct student *creat(void)//創建鏈表{struct student *head;struct student *p1,*p2;n0;p1p2(struct student*)malloc(LEN);scanf("%ld,%f",…

深井軟巖巷道群支護技術與應用_深井軟巖巷道深淺孔帷幕注漿技術

一、成果內容1.基本原理對失修巷道進行刷擴、支護,滿足使用斷面后進行幫頂噴漿、底板整平,先底板注漿,然后幫、頂注漿。錨架充支護巷道直接底板整平后,先底板后幫、頂注漿。通過全斷面深淺孔聯合注水泥漿進行巷道加固,…

店鋪咨詢系統c語言,課內資源

1 題目介紹1.1 問題描述出于不同目的的旅客對交通工具和交通路徑有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能短,出門旅游的游客則期望旅費盡可能省,而老年旅客則要求中轉次數最少。編制一個交通咨詢系統程序,為旅客提供最優決策的交通咨詢。1.2 需求分析提供對…

f分布表完整圖_【教育統計答疑】如何理解正態分布、均值分布、^2分布、t分布和F分布...

許多教育統計的初學者都表示這幾個分布感到學起來非常吃力,結合最近上課的體會以及答疑的情況,覺得很有必要在這里簡單地對這部分內容進行澄清和梳理,以助理解。首先,“為什么要學習這幾個分布”可能是許多人糾結的問題&#xff0…

c語言第一章考試題及答案,C語言考試題庫及答案整理版.doc

C語言考試題庫及答案整理版.docC語言理論上機考試選擇題部分(共200題)1、下面程序的輸出是___D______#includevoid main(){ int k11;printf("k%d,k%o,k%x\n",k,k,k);}A) k11,k12,k11 B) k11,k13,k13C) k11,k013,k0xb D) k11,k13,kb2、在下列選項中,不正確的賦值語句是…

python每天定時9點執行_python每天定時運行某程序代碼

思路:利用time函數返回的時間字符串與指定時間字符串做比較,相等的時候執行對應的操作。不知道大家的思路是什么,感覺這樣比較耗CPU。。。。 此處設置為15:30:10 輸出相應內容,需要執行什么,就修改什么。 import time …