循环渐进NsDoor(五)
生活随笔
收集整理的這篇文章主要介紹了
循环渐进NsDoor(五)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
虛擬機(jī)已經(jīng)配好了,開(kāi)發(fā)環(huán)境好了,剩下的就是不辭辛苦,寫(xiě)代碼的事情了 - 高級(jí)語(yǔ)言寫(xiě)程序大家都見(jiàn)過(guò),匯編也有一部分人用,但是用的不多,但是反匯編的魅力卻很少有人注意 - 首先要說(shuō)下shellcode的原理吧 基礎(chǔ)知識(shí)應(yīng)該是C++和ASM - 隨便貼段代碼《緩沖區(qū)溢出教程》: #include<windows.h>?
-
int?main()?
{?
LoadLibrary(“msvcrt.dll”);?
system(“command.com”);?
-
????return?0;?
}?
//這個(gè)是開(kāi)DOS窗口的代碼,沒(méi)什么普通,典型語(yǔ)法糖…..?
#include?<windows.h>?
#include?<winbase.h>?
-
typedef?void?(*MYPROC)(LPTSTR);????????//定義函數(shù)指針?
-
int?main()?
{?
HINSTANCE?LibHandle;?
MYPROC?ProcAdd;?
LibHandle?=?LoadLibrary(“msvcrt.dll”);?
ProcAdd?=?(MYPROC)?GetProcAddress(LibHandle,?"system");?//查找system函數(shù)地址?
(ProcAdd)?("command.com");??????????//其實(shí)就是執(zhí)行system(“command.com”)?
-
return?0;?
}? 這段代碼實(shí)現(xiàn)上面那段一樣的功能,但是語(yǔ)法糖成分少了許多… PS:這段代碼其實(shí)是有BUG的,我測(cè)試過(guò),壓入的數(shù)據(jù)有問(wèn)題,不應(yīng)該是字符串,應(yīng)該是付給它個(gè)正確的地址…. 仔細(xì)看下,應(yīng)該發(fā)現(xiàn)些許程序執(zhí)行的原理 - 任何程序代碼都是要壓入內(nèi)存的,ASM中是code segment 代碼段也是地址啊,所以調(diào)用函數(shù),就是call Call函數(shù)的地址而已,這是寫(xiě)把高級(jí)語(yǔ)言轉(zhuǎn)換成shellcode的基礎(chǔ) - - 現(xiàn)在轉(zhuǎn)向要分析的reverse.cpp 先分析出這個(gè)文件中調(diào)用的所有函數(shù): - 有這些個(gè)函數(shù): - - 自然每個(gè)函數(shù)對(duì)應(yīng)一個(gè)地址,明白windows一點(diǎn)原理的應(yīng)該知道,這些函數(shù)的地址是固定的(在各個(gè)版本系統(tǒng)內(nèi)應(yīng)該是固定的) 我用的是XP SP3,本機(jī)VISTA下地址和XP就不一樣了,如何做到宇宙通用版的函數(shù)地址?這個(gè)是shellcode的高級(jí)技術(shù),我只聽(tīng)說(shuō)過(guò),等以后認(rèn)真學(xué)習(xí)了匯編再嘗試下,呵呵 - 如何找到這些函數(shù)的地址呢,我寫(xiě)了個(gè)程序: //address.cpp?
#include<iostream>?
#include<windows.h>?
using?namespace?std;?
-
typedef?void?(*MYPROC)(LPWSTR);?
int?main()?
{?
?????????char?adrStr[200];?
?????????HINSTANCE?LibHandle;?
?????????MYPROC?ProcAdd;?
-
????cout<<"???????????????????????????Function?Address?Hunter????????????"<<endl;?
?????????while(true)?
?????????{?
???????????????????cout<<"The?Dll?name:";?
???????????????????cin>>adrStr;?
???????????????????LibHandle?=?LoadLibraryA(adrStr);?
???????????????????cout<<LibHandle<<endl<<endl;?
???????????????????cout<<"Function?Name:";?
???????????????????cin>>adrStr;?
-
???????????????????while(strncmp(adrStr,"exit",4)?!=?0)?
???????????????????{?
??????????????????????????????????????ProcAdd?=?(MYPROC)GetProcAddress(LibHandle,adrStr);?
??????????????????????????????????????cout<<ProcAdd<<endl;?
??????????????????????????????????????cout<<"Function?Name:";?
??????????????????????????????????????cin>>adrStr;?
???????????????????}?
?????????}?????????
-
?????????return?0;?
}?
-
測(cè)試報(bào)告: VISTA下的 - - XP SP3下的: - - 地址還是不一樣的哈 對(duì)了,這個(gè)函數(shù)地址查詢你要確定函數(shù)所在的dll,其實(shí)這個(gè)還算簡(jiǎn)單,網(wǎng)上一搜就知道了 說(shuō)個(gè)比較特殊的 Memset這個(gè)函數(shù)是在ntdll中,比較例外的一個(gè) 找到了地址就成功了很多 我們可以把地址壓入棧,然后call地址就行了,相當(dāng)于調(diào)用了函數(shù) 但是函數(shù)的參數(shù)怎么得到,這是個(gè)問(wèn)題,而且涉及了很多調(diào)試的技巧… 下面虛擬個(gè)例子: 假設(shè)是Sleep(200) 這個(gè)函數(shù),首先分析Sleep在哪個(gè)dll 發(fā)現(xiàn)實(shí)在kernel32中,用上面的程序查找出Sleep的地址: 0x7C802446 參數(shù)怎么構(gòu)造的? 涉及匯編語(yǔ)言了,原理就是讀取最近壓入 的數(shù)據(jù) 所以你可以明白為什么函數(shù)的參數(shù)是從又向左壓入棧了…. 程序中的 Sleep(200); 現(xiàn)在替換掉: _asm { Push 200 Mov eax, 0x7C802446 Call eax } 隨便找個(gè)程序插入測(cè)試,完全可以通過(guò),這就是構(gòu)造參數(shù) 其實(shí)這中間過(guò)程也蠻復(fù)雜的,要注意各個(gè)寄存器的數(shù)值的變化,例如EIP,記錄程序執(zhí)行位置,ESP記錄堆棧頂,EAX記錄返回值等等 后面我還會(huì)用到EBP記錄這些地址數(shù)據(jù) - 額… 再接再厲,后面還有三篇要寫(xiě) - - --------------by?? NewSketcher Time :?? 080822??15:55
-
int?main()?
{?
LoadLibrary(“msvcrt.dll”);?
system(“command.com”);?
-
????return?0;?
}?
//這個(gè)是開(kāi)DOS窗口的代碼,沒(méi)什么普通,典型語(yǔ)法糖…..?
#include?<windows.h>?
#include?<winbase.h>?
-
typedef?void?(*MYPROC)(LPTSTR);????????//定義函數(shù)指針?
-
int?main()?
{?
HINSTANCE?LibHandle;?
MYPROC?ProcAdd;?
LibHandle?=?LoadLibrary(“msvcrt.dll”);?
ProcAdd?=?(MYPROC)?GetProcAddress(LibHandle,?"system");?//查找system函數(shù)地址?
(ProcAdd)?("command.com");??????????//其實(shí)就是執(zhí)行system(“command.com”)?
-
return?0;?
}? 這段代碼實(shí)現(xiàn)上面那段一樣的功能,但是語(yǔ)法糖成分少了許多… PS:這段代碼其實(shí)是有BUG的,我測(cè)試過(guò),壓入的數(shù)據(jù)有問(wèn)題,不應(yīng)該是字符串,應(yīng)該是付給它個(gè)正確的地址…. 仔細(xì)看下,應(yīng)該發(fā)現(xiàn)些許程序執(zhí)行的原理 - 任何程序代碼都是要壓入內(nèi)存的,ASM中是code segment 代碼段也是地址啊,所以調(diào)用函數(shù),就是call Call函數(shù)的地址而已,這是寫(xiě)把高級(jí)語(yǔ)言轉(zhuǎn)換成shellcode的基礎(chǔ) - - 現(xiàn)在轉(zhuǎn)向要分析的reverse.cpp 先分析出這個(gè)文件中調(diào)用的所有函數(shù): - 有這些個(gè)函數(shù): - - 自然每個(gè)函數(shù)對(duì)應(yīng)一個(gè)地址,明白windows一點(diǎn)原理的應(yīng)該知道,這些函數(shù)的地址是固定的(在各個(gè)版本系統(tǒng)內(nèi)應(yīng)該是固定的) 我用的是XP SP3,本機(jī)VISTA下地址和XP就不一樣了,如何做到宇宙通用版的函數(shù)地址?這個(gè)是shellcode的高級(jí)技術(shù),我只聽(tīng)說(shuō)過(guò),等以后認(rèn)真學(xué)習(xí)了匯編再嘗試下,呵呵 - 如何找到這些函數(shù)的地址呢,我寫(xiě)了個(gè)程序: //address.cpp?
#include<iostream>?
#include<windows.h>?
using?namespace?std;?
-
typedef?void?(*MYPROC)(LPWSTR);?
int?main()?
{?
?????????char?adrStr[200];?
?????????HINSTANCE?LibHandle;?
?????????MYPROC?ProcAdd;?
-
????cout<<"???????????????????????????Function?Address?Hunter????????????"<<endl;?
?????????while(true)?
?????????{?
???????????????????cout<<"The?Dll?name:";?
???????????????????cin>>adrStr;?
???????????????????LibHandle?=?LoadLibraryA(adrStr);?
???????????????????cout<<LibHandle<<endl<<endl;?
???????????????????cout<<"Function?Name:";?
???????????????????cin>>adrStr;?
-
???????????????????while(strncmp(adrStr,"exit",4)?!=?0)?
???????????????????{?
??????????????????????????????????????ProcAdd?=?(MYPROC)GetProcAddress(LibHandle,adrStr);?
??????????????????????????????????????cout<<ProcAdd<<endl;?
??????????????????????????????????????cout<<"Function?Name:";?
??????????????????????????????????????cin>>adrStr;?
???????????????????}?
?????????}?????????
-
?????????return?0;?
}?
-
測(cè)試報(bào)告: VISTA下的 - - XP SP3下的: - - 地址還是不一樣的哈 對(duì)了,這個(gè)函數(shù)地址查詢你要確定函數(shù)所在的dll,其實(shí)這個(gè)還算簡(jiǎn)單,網(wǎng)上一搜就知道了 說(shuō)個(gè)比較特殊的 Memset這個(gè)函數(shù)是在ntdll中,比較例外的一個(gè) 找到了地址就成功了很多 我們可以把地址壓入棧,然后call地址就行了,相當(dāng)于調(diào)用了函數(shù) 但是函數(shù)的參數(shù)怎么得到,這是個(gè)問(wèn)題,而且涉及了很多調(diào)試的技巧… 下面虛擬個(gè)例子: 假設(shè)是Sleep(200) 這個(gè)函數(shù),首先分析Sleep在哪個(gè)dll 發(fā)現(xiàn)實(shí)在kernel32中,用上面的程序查找出Sleep的地址: 0x7C802446 參數(shù)怎么構(gòu)造的? 涉及匯編語(yǔ)言了,原理就是讀取最近壓入 的數(shù)據(jù) 所以你可以明白為什么函數(shù)的參數(shù)是從又向左壓入棧了…. 程序中的 Sleep(200); 現(xiàn)在替換掉: _asm { Push 200 Mov eax, 0x7C802446 Call eax } 隨便找個(gè)程序插入測(cè)試,完全可以通過(guò),這就是構(gòu)造參數(shù) 其實(shí)這中間過(guò)程也蠻復(fù)雜的,要注意各個(gè)寄存器的數(shù)值的變化,例如EIP,記錄程序執(zhí)行位置,ESP記錄堆棧頂,EAX記錄返回值等等 后面我還會(huì)用到EBP記錄這些地址數(shù)據(jù) - 額… 再接再厲,后面還有三篇要寫(xiě) - - --------------by?? NewSketcher Time :?? 080822??15:55
轉(zhuǎn)載于:https://www.cnblogs.com/ns517/archive/2008/10/04/1303753.html
總結(jié)
以上是生活随笔為你收集整理的循环渐进NsDoor(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第3.4节 通过GPIB控制频谱仪
- 下一篇: 计算机360u盘删除,怎么关闭360U盘