實(shí)踐中學(xué)習(xí)cve-2016-5195

該漏洞是Linux內(nèi)核的內(nèi)存子系統(tǒng)在處理寫時(shí)拷貝(Copy-on-Write)時(shí)存在條件競爭漏洞淌铐,導(dǎo)致可以破壞私有只讀內(nèi)存映射祈搜。纵朋,利用此漏洞獲取其他只讀內(nèi)存映射的寫權(quán)限乔宿,進(jìn)一步獲取root權(quán)限膳汪。

看了一些blog唯蝶,這里就不講其原理了,網(wǎng)上已經(jīng)很多了哈遗嗽,好像常見的利用方法就是如此:

  1. patch run-as

  2. 打開wifi開關(guān)粘我,實(shí)現(xiàn)ned進(jìn)程重啟,patch init進(jìn)程媳谁,覆蓋sepolicy涂滴,獲取root

  3. Patch vdso友酱,反彈shell

  4. Patch zygote 替換,hook邏輯分發(fā)柔纵。

…………………

假設(shè)讀者已對此漏洞的原理非常熟悉的情況下缔杉,我們來看以下在實(shí)踐過程中遇到的問題。在以上方式均嘗試的過程中搁料,發(fā)現(xiàn)并不能很好的適配或者很有效的root或详,經(jīng)常會(huì)造成死機(jī),所以一邊嘗試一邊在學(xué)習(xí)郭计,并在利用的過程中加入了自己的一些理解霸琴。

1. dirtycow可以修改運(yùn)行內(nèi)存的執(zhí)行文件的任意一塊代碼,也可以整體修改(這樣會(huì)比較暴力昭伸,進(jìn)程會(huì)成僵尸或者被kill梧乘,所以想法是:patch關(guān)鍵性代碼,劫持程序流庐杨,讓邏輯走別的地方选调,然后fork出我自己的進(jìn)程,拿到root

dirtycow觸發(fā)的思路是:

patch /system/bin/debuggerd這個(gè)進(jìn)程,如果熟悉其代碼的話灵份,

如果系統(tǒng)執(zhí)行某個(gè)程序崩潰了仁堪,debuggerd就會(huì)檢測到程序崩潰,就會(huì)跳出循環(huán)填渠,執(zhí)行dump

其實(shí)是一個(gè)while循環(huán)

 while(1)

 {

   accept()

   Process_error()

 }

一般程序都會(huì)阻塞在accept函數(shù)上弦聂,這時(shí)候如果有別的進(jìn)程因?yàn)楫惓#蜁?huì)被debuggerd進(jìn)程接收socket氛什,莺葫,這時(shí)候會(huì)調(diào)用Process_error(我自己隨意寫的函數(shù)名)函數(shù),

然后再處理異常的函數(shù)中會(huì)調(diào)用比較長的代碼進(jìn)行dump堆棧屉更,分析目標(biāo)進(jìn)程崩潰的日志的原因等一系列操作徙融,那么dirtycow可以從這入手拿到穩(wěn)定的root權(quán)限,即也不會(huì)影響程序的運(yùn)行瑰谜。

1.先讓自己進(jìn)程崩潰,崩潰可以是越界拷貝树绩,或者除0錯(cuò)誤萨脑,讓debuggerd收到錯(cuò)誤信號(hào),這時(shí)候會(huì)傳遞到debuggerd執(zhí)行錯(cuò)誤邏輯饺饭,都會(huì)導(dǎo)致執(zhí)行Process_error的函數(shù)渤早,其實(shí)可以看到觸發(fā)還是很容易,這個(gè)方法我是當(dāng)時(shí)隨便寫了一個(gè)程序瘫俊,寫錯(cuò)程序鹊杖,發(fā)現(xiàn)了這個(gè)可以算是可以簡單的利用的點(diǎn)吧悴灵,接下來如果我們把一些Process_error()函數(shù)內(nèi)部用dirtycow修改函數(shù)內(nèi)部的一些指令,導(dǎo)致執(zhí)行shellcode骂蓖,不就可以輕松拿到root權(quán)限了!

只要放入這樣的shellcode

if(fork()==0)

{

  char *argv_su[] = { "/system/bin/su", NULL, NULL };

   execve(argv_su[0], argv_su,0);

   exit(0);

}

我們知道su是不能放入su文件中的积瞒,這時(shí)候我們用/system/bin/下的任意文件替換,用dirtycow /system/bin/oatdump /data/local/tmp/su 用su替換其oatdump文件

然后再執(zhí)行

if(fork()==0)

{

char *argv_su[] = { "/system/bin/oatdump", NULL, NULL };

 execve(argv_su[0], argv_su,0);

 exit(0);

}

我們可以看到系統(tǒng)中已經(jīng)有一個(gè)oatdump進(jìn)程以root權(quán)限運(yùn)行了登下,其實(shí)是su文件

其實(shí)在老版本的系統(tǒng)中茫孔,或者selinux不嚴(yán)格或者關(guān)閉的系統(tǒng)中,這個(gè)進(jìn)程已經(jīng)為所欲為了被芳,

但是在有些高版本的系統(tǒng)中缰贝,selinux的嚴(yán)格限制,這個(gè)以debuggerd fork出來的進(jìn)程上下文是u:r:debuggerd:r0,其實(shí)他的權(quán)限很小的畔濒,它只能ptrace剩晴,它能把dump出來的進(jìn)程堆棧文件寫入/data/anr目錄中,它不能往sdcard寫侵状,也不能再/data/local/tmp目錄下寫赞弥,也不能讀安裝程序目錄下的文件比如/data/data子目錄下的文件。所以我當(dāng)時(shí)測試了好多次確實(shí)是不行的壹将。

想要patch init文件嗤攻,必須獲取到init文件,但根目錄下init文件不能取出诽俯,普通shell不能取出妇菱,debug這個(gè)進(jìn)程雖然能讀出/init進(jìn)程的二進(jìn)制文件字節(jié)碼,但是它根本寫不到任何目錄暴区,沒辦法獲取init的bin文件闯团,當(dāng)時(shí)github上有利用系統(tǒng)進(jìn)程/system/bin/netd/進(jìn)程崩潰,去讀出/init進(jìn)程仙粱,但需要人們利用共享wifi的方式才能觸發(fā)netd崩潰房交,去執(zhí)行shellcode,我感覺netd的進(jìn)程比debuggerd進(jìn)程有相對更多的權(quán)限伐割,比如連接socket候味,那我們就可以su client端連接以u(píng):r:netd:s0的服務(wù)端daemon su,做更多的事情了隔心,但debuggerd方式并不能連接普通權(quán)限的socket的白群,看進(jìn)程名字就可以發(fā)現(xiàn)這個(gè)了,以debuggerd方式去fork su的daemon當(dāng)然也不可以硬霍,當(dāng)時(shí)我試了幾個(gè)版本的su帜慢,不行,都被selinux拒絕。

經(jīng)過測試粱玲,debuggerd進(jìn)程也不能訪問/data/子目錄下的文件躬柬,這上面其實(shí)浪費(fèi)了挺長的時(shí)間,還寫了幾類shellcode的client端和server端抽减,嘗試用不同的socket鏈接允青,不管用,其實(shí)可以查詢這個(gè)daemon的sepolicy也可以胯甩,但發(fā)現(xiàn)一些奇怪的點(diǎn)就是在允許的情況下依然不能bypass一些規(guī)則昧廷。尤其到后來的版本,selinux已經(jīng)開啟了mls軍事級(jí)別偎箫,這樣不能整體的覆蓋sepolicy木柬,必須借用sepoliyc-inject 一條規(guī)則的設(shè)置,如果在上下文相同的情況下淹办,必須某個(gè)app下的files 它是u:object_r:app_data_file:s0,當(dāng)然可以操作眉枕,如果變?yōu)閡:object_r:app_data_file:s123和u:object_r:app_data_file:s321,當(dāng)然即使init進(jìn)程上下文的root和修改規(guī)則也不行,只好用setcon修改上下文的動(dòng)作來實(shí)現(xiàn)怜森,比如將u:object_r:app_data_file:s321改成u:object_r:app_data_file:s0速挑。總之這里會(huì)遇到一些挫折副硅。

2.所以我們獲取到debuggerd上下文的的root進(jìn)程只能作為一個(gè)跳板姥宝,進(jìn)一步去patch init進(jìn)程代碼,去拿到更高權(quán)限的root進(jìn)程恐疲,但是我們首先要獲取init進(jìn)程的bin文件腊满,才能用ida分析他,去patch它培己,但debuggerd能讀出來碳蛋,但是無法寫入任何目錄,所以我當(dāng)時(shí)用的一個(gè)笨方法省咨,就是借用logcat打印出十六機(jī)制字符串肃弟,再用工具組合成init的bin文件,無奈之舉零蓉,拿出來init之后笤受,對照安卓系統(tǒng)的源代碼,可以分析出來敌蜂,當(dāng)然可以從boot.img文件中提取 出來感论,我這里進(jìn)入死胡同,非要通過這個(gè)進(jìn)程來提取紊册,init進(jìn)程是安卓應(yīng)用層第一個(gè)運(yùn)行的程序,肯定不會(huì)調(diào)用任何動(dòng)態(tài)庫,它用的所有庫都是靜態(tài)編譯到里面囊陡,所有的函數(shù)名都被strip了芳绩,其實(shí)只要拿到init代碼,就可以對init代碼做手腳撞反,普通的程序是沒有權(quán)限讀取init進(jìn)程妥色,所以無法借用dirtycow去patch,只能借助root的進(jìn)程即debuggerd進(jìn)程遏片,后來我發(fā)現(xiàn)有好多這樣的像debuggerd進(jìn)程的普通root進(jìn)程嘹害,即都是在/system/bin下的文件運(yùn)行起來的進(jìn)程可以利用,后來我又嘗試通過/system/bin/installd拿到installd上下文的root進(jìn)程(當(dāng)然也可以通過installd進(jìn)程拿到init bin文件吮便,這樣就不用打印日志了)笔呀,所以有while循環(huán)的地方有可能即是我們的利用點(diǎn),我們回來繼續(xù)說debuggerd進(jìn)程髓需,這個(gè)進(jìn)程非常好拿到root權(quán)限的進(jìn)程许师,只要patch幾個(gè)字節(jié)即可,我發(fā)現(xiàn)也很隱蔽僚匆。

3.通過了解init進(jìn)程的大部分源代碼微渠,,它有for循環(huán)咧擂,一直運(yùn)行這個(gè)循環(huán)逞盆,有需要執(zhí)行的命令,就去執(zhí)行松申,有修改的屬性值云芦,它就去修改屬性,有些系統(tǒng)進(jìn)程異常退出攻臀,它會(huì)把這個(gè)進(jìn)程重啟焕数,好了看到這里,先不用著急刨啸,先寫一個(gè)函數(shù)堡赔,所有的代碼都將變成shellcode,patch到目標(biāo)進(jìn)程设联,先寫偽代碼o( ̄︶ ̄)o:

 By_pass_all()

{

 //**1.bypass selinux****善已,相當(dāng)于禁掉selinux****,用自己制作的sepolicy****文件來覆蓋系統(tǒng)的sepolicy****文件**

int load_fd = openat(0, "/sys/fs/selinux/load", O_WRONLY);

 int new_fd = openat(0, "/data/local/tmp/sepolicy", O_RDONLY);

 size_t new_size = lseek(new_fd, 0, SEEK_END);

 lseek(new_fd, 0, SEEK_SET);

 void *new_contents = mmap(0, new_size, PROT_READ, MAP_PRIVATE, new_fd, 0);

 write(load_fd, new_contents, new_size);

 close(load_fd);

 close(new_fd);

//2.fork su

if(fork()==0)

{

char *argv_su[] = { "/system/bin/oatdump", NULL, NULL };

 execve(argv_su[0], argv_su,0);

 exit(0);

}

}

我們可以這個(gè)函數(shù)放在init進(jìn)程不經(jīng)常調(diào)用的位置离例,直接在以上的for循環(huán)中 直接修改中間無用的指令BL By_pass_all() ,只修改4個(gè)字節(jié)的指令就可以實(shí)現(xiàn)了换团,我們發(fā)現(xiàn)只有這樣才是可行的,1.bypass selinux 2. fork su 宫蛆,如果第一步?jīng)]有艘包,即使拿到init上下文的進(jìn)程的猛,也由于5.0以上系統(tǒng)的嚴(yán)格的selinux限制,也不能為所欲為想虎,由于init進(jìn)程是非常脆弱的卦尊,如果不了解原理,或者shellcode寫的不好也就重啟了舌厨,它里面沒有任何函數(shù)名字岂却,是一個(gè)完全的靜態(tài)的程序。

當(dāng)然還有另外一種比較好的方法就是:我們知道當(dāng)系統(tǒng)進(jìn)程比如debuggerd進(jìn)程退出的時(shí)候裙椭,init進(jìn)程就會(huì)啟動(dòng)debuggerd進(jìn)程躏哩,我們找到init進(jìn)程的start_serice這個(gè)函數(shù)里面進(jìn)程BL By_pass_all() 函數(shù)的調(diào)用,就會(huì)更加方便快捷揉燃。

當(dāng)然更方便的還有扫尺,既然我們都繞過selinux,那我們fork su進(jìn)程的任務(wù)其實(shí)完全可以交給debuggerd或者其他的非init進(jìn)程上下文的進(jìn)程來做你雌,也更省事了器联,但是繞過selinux的任務(wù)必須交給init進(jìn)程來做。

以上的方式可以悄無聲息的拿到root婿崭,后來我又嘗試了zygote的進(jìn)程的fork zygote上下文的root進(jìn)程拨拓,因?yàn)閦ygote只要有程序開始運(yùn)行就會(huì)讓zygote執(zhí)行一些固定的指令,所以這一步完全可以程序主動(dòng)讓其觸發(fā)氓栈,隨后我又嘗試再安裝apk的時(shí)候渣磷,比如pm install *.apk,這時(shí)候installd這個(gè)進(jìn)程也可以fork出我們想要的root進(jìn)程,我們記住授瘦,無論zygote或者installd這樣的子進(jìn)程雖然不能有強(qiáng)大的權(quán)限醋界,也不能bypass selinux,但是他具有獲取/data/data目錄下的東西的能力提完,也就是它能獲取我們手機(jī)中的任何有價(jià)值的數(shù)據(jù)形纺,也就是說,我們即使不能運(yùn)行su徒欣,不繞過selinux逐样,它依然可以做出一個(gè)偷別人數(shù)據(jù)的病毒,由于5.0以上不能往/system/bin下寫文件打肝,這樣我們獲取的root進(jìn)程具有臨時(shí)性脂新,但不妨礙我們添加開機(jī)添加boot_completed的廣播,每次開機(jī)啟動(dòng)都重新獲取root粗梭,dirtycow的利用也相當(dāng)穩(wěn)定争便,好用。

有的人會(huì)說通過setprop屬性設(shè)置值觸發(fā)這塊shellcode執(zhí)行断医,調(diào)用屬性設(shè)置的流程代碼去patch滞乙,但我試過了奏纪,的確在adb shell下非常順利的拿到了6.0的root,但是放到apk下酷宵,setprop被selinux 拒絕了亥贸,這里就一個(gè)雞生蛋的問題,不得不尋找其他的方法浇垦。

4.好了以上分析,就是其原理荣挨,看懂其原理男韧,我們發(fā)現(xiàn)適配遇到的問題。

首先我們寫4個(gè)代碼默垄,他們在運(yùn)用的時(shí)候會(huì)以shellcode運(yùn)行此虑。

### 代碼1:

Fork_su_by_debugger()

{

if(fork()==0)

{

char *argv_su[] = { "/system/bin/oatdump", NULL, NULL };

 execve(argv_su[0], argv_su,0);

 exit(0);

}
}

代碼2

Call Fork_su_by_debugger()

代碼3

Bypass_selinux()

{

int load_fd = openat(0, "/sys/fs/selinux/load", O_WRONLY);

 int new_fd = openat(0, "/data/local/tmp/sepolicy", O_RDONLY);
 //有的版本限制了讀取/data/local/tmp下的文件,需要再利用一次漏洞覆蓋其他目錄下的文件口锭,app下嚴(yán)格了這一點(diǎn)朦前。

 size_t new_size = lseek(new_fd, 0, SEEK_END);

 lseek(new_fd, 0, SEEK_SET);

 void *new_contents = mmap(0, new_size, PROT_READ, MAP_PRIVATE, new_fd, 0);

 write(load_fd, new_contents, new_size);

 close(load_fd);

 close(new_fd);

}

代碼4

Call Bypass_selinux()

我們可以分為4個(gè)函數(shù)代碼,以下我們以其

1.debuggerd進(jìn)程的自動(dòng)適配

A. 代碼1:Fork_su_by_debugger()這個(gè)shellcode應(yīng)該放在哪個(gè)位置鹃操,這個(gè)位置應(yīng)該如何以程序的角度來尋找韭寸,代碼2:Call Fork_su_by_debugger()雖然是一個(gè)函數(shù)調(diào)用的指令只占4個(gè)字節(jié)的指令,它應(yīng)該放在程序的那個(gè)位置荆隘,去替換別的指令恩伺,如果這4個(gè)字節(jié)的指令放在不合適的地方,有可能程序崩潰椰拒。

2.Init進(jìn)程代碼的自動(dòng)適配

代碼3和代碼4的位置依然存在以上的問題晶渠。而且init進(jìn)程函數(shù)的名字被全部去除。

談到適配的問題需要分兩步談適配燃观,

  1. 適配debuggerd程序

我們知道debuggerd發(fā)現(xiàn)別的進(jìn)程異常退出就會(huì)進(jìn)入處理流程的函數(shù)Process_error()函數(shù)褒脯,然后會(huì)在這個(gè)函數(shù)中,patch修改一些arm匯編缆毁,填入我們的代碼2:call Fork_su_by_debugger()番川,在填入代碼1:Fork_su_by_debugger()相應(yīng)位置即可,不過不用這么麻煩积锅,我們看proces_error函數(shù)內(nèi)部反匯編的一小段代碼:

image.png

我們再把這段代碼以文字形式粘貼過來并且做進(jìn)一步的精簡

 if ( !strcmp(&v98, "false")

 || (property_get("ro.debug_level", &v98, "unknown"),

 _android_log_print(6, 0, "ro.debug_level = %s", &v98),

 strcmp(&v98, "0x4f4c")) )

{

 _sprintf_chk(&**v99**, 0, 128, "dumpstate -k -t -z -d -o /data/log/dumpstate_app_native -m %d");

 ...........................

 system(&**v99**);

}

其實(shí)看以上的代碼正常別的進(jìn)程崩潰并沒有進(jìn)入if循環(huán)爽彤,我們只需要把標(biāo)注顏色的0x4f4c位置改成其他的字符串,這時(shí)候程序按照我們的要求就進(jìn)入if循環(huán)內(nèi)部了缚陷,再把另外一個(gè)字符串dumpstate -k -t -z -d -o /data/log/dumpstate_app_native -m %d換成/system/bin/su(/system/bin/otadump)即可适篙,這樣這段代碼就變成了

If(1)

{

_sprintf_chk(&**v99**, 0, 128, "/system/bin/oatdump");

 ...........................

 system(&**v99**);

}

其實(shí)我們可以再dumpstate -kt -t -z....這段字符串換成很多個(gè)指令的組合,比如

Ps ;/system/bin/ls;/system/bin/oatdump;來讓system調(diào)用箫爷,只要長度不超過即可嚷节,這樣是否達(dá)到了通用聂儒,和簡單,只需要用dirtycow找到這兩個(gè)字符串進(jìn)行修改硫痰,很輕易的繞過了尋找代碼的位置衩婚,輕松fork出了我們想要的root進(jìn)程,我發(fā)現(xiàn)在大部分手機(jī)都有這段代碼架構(gòu)而且并沒有多大的變化效斑,具備通用型非春,這一步已實(shí)現(xiàn)。

  1. 適配init進(jìn)程:

1.代碼1和代碼2已經(jīng)不用我們考慮缓屠,那么代碼3和代碼4的位置確實(shí)一個(gè)頭痛的問題奇昙。

假設(shè)我們認(rèn)為init進(jìn)程在每個(gè)手機(jī)沒有做多大的變化,以匯編指令的比較來patch敌完,其實(shí)也是一個(gè)好的方法储耐。

2.我們要注意代碼3的位置必須不能讓額外的代碼調(diào)用到它,否則會(huì)引起未發(fā)現(xiàn)的異常滨溉,容易定位不出問題在哪里就死機(jī)或者重啟了什湘,因?yàn)閕nit進(jìn)程非常的脆弱。

3.那么代碼3 Bypass_selinux()的函數(shù)位置放在哪里晦攒,就用程序自動(dòng)找到它的位置呢闽撤,其實(shí)我們發(fā)現(xiàn)main函數(shù)的位置可以以程序的角度來進(jìn)行定位,那么這個(gè)函數(shù)直接用作替換main函數(shù)的起始位置呢勤家,發(fā)現(xiàn)它是可行的腹尖,并且這個(gè)位置,不會(huì)被其他的代碼去調(diào)用伐脖,如果放在某個(gè)so的庫函數(shù)的位置热幔,那么大量的程序調(diào)用它,會(huì)造成不可控的局面讼庇。下一步绎巨,代碼4的位置選擇應(yīng)該如何選擇,即Call Bypass_selinux() 4個(gè)字節(jié)的指令應(yīng)該放在哪個(gè)位置呢蠕啄,是不是也存在適配debuggerd進(jìn)程一樣非常方便的方法场勤,發(fā)現(xiàn)并沒有,如果替換的指令是一個(gè)壓棧的指令直接導(dǎo)致init進(jìn)程崩潰重啟歼跟,而且通用性問題依然得不到解決和媳,即每個(gè)手機(jī)的每個(gè)版本的替換的位置均是那個(gè)流程那個(gè)函數(shù)的具體我們想要的某個(gè)位置。

4.我猜想了幾種方法哈街,無論采用init 在大循環(huán)中patch還是選擇start_service函數(shù)留瞳,其實(shí)我個(gè)人比較喜歡patch start_service,比較穩(wěn)定骚秦,如果選擇patch start_service內(nèi)部她倘,是不是可以采用inline hook的方式實(shí)現(xiàn)也是很有道理的璧微,即我們在中間找不到具體4個(gè)字節(jié)的位置,但在函數(shù)頭部做inlinehook 還是能很好的定位的硬梁∏傲颍或者先用符號(hào)表找到/system/lib下的so的函數(shù)shellcode,通過shellcode頭部比對init進(jìn)程進(jìn)行函數(shù)的識(shí)別荧止,再通過函數(shù)之間關(guān)系進(jìn)行定位init關(guān)鍵代碼屹电,也是可以的。

5.如果init進(jìn)程在每個(gè)手機(jī)代碼形式基本保持不變罩息,可以以某些字符串的引用位置做特征嗤详,進(jìn)行函數(shù)的定位。

當(dāng)時(shí)已實(shí)現(xiàn)root s6edge 5.0,5.16.0系統(tǒng)瓷炮。代碼這里就不放了哈。由于幾年前的草率的記錄下來递宅,大家請輕噴哈哈~謹(jǐn)以此記錄下知識(shí)點(diǎn)娘香,大家一起學(xué)習(xí)交流.

后來遺留了幾個(gè)問題哈:32位5.1下的會(huì)很奇怪,過了一個(gè)小時(shí)不等會(huì)重啟办龄,但我想內(nèi)核調(diào)試一下烘绽,但沒有時(shí)間來做了。
還有再設(shè)置sepolicy的情況下俐填,到了6.0以上安接,必須一條一條的設(shè)置規(guī)則,如果整體permissive也不起作用英融,還有的直接設(shè)置好下一條上一條就失效了盏檐。

參考:

http://www.reibang.com/p/b6fd45c2df82

https://zhuanlan.zhihu.com/p/25918300

利用:

https://github.com/freddierice/trident

https://github.com/matteoserva/dirtycow-arm32

vdso方式利用

https://github.com/hyln9/VIKIROOT

··

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驶悟,隨后出現(xiàn)的幾起案子胡野,更是在濱河造成了極大的恐慌,老刑警劉巖痕鳍,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫豆,死亡現(xiàn)場離奇詭異,居然都是意外死亡笼呆,警方通過查閱死者的電腦和手機(jī)熊响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗赌,“玉大人汗茄,你說我怎么就攤上這事【成觯” “怎么了剔难?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵胆屿,是天一觀的道長。 經(jīng)常有香客問我偶宫,道長非迹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任纯趋,我火速辦了婚禮憎兽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吵冒。我一直安慰自己纯命,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布痹栖。 她就那樣靜靜地躺著亿汞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揪阿。 梳的紋絲不亂的頭發(fā)上疗我,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音南捂,去河邊找鬼吴裤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溺健,可吹牛的內(nèi)容都是我干的麦牺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鞭缭,長吁一口氣:“原來是場噩夢啊……” “哼剖膳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缚去,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤潮秘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后易结,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枕荞,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粟害,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年锦溪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼辙。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹦肿,死狀恐怖矗烛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤瞭吃,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布碌嘀,位于F島的核電站,受9級(jí)特大地震影響歪架,放射性物質(zhì)發(fā)生泄漏股冗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一和蚪、第九天 我趴在偏房一處隱蔽的房頂上張望止状。 院中可真熱鬧,春花似錦攒霹、人聲如沸怯疤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽集峦。三九已至,卻和暖如春抠刺,著一層夾襖步出監(jiān)牢的瞬間少梁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工矫付, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人第焰。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓买优,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挺举。 傳聞我的和親對象是個(gè)殘疾皇子杀赢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,725評(píng)論 0 10
  • Tcp/IP通信也是不安全的湘纵,在傳輸?shù)臅r(shí)候也可能出現(xiàn)漏洞 查看正在運(yùn)行的進(jìn)程 adb shell ps -A |g...
    遠(yuǎn)遠(yuǎn)飄著云閱讀 4,373評(píng)論 0 0
  • 一個(gè)程序被加載到內(nèi)存當(dāng)中運(yùn)行脂崔,那么在內(nèi)存內(nèi)的那個(gè)數(shù)據(jù)就被稱為進(jìn)程(process)。進(jìn)程是操作系統(tǒng)上非常重要的概念...
    Zhang21閱讀 1,921評(píng)論 0 12
  • Linux習(xí)慣問題: 在vim編輯時(shí)梧喷,按了ctrl + s后砌左,再按ctrl + q就可以繼續(xù)執(zhí)行了。ctrl + ...
    光著腳的鞋閱讀 4,491評(píng)論 0 16
  • 本次系列的內(nèi)容如下: Android啟動(dòng)流程——1 序言铺敌、bootloader引導(dǎo)與Linux啟動(dòng)Android系...
    隔壁老李頭閱讀 7,728評(píng)論 1 13