久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ELF文件解析

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ELF文件解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • ELF文件解析
    • 1. 簡介
      • 1.1 分類
      • 1.2 作用
    • 2. 格式分析
      • 2.1 源碼
      • 2.2 ELF頭部
      • 2.3 Section
      • 2.4 字符串表
      • 2.5 符號表
      • 2.6 重定位
    • 3. 動態裝載與動態鏈接
      • 3.1 程序頭
        • 3.1.1 基地址
        • 3.1.2 段權限
        • 3.1.3 實例
      • 3.2 注釋段
      • 3.3 動態鏈接
        • 3.3.1 程序解析器
        • 3.3.2 動態鏈接器
        • 3.3.3 動態段
        • 3.3.4 共享目標的依賴關系
        • 3.3.5 全局偏移量表
        • 3.3.6 函數地址
        • 3.3.7 函數鏈接表
        • 3.3.8 解析符號
      • 3.4 哈希表
      • 3.5 初始化和終止函數

ELF文件解析

ELF(Executable and Linkable Format)是一種用于二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件的文件格式。

本文我們來解析一些ELF文件的具體格式信息。

1. 簡介

1.1 分類

ELF文件有四種類型:

  • 重定位文件(ET_REL),也就是常稱的目標文件,包含適合于與其他目標文件鏈接來創建可執行文件或者共享目標文件的代碼和數據。

  • 可執行文件(ET_EXEC),包含適合于執行的一個程序,此文件規定了exec() 如何創建一個程序的進程映像。

  • 共享目標文件(ET_DYN),即共享對象文件、動態庫文件, 包含可在兩種上下文中鏈接的代碼和數據。

    • 首先鏈接編輯器可以將它和其它可重定位文件和共享目標文件一起處理, 生成另外一個目標文件。
    • 其次動態鏈接器可能將它與某 個可執行文件以及其它共享目標一起組合,創建進程映像。
  • 核心轉儲文件(ET_CORE),包括程序運行的內存數據和代碼。

  • 除此之外還會有類型不確定的ELF文件(ET_NONE),即未知文件。

    1.2 作用

    ELF文件參與了二進制文件的兩個過程:

  • 鏈接。
  • 執行。
  • 所以可以從不同的角度來看待ELF格式的文件:

  • 如果用于編譯和鏈接(可重定位文件),則編譯器和鏈接器將把ELF文件看作是節頭表描述的節的集合(Section),程序頭表可選

  • 如果用于加載執行(可執行文件),則加載器則將把ELF文件看作是程序頭表描述的段的集合(Segment),一個段可能包含多個節,節頭表可選

  • 如果是共享文件,則兩者都含有。

  • 所以ELF文件的大致結構可以視為如下:

    鏈接視圖執行視圖
    ELF文件頭部ELF文件頭部
    程序頭部表(可選)程序頭部表
    Section 1Segment 1
    Section ...
    Section NSegment 2
    Section ...
    Section ...Segment ...
    節區頭部表節區頭部表(可選)

    對于程序頭部表和節區頭部表來說:

  • 程序頭部表(Program Header Table) : 如果存在的話,告訴系統如何創建進程映像。
  • 節區頭部表(Section Header Table) :如果存在的話,包含了描述文件節區的信息,比如大小、偏移等。
  • 如下我們可以看到Section和Segment的對應關系(Section to Segment mapping):

    $ readelf -l helloElf file type is DYN (Shared object file) Entry point 0x1060 There are 13 program headers, starting at offset 64Program Headers:Type Offset VirtAddr PhysAddrFileSiz MemSiz Flags AlignPHDR 0x0000000000000040 0x0000000000000040 0x00000000000000400x00000000000002d8 0x00000000000002d8 R 0x8INTERP 0x0000000000000318 0x0000000000000318 0x00000000000003180x000000000000001c 0x000000000000001c R 0x1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD 0x0000000000000000 0x0000000000000000 0x00000000000000000x00000000000005f8 0x00000000000005f8 R 0x1000LOAD 0x0000000000001000 0x0000000000001000 0x00000000000010000x00000000000001f5 0x00000000000001f5 R E 0x1000LOAD 0x0000000000002000 0x0000000000002000 0x00000000000020000x0000000000000160 0x0000000000000160 R 0x1000LOAD 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000258 0x0000000000000260 RW 0x1000DYNAMIC 0x0000000000002dc8 0x0000000000003dc8 0x0000000000003dc80x00000000000001f0 0x00000000000001f0 RW 0x8NOTE 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8NOTE 0x0000000000000358 0x0000000000000358 0x00000000000003580x0000000000000044 0x0000000000000044 R 0x4GNU_PROPERTY 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8GNU_EH_FRAME 0x0000000000002014 0x0000000000002014 0x00000000000020140x0000000000000044 0x0000000000000044 R 0x4GNU_STACK 0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000 RW 0x10GNU_RELRO 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000248 0x0000000000000248 R 0x1Section to Segment mapping:Segment Sections...00 01 .interp 02 .interp .note.gnu.property .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 03 .init .plt .plt.got .plt.sec .text .fini 04 .rodata .eh_frame_hdr .eh_frame 05 .init_array .fini_array .dynamic .got .data .bss 06 .dynamic 07 .note.gnu.property 08 .note.gnu.build-id .note.ABI-tag 09 .note.gnu.property 10 .eh_frame_hdr 11 12 .init_array .fini_array .dynamic .got

    2. 格式分析

    2.1 源碼

    我們來準備一個最簡單的源碼:

    #include <stdio.h>int main(int argc, char* argv[]) {printf("hello world!\n");return 0; }

    分別將其編譯成為三種不同的文件:

  • gcc -g -c hello.c : 中間文件,生成hello.o。
  • gcc -g -o hello hello. : 編譯成可執行文件。
  • gcc -g -fPIC -o libhello.so -shared hello.c : 編譯成共享庫。
  • 2.2 ELF頭部

    ELF文件頭部定義如下:

    #define EI_NIDENT 16#define SHN_UNDEF 0typedef struct {unsigned char e_ident[EI_NIDENT];uint16_t e_type; //文件標識和類型信息(包括魔術)uint16_t e_machine; //適用的處理器體系結構uint32_t e_version; //目標文件的版本,EV_CURRENTElfN_Addr e_entry; //程序入口地址ElfN_Off e_phoff; //程序頭表(program header table)開始處在文件中的偏移量ElfN_Off e_shoff; //節頭表(section header table)開始處在文件中的偏移量uint32_t e_flags; //處理器特定的標志位uint16_t e_ehsize; // ELF 文件頭的大小,以字節為單位uint16_t e_phentsize; //程序頭表中每一個表項的大小,以字節為單位uint16_t e_phnum; //程序頭表中總共有多少個表項uint16_t e_shentsize; //節頭表中每一個表項的大小,以字節為單位uint16_t e_shnum; //節頭表中總共有多少個表項uint16_t e_shstrndx; //節頭表中與節名字表相對應的表項的索引。如果文件沒有節名字表,此值應設置為 SHN_UNDEF。 } ElfN_Ehdr;

    對于這個結構體的每個字段,我們可用在man(5)文檔中找到詳細信息,這里不再詳細介紹,使用readelf -h可用查看ELF的文件頭,如下:

    $ readelf -h hello ELF Header:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64Data: 2's complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: DYN (Shared object file)Machine: Advanced Micro Devices X86-64Version: 0x1Entry point address: 0x1060Start of program headers: 64 (bytes into file)Start of section headers: 16928 (bytes into file)Flags: 0x0Size of this header: 64 (bytes)Size of program headers: 56 (bytes)Number of program headers: 13Size of section headers: 64 (bytes)Number of section headers: 36Section header string table index: 35

    我們使用hexdump查看原始文件內容信息如下:

    $ hexdump -C -n 512 hello 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 20 42 00 00 00 00 00 00 |@....... B......| 00000030 00 00 00 00 40 00 38 00 0d 00 40 00 24 00 23 00 |....@.8...@.$.#.| 00000040 06 00 00 00 04 00 00 00 40 00 00 00 00 00 00 00 |........@.......| 00000050 40 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |@.......@.......| 00000060 d8 02 00 00 00 00 00 00 d8 02 00 00 00 00 00 00 |................| 00000070 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 |................| 00000080 18 03 00 00 00 00 00 00 18 03 00 00 00 00 00 00 |................| 00000090 18 03 00 00 00 00 00 00 1c 00 00 00 00 00 00 00 |................| 000000a0 1c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|

    2.3 Section

    ELF文件中的節是從編譯器鏈接角度來看文件的組成的。從鏈接器的角度上來看,包括指令、數據、符號以及重定位表等等。

    在ELF 文件頭中,有很多字段是描述Section頭的:

  • e_shoff成員給出節頭表在ELF文件中的位置,即相對于文件開始處的偏移量。
  • e_shnum成員指明節頭表中包含多少個表項。
  • e_shentsize成員指明了每一個表項的大小。
  • 某些表項的索引值被保留,有特殊的含義。 ELF 文件的節頭表中不會出現索引值為以下各值的表項:

    //SHN 大致是section indexes的簡寫/* special section indexes */ #define SHN_UNDEF 0 //一個未定義的、不存在的節的索引 #define SHN_LORESERVE 0xff00 //被保留索引號區間的下限 #define SHN_LOPROC 0xff00 //處理器定制節所保留的索引號區間的下限 #define SHN_HIPROC 0xff1f //處理器定制節所保留的索引號區間的上限 #define SHN_LIVEPATCH 0xff20 #define SHN_ABS 0xfff1 //此節中所定義的符號有絕對的值,這個值不會因重定位而改變 #define SHN_COMMON 0xfff2 //此節中所定義的符號是公共的 #define SHN_HIRESERVE 0xffff //被保留索引號區間的上限

    在程序的編譯鏈接過程中,編譯器將一個一個.o文件鏈接成一個可以執行的ELF文件的過程中,同時也生成了一個表。這個表記錄了各個Section所處的區域。在程序中,程序的section header有多個項,但是大小是一樣,結構定義如下:

    typedef struct {uint32_t sh_name; //名稱,字符串表的索引(偏移值 .shstrtab)uint32_t sh_type; //節類型, SHT_XXXuint64_t sh_flags; //節的讀寫執行屬性Elf64_Addr sh_addr; //映射地址,如果本節的內容需要映射到進程空間中去,此成員指定映射的起始地址;如果不需要映射,此值為 0。Elf64_Off sh_offset; //偏移uint64_t sh_size; //大小uint32_t sh_link; //此成員是一個索引值,指向節頭表中本節所對應的位置uint32_t sh_info; //此成員含有此節的附加信息uint64_t sh_addralign; //對齊字節uint64_t sh_entsize; //有一些節的內容是一張表,其中每一個表項的大小是固定的,比如符號表。對于這種表來說,本成員指定其每一個表項的大小。 } Elf64_Shdr;

    在這個結構體里面,sh_type和sh_flags代表節的類型和屬性,有如下定義

    /* sh_type */ #define SHT_NULL 0 //一個無效的節頭,它也沒有對應的節 #define SHT_PROGBITS 1 //此值表明本節所含有的信息是由程序定義的 #define SHT_SYMTAB 2 //完整符號表 #define SHT_STRTAB 3 //字符串表 #define SHT_RELA 4 //重定位節, 含有帶明確加數(addend)的重定位項(一般來說jmp指令需要跳過指令長度) #define SHT_HASH 5 //哈希表,所有參與動態連接的目標文件都必須要包含一個符號哈希表。 #define SHT_DYNAMIC 6 //動態連接信息 #define SHT_NOTE 7 //表明本節包含的信息用于以某種方式來標記本文件 #define SHT_NOBITS 8 //此值表明這一節的內容是空的,節并不占用實際的空間 #define SHT_REL 9 //無附加的重定位項 #define SHT_SHLIB 10 //保留值 #define SHT_DYNSYM 11 //動態鏈接符號表 #define SHT_NUM 12 #define SHT_LOPROC 0x70000000 //為特殊處理器保留的節類型索引值的下邊界 #define SHT_HIPROC 0x7fffffff //為特殊處理器保留的節類型索引值的上邊界 #define SHT_LOUSER 0x80000000 //為應用程序保留節類型索引值的下邊界 #define SHT_HIUSER 0xffffffff //為應用程序保留節類型索引值的下邊界/* sh_flags */ #define SHF_WRITE 0x1 //本節所包含的內容在進程運行過程中是可寫的 #define SHF_ALLOC 0x2 //表示本節內容在進程運行過程中要占用內存單元(并不是所有節都會占用實際的內存,有一些起控制作用的節,在目標文件映射到進程空間時,并不需要占用內存) #define SHF_EXECINSTR 0x4 //表示此節內容是指令代碼

    此外對于Section header有兩個比較特殊的成員:

  • sh_link : 此成員是一個索引值,指向節頭表中本節所對應的位置。根據節的類型不同,本成員的意義也有所不同。
  • sh_info : 此成員含有此節的附加信息,根據節的類型不同,本成員的意義也有所不同。
  • 對于某些節類型來說,sh_link和sh_info含有特殊的信息,見下表。

    sh_typesh_linksh_info
    SHT_DYNAMIC用于本節中項目的字符串表在節頭表中相應的索引值0
    SHT_HASH用于本節中哈希表的符號表在節頭表中相應的索引值0
    SHT_REL /SHT_RELA相應符號表在節頭表中的索引值本重定位節所應用到目標節在節頭表中的索引值
    SHT_SYMTAB / SHT_DYNSYM相關字符串表的節頭索引符號表中最后一個本地符號的索引值加 1
    其它SHN_UNDEF0

    Section 通過偏移和大小來確定具體信息,同樣使用readelf -t我們可用查看所有section 頭部數組的結構,如下:

    $ readelf -t hello There are 36 section headers, starting at offset 0x4220:Section Headers:[Nr] NameType Address Offset LinkSize EntSize Info AlignFlags[ 0] NULL 0000000000000000 0000000000000000 00000000000000000 0000000000000000 0 0[0000000000000000]: [ 1] .interpPROGBITS 0000000000000318 0000000000000318 0000000000000001c 0000000000000000 0 1[0000000000000002]: ALLOC[ 2] .note.gnu.propertyNOTE 0000000000000338 0000000000000338 00000000000000020 0000000000000000 0 8[0000000000000002]: ALLOC

    同樣我們知道在Section header在文件中的偏移(ELF文件頭部有結構),可用查看數據如下:

    $ hexdump -C -n 512 -s 0x4220 hello 00004220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00004260 1b 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 |................| 00004270 18 03 00 00 00 00 00 00 18 03 00 00 00 00 00 00 |................| 00004280 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00004290 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000042a0 23 00 00 00 07 00 00 00 02 00 00 00 00 00 00 00 |#...............| 000042b0 38 03 00 00 00 00 00 00 38 03 00 00 00 00 00 00 |8.......8.......| 000042c0 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ...............| 000042d0 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000042e0 36 00 00 00 07 00 00 00 02 00 00 00 00 00 00 00 |6...............| 000042f0 58 03 00 00 00 00 00 00 58 03 00 00 00 00 00 00 |X.......X.......| 00004300 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |$...............| 00004310 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00004320 49 00 00 00 07 00 00 00 02 00 00 00 00 00 00 00 |I...............| 00004330 7c 03 00 00 00 00 00 00 7c 03 00 00 00 00 00 00 ||.......|.......| 00004340 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ...............| 00004350 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00004360 57 00 00 00 f6 ff ff 6f 02 00 00 00 00 00 00 00 |W......o........| 00004370 a0 03 00 00 00 00 00 00 a0 03 00 00 00 00 00 00 |................| 00004380 24 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 |$...............| 00004390 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000043a0 61 00 00 00 0b 00 00 00 02 00 00 00 00 00 00 00 |a...............| 000043b0 c8 03 00 00 00 00 00 00 c8 03 00 00 00 00 00 00 |................| 000043c0 a8 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 |................| 000043d0 08 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00 |................| 000043e0 69 00 00 00 03 00 00 00 02 00 00 00 00 00 00 00 |i...............| 000043f0 70 04 00 00 00 00 00 00 70 04 00 00 00 00 00 00 |p.......p.......| 00004400 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

    因為Elf64_Shdr的大小為0x40,所以我們可用看一下幾個Section:

  • 00004260 1b 00 00 00.
  • 000042a0 23 00 00 00.
  • 000042e0 36 00 00 00.
  • 00004320 49 00 00 00.
  • 這些值都是對應的uint32_t sh_name成員在文件中的值。因為對于section的名稱,有專門的section 來記錄,索引為uint16_t e_shstrndx;,因此我們可用找到這個Section的具體內容如下:

    $ hexdump -C -n 512 -s 0x40c3 hello 000040c3 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 |..symtab..strtab| 000040d3 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte| 000040e3 72 70 00 2e 6e 6f 74 65 2e 67 6e 75 2e 70 72 6f |rp..note.gnu.pro| 000040f3 70 65 72 74 79 00 2e 6e 6f 74 65 2e 67 6e 75 2e |perty..note.gnu.| 00004103 62 75 69 6c 64 2d 69 64 00 2e 6e 6f 74 65 2e 41 |build-id..note.A| 00004113 42 49 2d 74 61 67 00 2e 67 6e 75 2e 68 61 73 68 |BI-tag..gnu.hash| 00004123 00 2e 64 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 |..dynsym..dynstr| 00004133 00 2e 67 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 |..gnu.version..g| 00004143 6e 75 2e 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 |nu.version_r..re| 00004153 6c 61 2e 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 |la.dyn..rela.plt| 00004163 00 2e 69 6e 69 74 00 2e 70 6c 74 2e 67 6f 74 00 |..init..plt.got.| 00004173 2e 70 6c 74 2e 73 65 63 00 2e 74 65 78 74 00 2e |.plt.sec..text..| 00004183 66 69 6e 69 00 2e 72 6f 64 61 74 61 00 2e 65 68 |fini..rodata..eh| 00004193 5f 66 72 61 6d 65 5f 68 64 72 00 2e 65 68 5f 66 |_frame_hdr..eh_f| 000041a3 72 61 6d 65 00 2e 69 6e 69 74 5f 61 72 72 61 79 |rame..init_array| 000041b3 00 2e 66 69 6e 69 5f 61 72 72 61 79 00 2e 64 79 |..fini_array..dy| 000041c3 6e 61 6d 69 63 00 2e 64 61 74 61 00 2e 62 73 73 |namic..data..bss| 000041d3 00 2e 63 6f 6d 6d 65 6e 74 00 2e 64 65 62 75 67 |..comment..debug| 000041e3 5f 61 72 61 6e 67 65 73 00 2e 64 65 62 75 67 5f |_aranges..debug_| 000041f3 69 6e 66 6f 00 2e 64 65 62 75 67 5f 61 62 62 72 |info..debug_abbr| 00004203 65 76 00 2e 64 65 62 75 67 5f 6c 69 6e 65 00 2e |ev..debug_line..| 00004213 64 65 62 75 67 5f 73 74 72 00 00 00 00 00 00 00 |debug_str.......| 00004223 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  • 00004260 1b 00 00 00 : 1b偏移處的名字為:.interp
  • 000042a0 23 00 00 00 : 23偏移處的名字為:.note.gnu.property
  • 000042e0 36 00 00 00 : 23偏移處的名字為:.note.gnu.build-id
  • 00004320 49 00 00 00 : 49偏移處的名字為:.note.ABI-tag
  • 和Section 頭部完全匹配,如下:

    $ readelf -t hello There are 36 section headers, starting at offset 0x4220:Section Headers:[Nr] NameType Address Offset LinkSize EntSize Info AlignFlags[ 0] NULL 0000000000000000 0000000000000000 00000000000000000 0000000000000000 0 0[0000000000000000]: [ 1] .interpPROGBITS 0000000000000318 0000000000000318 0000000000000001c 0000000000000000 0 1[0000000000000002]: ALLOC[ 2] .note.gnu.propertyNOTE 0000000000000338 0000000000000338 00000000000000020 0000000000000000 0 8[0000000000000002]: ALLOC[ 3] .note.gnu.build-idNOTE 0000000000000358 0000000000000358 00000000000000024 0000000000000000 0 4[0000000000000002]: ALLOC[ 4] .note.ABI-tagNOTE 000000000000037c 000000000000037c 00000000000000020 0000000000000000 0 4[0000000000000002]: ALLOC

    因此這里我們也知道uint32_t sh_name是字符串表中的偏移值。

    2.4 字符串表

    字符串表是一個包含了若干以NULL結尾的字符序列,即字符串。在目標文件中這些字符串通常是符號的名字或者節的名字。在目標文件的其它部分中,當需要引用某個字符串時,只需要提供該字符串在字符串表中的序號即可。

    字符串表中的第一個字符串(序號為 NULL)永遠是空串,即NULL,它可以用于表示一個空的名字或者沒有名字。所以,字符串表的第一個字節是NULL。由于每一個字符串都是以NULL結尾,所以字符串表的最后一個字節也必然為NULL。

    字符串表也可以是空的,不含有任何字符串,這時,節頭中的 sh_size 成員必須是 0。

    一個目標文件中可能有多個字符串表,例如:

  • .shstrtab : Section的名字表。
  • .strtab : 普通字符串表。
  • .dynstr : 動態鏈接的字符串表。
  • 我們看一個.shstrtab字符串表的實例:

    $ hexdump -C -n 512 -s 0x40c3 hello 000040c3 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 |..symtab..strtab| 000040d3 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte| 000040e3 72 70 00 2e 6e 6f 74 65 2e 67 6e 75 2e 70 72 6f |rp..note.gnu.pro| 000040f3 70 65 72 74 79 00 2e 6e 6f 74 65 2e 67 6e 75 2e |perty..note.gnu.| 00004103 62 75 69 6c 64 2d 69 64 00 2e 6e 6f 74 65 2e 41 |build-id..note.A| 00004113 42 49 2d 74 61 67 00 2e 67 6e 75 2e 68 61 73 68 |BI-tag..gnu.hash| 00004123 00 2e 64 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 |..dynsym..dynstr|

    這個字符串表大致可用表示如下:

    序號(sh_name)字符串
    0x0NULL
    0x1.symtab
    0x9.strtab
    0x11.shstrtab
    0x1b.interp

    這里也可用看到序號(sh_name)其實就是字符串表中的偏移值。

    我們看一下一個字符串表的DUMP信息,如下:

    $ readelf -t hello There are 36 section headers, starting at offset 0x4220:Section Headers:[Nr] NameType Address Offset LinkSize EntSize Info AlignFlags[ 0] NULL 0000000000000000 0000000000000000 00000000000000000 0000000000000000 0 0[0000000000000000]: [ ...][34] .strtabSTRTAB 0000000000000000 0000000000003ec0 00000000000000203 0000000000000000 0 1[0000000000000000]: [35] .shstrtabSTRTAB 0000000000000000 00000000000040c3 0000000000000015a 0000000000000000 0 1[0000000000000000]:

    這里有兩個字符串表:

  • .strtab : 偏移為0x3ec0.
  • .shstrtab : 偏移為0x40c3.
  • dump的文件內容如下:

    $ hexdump -C -n 512 -s 0x3ec0 hello 00003ec0 00 63 72 74 73 74 75 66 66 2e 63 00 64 65 72 65 |.crtstuff.c.dere| 00003ed0 67 69 73 74 65 72 5f 74 6d 5f 63 6c 6f 6e 65 73 |gister_tm_clones| 00003ee0 00 5f 5f 64 6f 5f 67 6c 6f 62 61 6c 5f 64 74 6f |.__do_global_dto| 00003ef0 72 73 5f 61 75 78 00 63 6f 6d 70 6c 65 74 65 64 |rs_aux.completed| 00003f00 2e 37 39 37 30 00 5f 5f 64 6f 5f 67 6c 6f 62 61 |.7970.__do_globa| 00003f10 6c 5f 64 74 6f 72 73 5f 61 75 78 5f 66 69 6e 69 |l_dtors_aux_fini| 00003f20 5f 61 72 72 61 79 5f 65 6e 74 72 79 00 66 72 61 |_array_entry.fra| 00003f30 6d 65 5f 64 75 6d 6d 79 00 5f 5f 66 72 61 6d 65 |me_dummy.__frame| 00003f40 5f 64 75 6d 6d 79 5f 69 6e 69 74 5f 61 72 72 61 |_dummy_init_arra| 00003f50 79 5f 65 6e 74 72 79 00 68 65 6c 6c 6f 2e 63 00 |y_entry.hello.c.| 00003f60 5f 5f 46 52 41 4d 45 5f 45 4e 44 5f 5f 00 5f 5f |__FRAME_END__.__|$ hexdump -C -n 512 -s 0x40c3 hello 000040c3 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 |..symtab..strtab| 000040d3 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte| 000040e3 72 70 00 2e 6e 6f 74 65 2e 67 6e 75 2e 70 72 6f |rp..note.gnu.pro| 000040f3 70 65 72 74 79 00 2e 6e 6f 74 65 2e 67 6e 75 2e |perty..note.gnu.| 00004103 62 75 69 6c 64 2d 69 64 00 2e 6e 6f 74 65 2e 41 |build-id..note.A| 00004113 42 49 2d 74 61 67 00 2e 67 6e 75 2e 68 61 73 68 |BI-tag..gnu.hash| 00004123 00 2e 64 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 |..dynsym..dynstr| 00004133 00 2e 67 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 |..gnu.version..g| 00004143 6e 75 2e 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 |nu.version_r..re| 00004153 6c 61 2e 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 |la.dyn..rela.plt| 00004163 00 2e 69 6e 69 74 00 2e 70 6c 74 2e 67 6f 74 00 |..init..plt.got.|

    2.5 符號表

    目標文件中的符號表(symbol table)所包含的信息用于定位和重定位程序中的符號定義和引用。目標文件的其它部分通過一個符號在這個表中的索引值來使用該符號。索引值從 0 開始計數,但值為 0 的表項(即第一項)并沒有實際的意義,它表示未定義的符號。這里用常量 STN_UNDEF 來表示未定義的符號。

    一般來說,符號表包括兩個部分:

  • .dynsym : 使用的動態庫的符號。
  • .symtab : 可執行文件的所有符號,當然也包括.dynsym部分的符號。
  • 符號表項的定義格式如下:

    typedef struct {uint32_t st_name; //字符串表的索引(偏移),字符串表有節頭部指定下標Elf32_Addr st_value; //符號的值或者地址(重定位文件中是偏移)uint32_t st_size; //各種符號的大小各不相同,比如一個對象的大小就是它實際占用的字節數。如果一個符號的大小為 0 或者大小未知,則這個值為 0。unsigned char st_info; //符號的類型和屬性unsigned char st_other; //本數據成員目前暫未使用,在目標文件中一律賦值為 0uint16_t st_shndx; //相關聯的節(符號在那個節中的索引) } Elf32_Sym;typedef struct {uint32_t st_name;unsigned char st_info;unsigned char st_other;uint16_t st_shndx;Elf64_Addr st_value;uint64_t st_size; } Elf64_Sym;

    對于st_value的值,沒有固定的類型,它可能代表一個數值,也可以是一個地址,具體是什么要看上下文。對于不同的目標文件類型,符號表項的 st_value 的含義略有不同:

    • 在重定位文件中,如果一個符號對應的節的索引值是SHN_COMMON, st_value值是這個節內容的字節對齊數。
    • 在重定位文件中,如果一個符號是已定義的,那么它的st_value值是該符號的起始地址在其所在節中的偏移量,而其所在的節的索引由st_shndx給出。
    • 在可執行文件和共享庫文件中, st_value不再是一個節內的偏移量,而是一個虛擬地址,直接指向符號所在的內存位置。這種情況下, st_shndx就不再需要了。

    對于符號成員st_info比較重要,由一系列的比特位構成,標識了“符號綁定(symbol binding)”、“符號類型(symbol type)”和“符號信息(symbol infomation)”三種屬性。下面幾個宏分別用于讀取這三種屬性值。

    #define ELF_ST_BIND(x) ((x) >> 4) #define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)#define ELF32_ST_BIND(x) ELF_ST_BIND(x) #define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)#define ELF64_ST_BIND(x) ELF_ST_BIND(x) #define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)

    符號綁定(Symbol Binding),符號綁定屬性由ELF32_ST_BIND指定,如下:

    名字值
    STB_LOCAL0
    STB_GLOBAL1
    STB_WEAK2
    STB_LOPROC13
    STB_HIPROC15
  • STB_LOCAL : 表明本符號是一個本地符號。它只出現在本文件中,在本文件外該符號無效。所以在不同的文件中可以定義相同的符號名,它們之間不會互相影響(類似Static 函數)。
  • STB_GLOBAL : 表明本符號是一個全局符號。當有多個文件被連接在一起時,在所有文件中該符號都是可見的。正常情況下,在一個文件中定義的全局符號,一定是在其它文件中需要被引用,否則無須定義為全局。
  • STB_WEAK : 類似于全局符號,但是相對于 STB_GLOBAL,它們的優先級更低。 全局符號(global symbol)和弱符號(weak symbol)在以下兩方面有區別:
    • 當連接編輯器把若干個可重定位目標文件連接起來時,同名的STB_GLOBAL 符號不允許出現多次。而如果在一個目標文件中已經定義了一個全局的符號(global symbol),當一個同名的弱符號(weak symbol)出現時,并不會發生錯誤。連接編輯器會以全局符號為準,忽略弱符號。與全局符號相似,如果已經存在的是一個公用符號,即 st_shndx 域為SHN_COMMON 值的符號,當一個同名的弱符號(weak symbol)出現時,也不會發生錯誤。連接編輯器會以公用符號為準,忽略弱符號。
    • 在查找符號定義時,連接編輯器可能會搜索存檔的庫文件。如果是查找全局符號,連接編輯器會提取包含該未定義的全局符號的存檔成員,存檔成員可能是一個全局的符號,也可能是弱符號;而如果是查找弱符號,連接編輯器不會去提取存檔成員。未解析的弱符號值為 0。
  • 符號類型(Symbol Types),符號類型屬性由ELF32_ST_TYPE指定,如下:

    名字值
    STT_NOTYPE0
    STT_OBJECT1
    STT_FUNC2
    STT_SECTION3
    STT_FILE4
    STT_LOPROC13
    STT_HIPROC15
  • STT_NOTYPE : 本符號類型未指定。
  • STT_OBJECT : 本符號是一個數據對象,比如變量、數組等。
  • STT_FUNC : 本符號是一個函數,或者其它的可執行代碼。函數符號在共享目標文件中有特殊的意義。當另外一個目標文件引用一個共享目標文件中的函數符號時,連接編輯器為被引用符號自動創建一個連接表項。非 STT_FUNC類型的共享目標符號不會通過這種連接表項被自動引用。
  • STT_SECTION : 本符號與一個節相關聯,用于重定位,通常具有 STB_LOCAL 屬性。
  • STT_FILE : 本符號是一個文件符號,它具有 STB_LOCAL 屬性,它的節索引值是SHN_ABS。在符號表中如果存在本類符號的話,它會出現在所有STB_LOCAL 類符號的前部。
  • 此外還有個st_shndx也是比較重要,任何一個符號表項的定義都與某一個“節”相聯系,因為符號是為節而定義,在節中被引用。st_shndx數據成員即指明了相關聯的節。本數據成員是一個索引值,它指向相關聯的節在節頭表中的索引。在重定位過程中,節的位置會改變,本數據成員的值也隨之改變,繼續指向節的新位置。當本數據成員指向下面三種特殊的節索引值時,本符號具有如下特別的意義:

  • SHN_ABS : 符號的值是絕對的,具有常量性,在重定位過程中,此值不需要改變。
  • SHN_COMMON : 本符號所關聯的是一個還沒有分配的公共節,本符號的值規定了其內容的字節對齊規則,與 sh_addralign 相似。也就是說,連接器會為本符號分配存儲空間,而且其起始地址是向 st_value 對齊的。本符號的值指明了要分配的字節數。
  • SHN_UNDEF : 當一個符號指向第 1 節(SHN_UNDEF)時,表明本符號在當前目標文件中未定義,在連接過程中,連接器會找到此符號被定義的文件,并把這些文件連接在一起。本文件中對該符號的引用會被連接到實際的定義上去。
  • 我們可用使用readelf 和 objdump來查看符號信息,如下:

    $ readelf -s helloSymbol table '.dynsym' contains 7 entries:Num: Value Size Type Bind Vis Ndx Name0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable6: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2)Symbol table '.symtab' contains 70 entries:Num: Value Size Type Bind Vis Ndx Name0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000318 0 SECTION LOCAL DEFAULT 1 2: 0000000000000338 0 SECTION LOCAL DEFAULT 2 3: 0000000000000358 0 SECTION LOCAL DEFAULT 3 4: 000000000000037c 0 SECTION LOCAL DEFAULT 4 5: 00000000000003a0 0 SECTION LOCAL DEFAULT 5 6: 00000000000003c8 0 SECTION LOCAL DEFAULT 6 7: 0000000000000470 0 SECTION LOCAL DEFAULT 7 8: 00000000000004f2 0 SECTION LOCAL DEFAULT 8 9: 0000000000000500 0 SECTION LOCAL DEFAULT 9 10: 0000000000000520 0 SECTION LOCAL DEFAULT 10 11: 00000000000005e0 0 SECTION LOCAL DEFAULT 11 12: 0000000000001000 0 SECTION LOCAL DEFAULT 12 13: 0000000000001020 0 SECTION LOCAL DEFAULT 13 14: 0000000000001040 0 SECTION LOCAL DEFAULT 14 15: 0000000000001050 0 SECTION LOCAL DEFAULT 15 16: 0000000000001060 0 SECTION LOCAL DEFAULT 16 17: 00000000000011e8 0 SECTION LOCAL DEFAULT 17 18: 0000000000002000 0 SECTION LOCAL DEFAULT 18 19: 0000000000002014 0 SECTION LOCAL DEFAULT 19 20: 0000000000002058 0 SECTION LOCAL DEFAULT 20 21: 0000000000003db8 0 SECTION LOCAL DEFAULT 21 22: 0000000000003dc0 0 SECTION LOCAL DEFAULT 22 23: 0000000000003dc8 0 SECTION LOCAL DEFAULT 23 24: 0000000000003fb8 0 SECTION LOCAL DEFAULT 24 25: 0000000000004000 0 SECTION LOCAL DEFAULT 25 26: 0000000000004010 0 SECTION LOCAL DEFAULT 26 27: 0000000000000000 0 SECTION LOCAL DEFAULT 27 28: 0000000000000000 0 SECTION LOCAL DEFAULT 28 29: 0000000000000000 0 SECTION LOCAL DEFAULT 29 30: 0000000000000000 0 SECTION LOCAL DEFAULT 30 31: 0000000000000000 0 SECTION LOCAL DEFAULT 31 32: 0000000000000000 0 SECTION LOCAL DEFAULT 32 33: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c34: 0000000000001090 0 FUNC LOCAL DEFAULT 16 deregister_tm_clones35: 00000000000010c0 0 FUNC LOCAL DEFAULT 16 register_tm_clones36: 0000000000001100 0 FUNC LOCAL DEFAULT 16 __do_global_dtors_aux

    我們使用hexdump查看文件中符號的原始數據,如下:

    $ readelf -S hello There are 36 section headers, starting at offset 0x4220:Section Headers:[Nr] Name Type Address OffsetSize EntSize Flags Link Info Align[ 0] NULL 0000000000000000 000000000000000000000000 0000000000000000 0 0 0[ 1] .interp PROGBITS 0000000000000318 00000318000000000000001c 0000000000000000 A 0 0 1[ 2] .note.gnu.propert NOTE 0000000000000338 000003380000000000000020 0000000000000000 A 0 0 8[ 3] .note.gnu.build-i NOTE 0000000000000358 000003580000000000000024 0000000000000000 A 0 0 4[ 4] .note.ABI-tag NOTE 000000000000037c 0000037c0000000000000020 0000000000000000 A 0 0 4[ 5] .gnu.hash GNU_HASH 00000000000003a0 000003a00000000000000024 0000000000000000 A 6 0 8[ 6] .dynsym DYNSYM 00000000000003c8 000003c800000000000000a8 0000000000000018 A 7 1 8[ 7] .dynstr STRTAB 0000000000000470 000004700000000000000082 0000000000000000 A 0 0 1$ hexdump -C -n 512 -s 0x3c8 hello 000003c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000003d8 00 00 00 00 00 00 00 00 3d 00 00 00 20 00 00 00 |........=... ...| 000003e8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000003f8 0b 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 |................| 00000408 00 00 00 00 00 00 00 00 1f 00 00 00 12 00 00 00 |................| 00000418 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000428 59 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 |Y... ...........| 00000438 00 00 00 00 00 00 00 00 68 00 00 00 20 00 00 00 |........h... ...| 00000448 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000458 10 00 00 00 22 00 00 00 00 00 00 00 00 00 00 00 |...."...........|$ objdump -s --section=.dynsym hellohello: file format elf64-x86-64Contents of section .dynsym:03c8 00000000 00000000 00000000 00000000 ................03d8 00000000 00000000 3d000000 20000000 ........=... ...03e8 00000000 00000000 00000000 00000000 ................03f8 0b000000 12000000 00000000 00000000 ................0408 00000000 00000000 1f000000 12000000 ................0418 00000000 00000000 00000000 00000000 ................0428 59000000 20000000 00000000 00000000 Y... ...........0438 00000000 00000000 68000000 20000000 ........h... ...0448 00000000 00000000 00000000 00000000 ................0458 10000000 22000000 00000000 00000000 ...."...........0468 00000000 00000000 ........

    2.6 重定位

    重定位(relocation)是把符號引用與符號定義連接在一起的過程。比如,當程序調用一個函數時,將從當前運行的指令跳轉到一個新的指令地址去執行。在編寫程序的時候,我們只需指明所要調用的函數名(即符號引用),在重定位的過程中,函數名會與實際的函數所在地址(即符號定義)聯系起來,使程序知道應該跳轉到哪里去。

    重定位文件必須知道如何修改其所包含的“節”的內容,在構建可執行文件或共享目標文件的時候,把節中的符號引用換成這些符號在進程空間中的虛擬地址。包含這些轉換信息的數據也就是“重定位項(relocation entries)”。

    重定位結構信息定義如下:

    typedef struct {Elf32_Addr r_offset; //重定位所作用的位置uint32_t r_info; } Elf32_Rel;typedef struct {Elf64_Addr r_offset;uint64_t r_info; } Elf64_Rel;Relocation structures that need an addend :typedef struct {Elf32_Addr r_offset;uint32_t r_info;int32_t r_addend; //額外的加數 } Elf32_Rela;typedef struct {Elf64_Addr r_offset;uint64_t r_info;int64_t r_addend; } Elf64_Rela;
  • r_offset : 給出重定位所作用的位置。對于重定位文件來說,此值是受重定位作用的存儲單元在節中的字節偏移量(相對節的偏移);對于可執行文件或共享目標文件來說,此值是受重定位作用的存儲單元的虛擬地址

  • r_info : 既給出了重定位所作用的符號表索引,也給出了重定位的類型。比如,如果是一個函數的重定位,本數據成員將要持有被調用函數所對應的符號表索引。如果索引值為 STN_UNDEF,即未定義索引,那么重定位過程中將使用 0 作為符號值。以下是應用于 r_info 的宏定義:

  • #define ELF32_R_SYM(x) ((x) >> 8) #define ELF32_R_TYPE(x) ((x) & 0xff)#define ELF64_R_SYM(i) ((i) >> 32) #define ELF64_R_TYPE(i) ((i) & 0xffffffff)
  • r_addend : 指定了一個加數,這個加數用于計算需要重定位的域的值。
  • 一個“重定位節(relocation section)”需要引用另外兩個節:一個是符號表節,一個是被修改節。在重定位節中,節頭的 sh_info 和 sh_link 成員分別指明了引用關系。不同的目標文件中,重定位項的r_offset成員的含義略有不同。

    • 在重定位文件中, r_offset成員含有一個節偏移量。也就是說,重定位節本身描述的是如何修改文件中的另一個節的內容,重定位偏移量(r_offset)指向了另一個節中的一個存儲單元地址。

    • 在可執行文件或共享目標文件中,r_offset含有的是符號定義在進程空間中的虛擬地址。可執行文件和共享目標文件是用于運行程序而不是構建程序的,所以對它們來說更有用的信息是運行期的內存虛擬地址,而不是某個符號定義在文件中的位置。

    綜上所述,鏈接器可用通過這個節里面的內容找到:

  • 需要重定位的文件地址。
  • 需要重定位的鏈接符號。
  • 而對于動態裝載器,可以通過這個段里面的內容找到:

  • 需要重定位的虛擬地址。
  • 需要重定位的動態符號。
  • 因此就可用在其他目標文件中找到相應的符號進行重定位,舉個鏈接文件的例子:

    //file1.c void fun();void _start() {fun(); }//file2.c void fun() { }

    我們對這兩個文件進行編譯:

    $ gcc -g -c -O0 file1.c $ gcc -g -c -O0 file2.c $ gcc -g -nostdlib file1.o file2.o -o file.o

    對于file1.o 我們可用看到信息如下:

    $ readelf -r file1.oRelocation section '.rela.text' at offset 0x3b8 contains 1 entry:Offset Info Type Sym. Value Sym. Name + Addend 00000000000a 000f00000004 R_X86_64_PLT32 0000000000000000 fun - 4$ objdump -S file1.ofile1.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 <_start>: void fun();void _start() {0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbpfun();4: b8 00 00 00 00 mov $0x0,%eax9: e8 00 00 00 00 callq e <_start+0xe> }e: 90 nopf: 5d pop %rbp10: c3 retq

    偏移地址為00000000000a,以及符號名稱fun,這樣鏈接器就可用對其進行重定位了,結果如下:

    $ objdump -S file.ofile.o: file format elf64-x86-64Disassembly of section .text:00000000000002b1 <_start>: void fun();void _start() {2b1: 55 push %rbp2b2: 48 89 e5 mov %rsp,%rbpfun();2b5: b8 00 00 00 00 mov $0x0,%eax2ba: e8 03 00 00 00 callq 2c2 <fun> }2bf: 90 nop2c0: 5d pop %rbp2c1: c3 retq00000000000002c2 <fun>: void fun() {2c2: 55 push %rbp2c3: 48 89 e5 mov %rsp,%rbp }2c6: 90 nop2c7: 5d pop %rbp2c8: c3 retq

    對于動態加載器來說,重定位節是修改動態導入變量或者函數的地址的,如下:

    readelf -r helloRelocation section '.rela.dyn' at offset 0x520 contains 8 entries:Offset Info Type Sym. Value Sym. Name + Addend 000000003db8 000000000008 R_X86_64_RELATIVE 1140 000000003dc0 000000000008 R_X86_64_RELATIVE 1100 000000004008 000000000008 R_X86_64_RELATIVE 4008 000000003fd8 000100000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_deregisterTMClone + 0 000000003fe0 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __libc_start_main@GLIBC_2.2.5 + 0 000000003fe8 000400000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0 000000003ff0 000500000006 R_X86_64_GLOB_DAT 0000000000000000 _ITM_registerTMCloneTa + 0 000000003ff8 000600000006 R_X86_64_GLOB_DAT 0000000000000000 __cxa_finalize@GLIBC_2.2.5 + 0Relocation section '.rela.plt' at offset 0x5e0 contains 1 entry:Offset Info Type Sym. Value Sym. Name + Addend 000000003fd0 000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0$ objdump -s --section=.got hellohello: file format elf64-x86-64Contents of section .got:3fb8 c83d0000 00000000 00000000 00000000 .=..............3fc8 00000000 00000000 30100000 00000000 ........0.......3fd8 00000000 00000000 00000000 00000000 ................3fe8 00000000 00000000 00000000 00000000 ................3ff8 00000000 00000000 ........

    對于puts函數,重定位的地址為000000003fd0,這是一個虛擬地址,同樣我們通過名稱puts@GLIBC_2.2.5 + 0可以找到符號表對應的虛擬地址,填入地址000000003fd0就完成了整個重定位的過程。

    3. 動態裝載與動態鏈接

    可執行文件和共享目標文件(動態連接庫)是程序的靜態存儲形式。要執行一個程序,系統要先把相應的可執行文件和動態連接庫裝載到進程空間中,這樣形成一個可運行的進程的內存空間布局,也可以稱它為“進程鏡像”。一個已裝載完成的進程空間會包含多個不同的“段(segment)”,比如代碼段(text segment),數據段(data segment),堆棧段(stack
    segment)等等。

    準備一個程序的內存鏡像,可以大體上分為裝載和連接兩個步驟。

  • 把目標文件裝載入內存。
  • 解析目標文件中的符號引用
  • 3.1 程序頭

    一個可執行文件或共享目標文件的程序頭表(program header table)是一個數組,數組中的每一個元素稱為“程序頭(program header)”,每一個程序頭描述了一個“段(segment)”或者一塊用于準備執行程序的信息。一個目標文件中的“段(segment)”包含一個或者多個“節(section)”。程序頭只對可執行文件或共享目標文件有意義,對于其它類型的目標文件,該信息可以忽略。在目標文件的文件頭(elf header)中, e_phentsize 和 e_phnum 成員指定了程序頭的大小。

    program header table數據結構定義如下:

    /* These constants are for the segment types stored in the image headers */ #define PT_NULL 0 #define PT_LOAD 1 #define PT_DYNAMIC 2 #define PT_INTERP 3 #define PT_NOTE 4 #define PT_SHLIB 5 #define PT_PHDR 6 #define PT_TLS 7 /* Thread local storage segment */ #define PT_LOOS 0x60000000 /* OS-specific */ #define PT_HIOS 0x6fffffff /* OS-specific */ #define PT_LOPROC 0x70000000 #define PT_HIPROC 0x7fffffff #define PT_GNU_EH_FRAME 0x6474e550#define PT_GNU_STACK (PT_LOOS + 0x474e551)typedef struct {uint32_t p_type; //描述段的類型,或者如何解析本程序頭的信息uint32_t p_flags;Elf64_Off p_offset; //文件中的偏移Elf64_Addr p_vaddr; //在進程空間中虛擬地址Elf64_Addr p_paddr; //在進程空間中物理地址,不再可用uint64_t p_filesz; //文件大小uint64_t p_memsz; //內存大小uint64_t p_align; //內存對齊 } Elf64_Phdr;

    對于p_type,取值如下:

  • PT_NULL : 此類型表明本程序頭是未使用的,本程序頭內的其它成員值均無意義。具有此種類型的程序頭應該被忽略。
  • PT_LOAD : 此類型表明本程序頭指向一個可裝載的段。段的內容會被從文件中拷貝到內存中。如前所述,段在文件中的大小是 p_filesz,在內存中的大小是p_memsz。如果 p_memsz 大于 p_filesz,在內存中多出的存儲空間應填 0 補充。在程序頭表中,所有PT_LOAD類型的程序頭按照 p_vaddr 的值做升序排列。
  • PT_DYNAMIC : 此類型表明本段指明了動態連接的信息。
  • PT_INTERP : 本段指向了一個以NULL結尾的字符串,這個字符串是一個 ELF 解析器的路徑。這種段類型只對可執行程序有意義,當它出現在共享目標文件中時,是一個無意義的多余項。在一個 ELF 文件中它最多只能出現一次,而且必須出現在其它可裝載段的表項之前。
  • PT_NOTE : 本段指向了一個以NULL結尾的字符串,這個字符串包含一些附加的信息。
  • PT_SHLIB : 該段類型是保留的,而且未定義語法。 UNIX System V 系統上的應用程序不會包含這種表項。
  • PT_PHDR : 此類型的程序頭如果存在的話,它表明的是其自身所在的程序頭表在文件或內存中的位置和大小。這樣的段在文件中可以不存在,只有當所在程序頭表所覆蓋的段只是整個程序的一部分時,才會出現一次這種表項,而且這種表項一定出現在其它可裝載段的表項之前。
  • PT_LOPROC ~ PT_HIPROC : 類型值在這個區間的程序頭是為特定處理器保留的。
  • 3.1.1 基地址

    程序頭中出現的虛擬地址不能代表其相應的數據在進程內存空間中的虛擬地址。可執行文件中需要含有絕對的地址,比如變量地址,函數地址等,為了讓程序正確地執行,“段”中出現的虛擬地址必須在創建可執行程序時被重新計算。另一方面,出于 ELF 通用性的要求,目標文件的段中又不能出現絕對地址,其代碼是不應依賴于具體存儲位置的,即同一個段在被加載到兩個不同的進程中時,它的地址可能不同,但它的行為不能表現出不一樣。

    在被加載到進程空間里時,盡管“段”會被分配到一個不確定的地址,但是不同的段之間會有確定的“相對位置(relative position)”。也就是說,在目標文件中存儲的兩個段,它們的位置之間有多少偏移,當它們被加載到內存中時,這兩個段的位置之間仍然保持這么大的偏移(距離)。一個段在內存中的虛擬地址與其在目標文件中的地址一般是不相等的,它們之間會有一個偏移量,這個偏移量被稱為“基地址(base address)”,基地址的作用之一就是在動態連接過程中為程序重定位內存鏡像

    一個可執行文件或共享目標文件的基地址是在運行期間由以下三個值計算出來的:內存加載地址,最大頁面大小,程序可裝載段的最低地址。為計算基地址,首先找出類型為 PT_LOAD(即可加載)而且 p_vaddr(段地址)最低的那個段,把這個段在內存中的地址與最大頁面大小相除,得到一個段地址的余數;再把p_vaddr 與最大頁面大小相除,得到一個 p_vaddr 的余數。基地址就是段地址的余數與p_vaddr的余數之差。

    3.1.2 段權限

    雖然 ELF 文件格式中沒有規定,但是一個可執行程序至少會有一個可加載的段。當為可加載段創建內存鏡像時,系統會按照 p_flags 的指示給段賦予一定的權限。

    名字值含義
    PF_X0x1可執行
    PF_W0x2只寫
    PF_R0x4只讀
    PF_MASKPROC0xf0000000未指定

    具體定義值如下:

    /* These constants define the permissions on sections in the programheader, p_flags. */ #define PF_R 0x4 #define PF_W 0x2 #define PF_X 0x1

    3.1.3 實例

    我們看一個ELF文件的程序頭部信息,如下:

    $ readelf -l helloElf file type is DYN (Shared object file) Entry point 0x1060 There are 13 program headers, starting at offset 64Program Headers:Type Offset VirtAddr PhysAddrFileSiz MemSiz Flags AlignPHDR 0x0000000000000040 0x0000000000000040 0x00000000000000400x00000000000002d8 0x00000000000002d8 R 0x8INTERP 0x0000000000000318 0x0000000000000318 0x00000000000003180x000000000000001c 0x000000000000001c R 0x1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD 0x0000000000000000 0x0000000000000000 0x00000000000000000x00000000000005f8 0x00000000000005f8 R 0x1000LOAD 0x0000000000001000 0x0000000000001000 0x00000000000010000x00000000000001f5 0x00000000000001f5 R E 0x1000LOAD 0x0000000000002000 0x0000000000002000 0x00000000000020000x0000000000000160 0x0000000000000160 R 0x1000LOAD 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000258 0x0000000000000260 RW 0x1000DYNAMIC 0x0000000000002dc8 0x0000000000003dc8 0x0000000000003dc80x00000000000001f0 0x00000000000001f0 RW 0x8NOTE 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8NOTE 0x0000000000000358 0x0000000000000358 0x00000000000003580x0000000000000044 0x0000000000000044 R 0x4GNU_PROPERTY 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8GNU_EH_FRAME 0x0000000000002014 0x0000000000002014 0x00000000000020140x0000000000000044 0x0000000000000044 R 0x4GNU_STACK 0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000 RW 0x10GNU_RELRO 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000248 0x0000000000000248 R 0x1Section to Segment mapping:Segment Sections...00 01 .interp 02 .interp .note.gnu.property .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 03 .init .plt .plt.got .plt.sec .text .fini 04 .rodata .eh_frame_hdr .eh_frame 05 .init_array .fini_array .dynamic .got .data .bss 06 .dynamic 07 .note.gnu.property 08 .note.gnu.build-id .note.ABI-tag 09 .note.gnu.property 10 .eh_frame_hdr 11 12 .init_array .fini_array .dynamic .got

    在最后面,我們可用看到每一個段對應的節的關系,一個Segment包含多個Section。

    3.2 注釋段

    類型為 PT_NOTE 的段往往會包含類型為 SHT_NOTE 的節, SHT_NOTE 節可以為目標文件提供一些特別的信息,用于給其它的程序檢查目標文件的一致性和兼容性。這些信息我們稱為“注釋信息”,這樣的節稱為“注釋節(note section)”,所在的段即為“注釋段(note segment)”。注釋信息可以包含任意數量的“注釋項”,每一個注釋項是一個數組,數組的每一個成員大小為 4 字節,格式依目標處理器而定。下圖解釋了注釋信息是如何組織的,但這僅是一種參考,不是規范的一部分。

    內容(4字節)
    namesz
    descsz
    type
    name…
    desc…

    對于其中的每一個字段,含義分別如下:

  • namesz 和 name : Namesz 和 name 成對使用。 Namesz 是一個 4 字節整數,而 name 是一個以NULL結尾的字符串。 Namesz 是 name 字符串的長度。字符串 name 的內容是本項的所有者的名字。沒有正式的機制來避免名字沖突,一般按照慣例,系統提供商應把他們自己的名字寫進 name 項里,比如”XYZ Computer Company”。如果沒有名字
    的話, namesz 是 0。由于數組項的大小是向 4 字節對齊的,所以如果字符串長度不是整 4 字節的話,需要填 0 補位。如果有補位的話, namesz 只計字符串長度,不計所補的空位。

  • descsz 和 desc : Descsz 和 desc 也成對使用,它們的格式與 namesz/name 完全相同。不過,desc 的內容沒有任何規定、限制,甚至建議,它包含哪些信息完全是自由的。

  • type : 這個字段給出描述項(desc)的解釋,或者說是描述項的類型。每一個提供商都會定義自己的類型,所以同一類型值對于不同的提供商其解釋也是不同的。當一個程序讀取注釋信息的時候,它必須同時辨認出 name 和 type 才能理解 desc 的內容。

  • 下面我們看一下notes段的內容如下:

    $ readelf -n mainDisplaying notes found in: .note.ABI-tagOwner Data size DescriptionHNU 0x00000010 NT_VERSION (version)description data: 00 00 00 00 03 00 00 00 02 00 00 00 00 00 00 00Displaying notes found in: .note.gnu.build-idOwner Data size DescriptionGNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)Build ID: 6628b6f822b0c5175adbb067b53d66b4b4a806ba

    我們可用讀取一下原始內容如下:

    $ hexdump -C -s 0x254 -n 32 main 00000254 04 00 00 00 10 00 00 00 01 00 00 00 48 4e 55 00 |............HNU.| 00000264 00 00 00 00 03 00 00 00 02 00 00 00 00 00 00 00 |................| 00000274
  • namesz的值為0x4.
  • descsz的值為0x10.
  • typs的值為0x1.
  • name的值為HNU.
  • desc的值為00 00 00 00 03 00 00 00 02 00 00 00 00 00 00 00.
  • 上面的這些數據和使用命令readelf -n讀取出來的一致。

    3.3 動態鏈接

    動態鏈接也就是解析符號引用的過程,這個過程在進程初始化和進程運行期間都可能發生。

    3.3.1 程序解析器

    一個參與動態鏈接的可執行文件會包含一個類型為PT_INTERP的程序頭項。當執行一個程序的時候,系統函數exec(cmd)會被調用,在這個函數中,內核會去讀取這個PT_INTERP段,解析出其包含的一個路徑字符串,這個串指明了一個ELF程序解析器,系統會轉去初始化該解析器的進程鏡像。也就是,在這時系統會暫停原來的工作,不是用待執行文件的段內容去初始化進程空間,而是把進程空間暫時“借”給解析器程序使用。然后,解析器程序將從系統手中接過控制權繼續執行。

    例如,我們可用在ELF看到解析器如下:

    f$ file main main: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6628b6f822b0c5175adbb067b53d66b4b4a806ba, with debug_info, not stripped$ hexdump -C -s 0x238 -n 32 main 00000238 2f 6c 69 62 36 34 2f 6c 64 2d 6c 69 6e 75 78 2d |/lib64/ld-linux-| 00000248 78 38 36 2d 36 34 2e 73 6f 2e 32 00 04 00 00 00 |x86-64.so.2.....| 00000258

    解析器以兩種方式來接手系統的控制:

  • 第一種,解析器取得可執行文件的描述符,內容指針定位于文件開始處,解析器可以讀取并映射可執行程序的段到內存中。

  • 第二種,對于有些可執行文件格式,系統直接將文件內容載入內存,并不把其文件描述符給解析器。

  • 解析器可以是一個共享目標文件,也可以是一個可執行文件。

    • 一般情況下,解析器會是一個共享目標文件,并且其段內容是位置不相關的,所以在不同的進程中,它的地址會不一樣,系統會使用mmap(...)系統調用在動態段區域來為解析器創建段的鏡像。所以,一般情況下不用擔心解析器的段內容會與待執行文件的內容發生地址沖突。

    • 如果解析器是獨立的可執行文件,那么系統就要按照解析器程序的程序頭來加載它,在加載的時候就有可能與待執行文件的段相沖突,這種情況下由解析器來負責解決沖突。

    3.3.2 動態鏈接器

    當創建一個可執行文件時,如果依賴其它的動態鏈接庫,那么鏈接編輯器會在可執行文件的程序頭中加入一個PT_INTERP項,告訴系統這里需要使用動態鏈接器。

    可執行文件與動態鏈接器一起創建了進程的鏡像,這個過程包含以下活動:

    • 添加可執行文件的段到進程空間;
    • 添加共享目標文件的段到進程空間;
    • 為可執行文件和共享目標文件進行重定位;
    • 如果動態鏈接器使用了可執行文件的文件描述符,應關閉它;
    • 把控制權交給程序。

    鏈接編輯器也會為動態鏈接庫組織一些數據,以方便它的鏈接過程。在“程序頭”部分提到過,為了方便在運行的時候訪問,這些數據放在可裝載的段中。當然具體的數據格式是依處理器而不同的。

    • 類型為SHT_DYNAMIC的.dynamic 節中包含有很多種動態鏈接信息。在這個節的最開始處有一個結構,其中包含有其它動態鏈接信息的地址。
    • 類型為SHT_HASH的.hash節中含有符號哈希表。
    • 類型為SHT_PROGBITS的.got和.plt節各包含一張表。

    共享目標所占據的內存地址可能與文件程序頭表中所記錄的不同。在程序開始執行以前,動態鏈接器會為內存鏡像做重定位,更新絕對地址。當然,庫文件在被裝載時,如果其內存地址與其文件中描述的完全相同的話,那些引用它們的絕對地址就是對的,不需要更新。但事實上,這種情況很少發生。

    如果進程的環境變量中含有LD_BIND_NOW,而且其值不為空,那么動態連接器就要在程序開始運行之前把所有重定位都處理完。比如,在該環境變量為以下值時,動態連接器都需要這樣做:

    • LD_BIND_NOW = 1
    • LD_BIND_NOW = on
    • LD_BIND_NOW = off

    否則,如果LD_BIND_NOW沒有出現或者其值為空,動態鏈接器就可以把處理重定位的工作推后,即只有當一個符號被引用的時候才去重定位它。因為在程序運行過程中,有一些函數并不會被調用到,推后重定位是一種提高效率的方法,可以避免為這些函數做不必要的重定位。

    3.3.3 動態段

    如果一個目標文件參與動態鏈接的話,它的程序頭表中一定會包含一個類型為PT_DYNAMIC的表項,其所對應的段稱為動態段(dynamic segment),段的名字為.dynamic(也是.dynamic節)。動態段的作用是提供動態鏈接器所需要的信息,比如依賴于哪些共享目標文件、動態鏈接符號表的位置、動態鏈接重定位表的位置等等。這個動態段中包含有動態節,動態節由符號DYNAMIC所標記,它包含一個由如下結構體組成的數組。

    typedef struct {Elf32_Sword d_tag;union {Elf32_Word d_val;Elf32_Addr d_ptr;} d_un; } Elf32_Dyn; extern Elf32_Dyn _DYNAMIC[];typedef struct {Elf64_Sxword d_tag;union {Elf64_Xword d_val;Elf64_Addr d_ptr;} d_un; } Elf64_Dyn; extern Elf64_Dyn _DYNAMIC[];

    對于每一個這種類型的目標項,d_tag控制著對d_un的解析:

  • d_tag標記控制著對d_un的解析。
  • d_val類型為Elf32_Word/Elf64_Xword的目標項代表的是整型數。
  • d_ptr類型為Elf32_Addr/Elf64_Addr的目標項代表的是進程空間里的地址。目標項在文件中的地址與其在進程空間內的地址可能會不同。當系統解析到這個動態節中的地址時,動態鏈接器就可以根據文件地址和內存基地址來計算出實際的內存地址。
  • d_tag字段表示當前表項的具體類型,部分可選的枚舉值如下:

    #define DT_NULL 0 //用于標記_DYNAMIC 數組的結束 #define DT_NEEDED 1 //依賴庫, DT_STRTAB標記 #define DT_PLTRELSZ 2 //重定位項的總大小 #define DT_PLTGOT 3 //GOT表地址 #define DT_HASH 4 //哈希表地址 #define DT_STRTAB 5 //字符串表的地址 #define DT_SYMTAB 6 //符號表的地址 #define DT_RELA 7 //重定位表的地址 #define DT_RELASZ 8 //重定位表大小 #define DT_RELAENT 9 //重定位表項大小 #define DT_STRSZ 10 //字符串表大小 #define DT_SYMENT 11 //符號表項大小 #define DT_INIT 12 //初始化函數 #define DT_FINI 13 //析構函數 #define DT_SONAME 14 //別名索引 #define DT_RPATH 15 //RPATH #define DT_SYMBOLIC 16 #define DT_REL 17 #define DT_RELSZ 18 #define DT_RELENT 19 #define DT_PLTREL 20 #define DT_DEBUG 21 #define DT_TEXTREL 22 #define DT_JMPREL 23 #define DT_ENCODING 32

    各個字段解釋如下:

  • DT_NULL : 用于標記_DYNAMIC 數組的結束。
  • DT_NEEDED : 此元素指明了一個所需的庫的名字。不過此元素本身并不是一個字符串,它是一個指向由DT_STRTAB所標記的字符串表中的索引,在表中,此索引處是一個以NULL結尾的字符串,這個字符串就是庫的名字。在動態數組中可以包含若干個此類型的項,這些項出現的相對順序是不能隨意調換的。
  • DT_PLTRELSZ : 此元素含有與函數鏈接表相關的所有重定位項的總大小,以字節為單位。如果數組中有DT_JMPREL項的話,DT_PLTRELSZ也必須要有。
  • DT_PLTGOT : 此元素包含與函數鏈接表或全局偏移量表相應的地址。在Intel架構中,這一項的d_ptr成員給出全局偏移量表中第一項的地址。對于全局偏移量表(GOT)中前三項都是保留的,其中兩項用于持有函數鏈接表信息。
  • DT_HASH : 此元素含有符號哈希表的地址。這里所指的哈希表與DT_SYMTAB所指的哈希表是同一個。
  • DT_STRTAB : 此元素包含字符串表的地址,此表中包含符號名、庫名等等。
  • DT_SYMTAB :此元素包含符號表的地址。
  • DT_RELA : 此元素包含一個重定位表的地址,在重定位表中存儲的是顯式的加數。在一個目標文件中可以存在多個重定位節,當為可執行文件或共享目標文件創建重定位表的時候,鏈接器會把這些重定位節連接在一起,最后形成一張大的重定位表。當鏈接器為一個可執行文件創建進程空間,或者把一個共享目標添加到進程空間中去的時候,它會去讀重定位表并執行相應的操作。如果在動態結構中包含有DT_RELA元素的話,就必須同時還包含DT_RELASZ和DT_RELAENT元素。如果一個文件需要重定位的話,DT_RELA或DT_REL至少要出現一個。
  • DT_RELASZ : 此元素持有DT_RELA相應的重定位表的大小,以字節為單位。
  • DT_RELAENT : 此元素持有DT_RELA相應的重定位表項的大小,以字節為單位。
  • DT_STRSZ : 此元素持有字符串表的大小,以字節為單位。
  • DT_SYMENT : 此元素持有符號表項的大小,以字節為單位。
  • DT_INIT : 此元素持有初始化函數的地址。
  • DT_FINI : 此元素持有終止函數的地址。
  • DT_SONAME : 此元素持有一個字符串表中的偏移量,該位置存儲了一個以NULL結尾的字符串,是一個共享目標的名字。相應的字符串表由DT_STRTAB指定。
  • DT_RPATH : 此元素持有一個字符串表中的偏移量,該位置存儲了一個以NULL結尾的字符串,是一個用于搜索庫文件的路徑名。相應的字符串表由DT_STRTAB指定。
  • DT_SYMBOLIC : 在共享目標文件中,此元素的出現與否決定了動態鏈接器解析符號時所用的算法。如果此元素不出現的話,動態連接器先搜索可執行文件再搜索庫文件;如果此元素出現的話,順序剛好相反,動態鏈接器會先從本共享目標文件開始,后搜索可執行文件。
  • DT_REL : 此元素與 DT_RELA 相似,只是它所指向的重定位表中,“加數”是隱含的而不是顯式的。
  • DT_RELSZ : 此元素持有DT_REL相應的重定位表的大小,以字節為單位。
  • DT_RELENT : 此元素持有DT_REL相應的重定位表項的大小,以字節為單位。
  • DT_PLTREL : 本成員指明了函數連接表所引用的重定位項的類型。 d_val成員含有DT_REL或DT_RELA。函數連接表中的所有重定位類型都是相同的。
  • DT_TEXTREL : 如果此元素出現的話,在重定位過程中如果需要修改的是只讀段的話,鏈接器可以做相應的修改;而如果此元素不出現的話,在重定位過程中,即使需要,也不能修改只讀段。
  • DT_JMPREL : 此類型元素如果存在的話,其d_ptr成員含有與函數鏈接表單獨關聯的重定位項地址。把多個重定位項分開可以讓動態鏈接器在初始化的時候忽略它們,當然前提條件是“后期綁定”是激活的。如果此元素存在的話,DT_PLTRELSZ和DT_PLTREL也應該出現。
  • DT_BIND_NOW : 如果此元素存在的話,動態鏈接器必須在程序開始執行以前,完成所有包含此項的目標的重定位工作。如果此元素存在,即使程序應用了“后期綁定”,它對于此項所指定的目標也不適用,動態鏈接器仍需事先做好重定位。
  • 我們來看一下可執行文件動態段的解析過程,首先我們看到的程序頭部信息如下:

    $ readelf -l helloElf file type is DYN (Shared object file) Entry point 0x1060 There are 13 program headers, starting at offset 64Program Headers:Type Offset VirtAddr PhysAddrFileSiz MemSiz Flags AlignPHDR 0x0000000000000040 0x0000000000000040 0x00000000000000400x00000000000002d8 0x00000000000002d8 R 0x8INTERP 0x0000000000000318 0x0000000000000318 0x00000000000003180x000000000000001c 0x000000000000001c R 0x1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD 0x0000000000000000 0x0000000000000000 0x00000000000000000x00000000000005f8 0x00000000000005f8 R 0x1000LOAD 0x0000000000001000 0x0000000000001000 0x00000000000010000x00000000000001f5 0x00000000000001f5 R E 0x1000LOAD 0x0000000000002000 0x0000000000002000 0x00000000000020000x0000000000000160 0x0000000000000160 R 0x1000LOAD 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000258 0x0000000000000260 RW 0x1000DYNAMIC 0x0000000000002dc8 0x0000000000003dc8 0x0000000000003dc80x00000000000001f0 0x00000000000001f0 RW 0x8NOTE 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8NOTE 0x0000000000000358 0x0000000000000358 0x00000000000003580x0000000000000044 0x0000000000000044 R 0x4GNU_PROPERTY 0x0000000000000338 0x0000000000000338 0x00000000000003380x0000000000000020 0x0000000000000020 R 0x8GNU_EH_FRAME 0x0000000000002014 0x0000000000002014 0x00000000000020140x0000000000000044 0x0000000000000044 R 0x4GNU_STACK 0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000 RW 0x10GNU_RELRO 0x0000000000002db8 0x0000000000003db8 0x0000000000003db80x0000000000000248 0x0000000000000248 R 0x1Section to Segment mapping:Segment Sections...00 01 .interp 02 .interp .note.gnu.property .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 03 .init .plt .plt.got .plt.sec .text .fini 04 .rodata .eh_frame_hdr .eh_frame 05 .init_array .fini_array .dynamic .got .data .bss 06 .dynamic 07 .note.gnu.property 08 .note.gnu.build-id .note.ABI-tag 09 .note.gnu.property 10 .eh_frame_hdr 11 12 .init_array .fini_array .dynamic .got

    接著我們可以看到動態段的內容如下:

    $ objdump -s --section=.dynamic hellohello: file format elf64-x86-64Contents of section .dynamic:3dc8 01000000 00000000 01000000 00000000 ................3dd8 0c000000 00000000 00100000 00000000 ................3de8 0d000000 00000000 e8110000 00000000 ................3df8 19000000 00000000 b83d0000 00000000 .........=......3e08 1b000000 00000000 08000000 00000000 ................3e18 1a000000 00000000 c03d0000 00000000 .........=......3e28 1c000000 00000000 08000000 00000000 ................3e38 f5feff6f 00000000 a0030000 00000000 ...o............3e48 05000000 00000000 70040000 00000000 ........p.......3e58 06000000 00000000 c8030000 00000000 ................3e68 0a000000 00000000 82000000 00000000 ................3e78 0b000000 00000000 18000000 00000000 ................3e88 15000000 00000000 00000000 00000000 ................3e98 03000000 00000000 b83f0000 00000000 .........?......3ea8 02000000 00000000 18000000 00000000 ................3eb8 14000000 00000000 07000000 00000000 ................3ec8 17000000 00000000 e0050000 00000000 ................3ed8 07000000 00000000 20050000 00000000 ........ .......3ee8 08000000 00000000 c0000000 00000000 ................3ef8 09000000 00000000 18000000 00000000 ................3f08 1e000000 00000000 08000000 00000000 ................3f18 fbffff6f 00000000 01000008 00000000 ...o............3f28 feffff6f 00000000 00050000 00000000 ...o............3f38 ffffff6f 00000000 01000000 00000000 ...o............3f48 f0ffff6f 00000000 f2040000 00000000 ...o............3f58 f9ffff6f 00000000 03000000 00000000 ...o............3f68 00000000 00000000 00000000 00000000 ................3f78 00000000 00000000 00000000 00000000 ................3f88 00000000 00000000 00000000 00000000 ................3f98 00000000 00000000 00000000 00000000 ................3fa8 00000000 00000000 00000000 00000000 ................

    虛擬的偏移地址為3dc8,跟我們目標匹配,這里我們看一下DT_NEEDED的數據為:3dc8 01000000 00000000 01000000 00000000;可以知道為DT_STRTAB的索引1的位置,DT_STRTAB的數據如下:3e48 05000000 00000000 70040000 00000000

    查看表信息如下:

    $ objdump -s --section=.dynstr hellohello: file format elf64-x86-64Contents of section .dynstr:0470 006c6962 632e736f 2e360070 75747300 .libc.so.6.puts.0480 5f5f6378 615f6669 6e616c69 7a65005f __cxa_finalize._0490 5f6c6962 635f7374 6172745f 6d61696e _libc_start_main04a0 00474c49 42435f32 2e322e35 005f4954 .GLIBC_2.2.5._IT04b0 4d5f6465 72656769 73746572 544d436c M_deregisterTMCl04c0 6f6e6554 61626c65 005f5f67 6d6f6e5f oneTable.__gmon_04d0 73746172 745f5f00 5f49544d 5f726567 start__._ITM_reg04e0 69737465 72544d43 6c6f6e65 5461626c isterTMCloneTabl04f0 6500 e.

    注意,上面這些地址信息都是虛擬地址,并不是文件的偏移地址

    3.3.4 共享目標的依賴關系

    當動態鏈接器為一個目標文件創建內存段的時候,動態結構中的DT_NEEDED項會指明所依賴的庫,動態鏈接器會鏈接被引用的符號和它們所依賴的庫,這個過程會反復地執行,直到一個完整的進程鏡像被構建好。當解析一個符號引用的時候,動態鏈接器以一種“廣度優先”的算法來查找符號表。就是說,動態鏈接器首先查找可執行程序自己的符號表,然后是DT_NEEDED項所指明的庫的符號表,再接下來是下一層依賴庫的符號表,依次下去。共享目標文件必須是可讀的,其它權限沒有要求。

    即使一個共享目標在依賴關系中被引用多次,動態鏈接器也只會鏈接它一次。在依賴關系列表中的名字,即可以是DT_SONAME字符串,也可以是用于創建目標文件的共享目標文件的路徑名。

    如果一個共享目標名字中含有斜線(/)字符,比如/usr/lib/lib2或者directory/file,動態鏈接就直接把字符串作為路徑名。如果名字中沒有斜線,比如lib1,需要根據以下三種規則來查找庫文件:

  • 第一,動態數組標記DT_RPATH可能給出了一個含有一系列目錄名的字符串,各目錄名以冒號:相隔。比如,如果字符串是/home/dir/lib:/home/dir2/lib:,表明動態鏈接器的查找路徑依次是/home/dir/lib、 /home/dir2/lib和當前目錄。

  • 第二,進程的環境變量中會有一個LD_LIBRARY_PATH變量,它也含有一個目錄名列表,各目錄名以冒號:相隔,各目錄名列表以分號;相隔(LD_LIBRARY_PATH路徑的優先級要低于DT_RPATH所指明的路徑)。

  • 第三,如果如上兩組路徑都無法找到所要的庫,動態鏈接庫就搜索/usr/lib。

  • 3.3.5 全局偏移量表

    全局偏移量表(global offset table)在私有數據中包含絕對地址。出于方便共享和重用的考慮,目標文件中的很多內容是“位置無關”的,其映射到進程內存中的什么位置是不一定的,所以只適合使用相對地址,全局偏移量表是一個例外。

    總的來說,位置獨立的代碼不能含有絕對的虛擬地址。全局偏移量表選擇了在私有數據中含有絕對地址,這種辦法在沒有犧牲位置獨立性和可共享性的前提下保存了絕對地址。引用全局偏移量表的程序可以同時使用位置獨立的地址和絕對地址,把位置無關的引用重定向到絕對地址上去。

    如果一個程序要求直接訪問符號的絕對地址,那么這個符號在全局偏移量表中就必須有一個對應的項。可執行文件和共享目標文件有各自的全局偏移量表,所以一個符號的地址可能會出現在多個表中。動態鏈接器會在程序開始執行之前,處理好所有全局偏移量表的重定位工作,所以在程序執行的時候,可以保證所有這些符號都有正確的絕對地址。

    全局偏移量表的第 0 項是保留的,它用于持有動態結構的地址,由符號DYNAMIC引用。這樣,其它程序,比如動態鏈接器就可以直接找到其動態結構,而不用借助重定位項。這對于動態鏈接器來說尤為重要,因為它必須在不依賴于其它程序重定位其內存鏡像的情況下初始化自己。在 Intel 架構中,全局偏移量表中的第 1 項和第 2 項也是保留的,它們持有函數連接表的信息

    系統可能為同一個共享目標在不同的程序中選擇不同的段地址;甚至也可能每次為同一個程序選擇不同的地址。但是,在單次執行中,一旦一個進程的鏡像建立起來之后,直到程序退出,內存段的地址都不會再改變了。

    3.3.6 函數地址

    在可執行文件和共享目標文件中,當引用到同一個函數時,函數地址可能并不相同。在共享目標文件中,函數的地址被動態鏈接器正常地解析為它所在的虛擬地址。但在可執行文件中則不同,但可執行文件引用一個共享庫中的函數時,它不是直接指向函數的虛擬地址,而是被動態鏈接器定向到函數鏈接表中的一個表項。

    但是,這樣的話,來自可執行文件的函數地址和來自共享目標文件的同一函數地址就會不同,為了避免在比較兩個函數地址時出現這樣的邏輯錯誤,鏈接編輯器和動態鏈接器做了一些特別操作。當可執行文件引用一個在共享目標文件中定義的函數時,鏈接編輯器就把這個函數的函數鏈接表項的地址放到其相應的符號表項中去。動態鏈接器會特別對待這種符號表項。在可執行文件中,如果動態鏈接器查找一個符號時遇到了這種符號表項,就會按照以下規則行事:

  • 如果符號表項的st_shndx成員不是SHN_UNDEF,動態鏈接器就找到了一個符號的定義,把表項的st_value成員作為符號的地址。

  • 如果符號表項的st_shndx成員是SHN_UNDEF,并且符號類型是STT_FUNC, st_value成員又非0的話,動態鏈接器就認定這是一個特殊的項,把st_value成員作為符號的地址。

  • 否則,動態鏈接器認為這個符號是在可執行文件中未定義的。

  • 有些重定位與函數鏈接表項有關,這些表項用于給函數調用做定向,而不是引用函數地址。這種重定位不能像上面所描述的那樣,用特別的方式去處理函數地址,因為動態鏈接器不可以把函數鏈接表項重定向到它們自己。

    3.3.7 函數鏈接表

    全局偏移量表用于把位置獨立的地址重定向到絕對地址,與此功能類似,函數鏈接表(procedure linkage table)的作用是把位置獨立的函數調用重定向到絕對地址。鏈接編輯器不能解析函數在不同目標文件之間的跳轉,那么,它就把對其它目標文件中函數的調用重定向到一個函數鏈接表項中去。動態鏈接器決定目標的絕對地址,并且會相應地修改全局偏移量表的內存鏡像。這樣,動態鏈接器就可以在不犧牲位置無關性和代碼的可共享性條件下,實現到絕對地址的重定位。可執行文件和共享目標文件有各自的函數鏈接表。

    關于PLT和GOT的關系和動態解析的過程見其他分析文章。

    3.3.8 解析符號

    在以下的這些步驟中,動態鏈接器與程序合作來解析函數鏈接表和全局偏移量表中所有的符號引用。

  • 在一開始創建程序內存鏡像的時候,動態鏈接器把全局偏移量表中的第2和第3個表項設為特定值。

  • 如果函數連接表是位置獨立的,全局偏移量表的地址必須存儲在%ebx 中。進程空間中的每一個共享目標文件都有自己的函數連接表,每一個表都是用于本文件內的函數調用。那么,主調函數就要負責在調用函數連接表項之前設置全局偏移量表。

  • 環境變量LD_BIND_NOW可以改變動態連接器的行為,如果它的值為非NULL,動態連接器在傳遞控制權給程序之前會估計函數連接表項。否則,如果其值為NULL,這種估計仍然會進行,但并不是在初始化的時候,這個過程會被推后,直到在執行過程中,該函數連接表項被用到才開始。

    “延遲綁定/懶綁定” (lazy binding)一般來說都會提高應用程序的性能,因為這樣可以避免用不到的符號在動態連接過程中被解析。但是,在兩種情況下,延遲綁定的效果并不理想。

  • 第一種情況,如果對一個共享目標函數的第一次引用比其后的引用要花更多時間的話,在第一次引用時,程序就要暫停下來,由動態連接器去解析符號,如果應用程序對這種不可預知的暫停比較敏感的話,后期綁定就不適用。

  • 第二種情況,如果動態連接器解析一個符號失敗,程序將會被終止。如果沒有打開后期綁定的話,這一切都發生在程序實際得到控制權之前,進程將在初始化過程中被終止。而如果打開了后期綁定的話,錯誤會發生在程序運行過程中,如果應用程序對這種不可預知的錯誤敏感的話,后期綁定也不適用。

  • 3.4 哈希表

    一個 Elf32_Word 目標組成的哈希表支持符號表的訪問。下面表示一個哈希表的具體結構

    內容(4字節)
    nbucket
    nchain
    bucket[0]

    bucket[nbucket - 1]
    chain[0]

    chain[nchain - 1]

    Bucket 數組中含有 nbucket 個項, chain 數組中含有 nchain 個項,序號都從 0 開始。 Bucket 和 chain 中包含的都是符號表中的索引。符號表中的項數必須等于nchain,所以符號表中的索引號也可以用來索引 chain 表一個哈希數輸入一個符號名,輸出一個值用于計算 bucket 索引。如果給出一個符號名,經哈希函數計算得到值 x,那么 x%nbucket 是 bucket 表內的索引, bucket[x%nbucket]給出一個符號表的索引值 y, y 同時也是 chain 表內的索引值。如果符號表內索引值為 y 的元素并不是所要的,那么 chain[y]給出符號表中下一個哈希值相同的項的索引。如果所有哈希值相同的項都不是所要的,最后的一個 chain[y]將包含值STN_UNDEF,說明這個符號表中并不含有此符號。

    tatic unsigned elfhash(const char *_name) {const unsigned char *name = (const unsigned char *) _name;unsigned h = 0, g;while(*name) {h = (h << 4) + *name++;g = h & 0xf0000000;h ^= g;h ^= g >> 24;}return h; }static Elf32_Sym *soinfo_elf_lookup(struct soinfo *si, unsigned hash, const char *name) {Elf32_Sym *symtab = si->symtab;const char *strtab = si->strtab;unsigned n;for( n = si->bucket[hash % si->nbucket]; n != 0; n = si->chain[n] ) {Elf32_Sym *s = symtab + n;if( strcmp(strtab + s->st_name, name) == 0 ) {return s;}}return NULL; }

    3.5 初始化和終止函數

    當動態鏈接器構建好進程鏡像,并完成重定位后,每一個共享目標都有機會執行一些初始化代碼。所有共享目標的初始化都發生在程序開始執行前。

    一個目標的初始化代碼被執行以前,必須保證它所依賴的所有目標已經被初始化過。這里所說的“依賴”,即出現在動態結構的DT_NEEDED項里。如果兩個目標,它們互相依賴,或者彼此間的依賴關系構成環狀的話,哪個應該被先初始化,這里未作定義。例如:

  • 如果一個目標A依賴于另外一個目標B,而目標B又依賴于目標C的話。當需要對 做初始化時,應先遞規地初始化B和C,即先初始化 C,然后是,最后是A。

  • 如果一個目標A依賴于另處兩個目標B和C,而B和C之間沒有依賴關系的話,B和C誰先被初始化都可以。

  • 與初始化過程相似,每一個共享目標還可以有終止函數,將在進程準備終止的時候被調用。動態鏈接器調用終止函數的順序正好與初始化過程相反,如果一個目標沒有定義初始化函數的話,動態鏈接器應假設它有一個空的初始化函數并且被調用,并按照相反的順序來調用其終止函數。

    動態鏈接器必須保證,無論是初始化函數還是終止函數都不能被重復調用。共享目標把初始化和終止函數分別定義在動態結構的DT_INIT和DT_FINI項中,初始化和終止函數的代碼存放在.init 和.fini節中。

    我們看一下這兩個函數的尋找過程:

    $ objdump -s --section=.dynamic hellohello: file format elf64-x86-64Contents of section .dynamic:3dc8 01000000 00000000 01000000 00000000 ................3dd8 0c000000 00000000 00100000 00000000 ................3de8 0d000000 00000000 e8110000 00000000 ................3df8 19000000 00000000 b83d0000 00000000 .........=......3e08 1b000000 00000000 08000000 00000000 ................3e18 1a000000 00000000 c03d0000 00000000 .........=......3e28 1c000000 00000000 08000000 00000000 ................3e38 f5feff6f 00000000 a0030000 00000000 ...o............3e48 05000000 00000000 70040000 00000000 ........p.......3e58 06000000 00000000 c8030000 00000000 ................3e68 0a000000 00000000 82000000 00000000 ................3e78 0b000000 00000000 18000000 00000000 ................3e88 15000000 00000000 00000000 00000000 ................3e98 03000000 00000000 b83f0000 00000000 .........?......3ea8 02000000 00000000 18000000 00000000 ................3eb8 14000000 00000000 07000000 00000000 ................3ec8 17000000 00000000 e0050000 00000000 ................3ed8 07000000 00000000 20050000 00000000 ........ .......3ee8 08000000 00000000 c0000000 00000000 ................3ef8 09000000 00000000 18000000 00000000 ................3f08 1e000000 00000000 08000000 00000000 ................3f18 fbffff6f 00000000 01000008 00000000 ...o............3f28 feffff6f 00000000 00050000 00000000 ...o............3f38 ffffff6f 00000000 01000000 00000000 ...o............3f48 f0ffff6f 00000000 f2040000 00000000 ...o............3f58 f9ffff6f 00000000 03000000 00000000 ...o............3f68 00000000 00000000 00000000 00000000 ................3f78 00000000 00000000 00000000 00000000 ................3f88 00000000 00000000 00000000 00000000 ................3f98 00000000 00000000 00000000 00000000 ................3fa8 00000000 00000000 00000000 00000000 ................

    3dd8 0c000000 00000000 00100000 00000000 和 3de8 0d000000 00000000 e8110000 00000000 分別指示了.init 和.fini的初始化和終止函數,這兩個節的反匯編內容如下:

    $ objdump -d --section=.init hello hello: file format elf64-x86-64Disassembly of section .init:0000000000001000 <_init>:1000: f3 0f 1e fa endbr64 1004: 48 83 ec 08 sub $0x8,%rsp1008: 48 8b 05 d9 2f 00 00 mov 0x2fd9(%rip),%rax # 3fe8 <__gmon_start__>100f: 48 85 c0 test %rax,%rax1012: 74 02 je 1016 <_init+0x16>1014: ff d0 callq *%rax1016: 48 83 c4 08 add $0x8,%rsp101a: c3 retq $ objdump -d --section=.fini hello hello: file format elf64-x86-64Disassembly of section .fini:00000000000011e8 <_fini>:11e8: f3 0f 1e fa endbr64 11ec: 48 83 ec 08 sub $0x8,%rsp11f0: 48 83 c4 08 add $0x8,%rsp11f4: c3 retq

    總結

    以上是生活随笔為你收集整理的ELF文件解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    帮老师解开蕾丝奶罩吸乳网站 | 国产亚洲人成a在线v网站 | 无码人妻av免费一区二区三区 | 国内精品人妻无码久久久影院蜜桃 | 99久久精品无码一区二区毛片 | 亚洲成av人影院在线观看 | 国产色视频一区二区三区 | 亚洲经典千人经典日产 | 7777奇米四色成人眼影 | 国产超碰人人爽人人做人人添 | 亚洲自偷自拍另类第1页 | 蜜桃视频插满18在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 久久国产自偷自偷免费一区调 | 熟女体下毛毛黑森林 | 欧美日韩亚洲国产精品 | 精品久久久久久人妻无码中文字幕 | 精品乱子伦一区二区三区 | www一区二区www免费 | 人人妻人人澡人人爽欧美一区 | 亚洲欧美国产精品专区久久 | 2020久久香蕉国产线看观看 | 午夜福利不卡在线视频 | 一二三四在线观看免费视频 | 欧美成人高清在线播放 | 无码一区二区三区在线观看 | 亚洲精品综合五月久久小说 | 无码国内精品人妻少妇 | 亚洲国产精品无码一区二区三区 | 少妇性俱乐部纵欲狂欢电影 | 久久国产36精品色熟妇 | 日日天日日夜日日摸 | 亚洲色在线无码国产精品不卡 | √天堂资源地址中文在线 | 国产亚洲视频中文字幕97精品 | 国产精品亚洲专区无码不卡 | 性欧美videos高清精品 | 好爽又高潮了毛片免费下载 | 白嫩日本少妇做爰 | 国产午夜亚洲精品不卡 | 成人影院yy111111在线观看 | 成熟妇人a片免费看网站 | 在线精品国产一区二区三区 | 人妻体内射精一区二区三四 | 国产色xx群视频射精 | 精品国产成人一区二区三区 | 丝袜人妻一区二区三区 | 大乳丰满人妻中文字幕日本 | а天堂中文在线官网 | 久青草影院在线观看国产 | 精品国偷自产在线视频 | 一本大道伊人av久久综合 | 国产成人精品视频ⅴa片软件竹菊 | 国产亚洲精品久久久久久 | 俄罗斯老熟妇色xxxx | 2019午夜福利不卡片在线 | 无遮无挡爽爽免费视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 四虎永久在线精品免费网址 | 亚洲一区二区观看播放 | 亚洲日韩一区二区 | 波多野结衣 黑人 | 天天躁夜夜躁狠狠是什么心态 | 精品国产乱码久久久久乱码 | 久久精品国产一区二区三区肥胖 | 日本精品人妻无码77777 天堂一区人妻无码 | 99久久久国产精品无码免费 | 成人影院yy111111在线观看 | 蜜臀av无码人妻精品 | 亚洲性无码av中文字幕 | 兔费看少妇性l交大片免费 | 天堂一区人妻无码 | 18禁黄网站男男禁片免费观看 | 97夜夜澡人人双人人人喊 | 日产精品99久久久久久 | 成人无码影片精品久久久 | 国产成人人人97超碰超爽8 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品亚洲а∨无码播放麻豆 | 少妇邻居内射在线 | 乱人伦人妻中文字幕无码 | а√资源新版在线天堂 | 99久久亚洲精品无码毛片 | 无码人妻久久一区二区三区不卡 | 欧美日韩人成综合在线播放 | 蜜臀aⅴ国产精品久久久国产老师 | 自拍偷自拍亚洲精品被多人伦好爽 | 风流少妇按摩来高潮 | 久久久久免费看成人影片 | 亚洲乱码中文字幕在线 | 荡女精品导航 | 一本大道久久东京热无码av | 亚洲精品一区二区三区大桥未久 | 国产精品毛片一区二区 | 国产极品美女高潮无套在线观看 | 西西人体www44rt大胆高清 | 精品国精品国产自在久国产87 | www国产精品内射老师 | 无码福利日韩神码福利片 | 亚洲中文字幕无码一久久区 | 久久久久成人精品免费播放动漫 | 一个人看的视频www在线 | 久久久久久av无码免费看大片 | 成人av无码一区二区三区 | 亚洲区小说区激情区图片区 | 亚洲s色大片在线观看 | 高清国产亚洲精品自在久久 | 偷窥日本少妇撒尿chinese | 熟妇人妻无码xxx视频 | 久久亚洲中文字幕无码 | 国产又爽又黄又刺激的视频 | 欧美性猛交xxxx富婆 | 白嫩日本少妇做爰 | 人人妻人人澡人人爽人人精品浪潮 | 六月丁香婷婷色狠狠久久 | 成 人 网 站国产免费观看 | 乱码av麻豆丝袜熟女系列 | 欧美野外疯狂做受xxxx高潮 | 国产精品美女久久久网av | 嫩b人妻精品一区二区三区 | 亚洲精品一区二区三区在线观看 | 亚洲欧洲日本无在线码 | 真人与拘做受免费视频 | 欧美日韩视频无码一区二区三 | 久久久久久a亚洲欧洲av冫 | 男人扒开女人内裤强吻桶进去 | 激情五月综合色婷婷一区二区 | 久久国产精品精品国产色婷婷 | 成年美女黄网站色大免费视频 | 狂野欧美激情性xxxx | 精品偷自拍另类在线观看 | 装睡被陌生人摸出水好爽 | 色窝窝无码一区二区三区色欲 | 激情亚洲一区国产精品 | 国产乱子伦视频在线播放 | 3d动漫精品啪啪一区二区中 | 男人的天堂2018无码 | 国产精品无套呻吟在线 | 日韩亚洲欧美中文高清在线 | 国产成人综合色在线观看网站 | 在线亚洲高清揄拍自拍一品区 | 成年美女黄网站色大免费视频 | 成年美女黄网站色大免费视频 | 国产成人无码a区在线观看视频app | 国产一区二区三区精品视频 | 窝窝午夜理论片影院 | 欧美阿v高清资源不卡在线播放 | 亚洲 a v无 码免 费 成 人 a v | 女人被爽到呻吟gif动态图视看 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美日韩色另类综合 | 内射爽无广熟女亚洲 | 亚洲欧洲日本无在线码 | 国产精品久免费的黄网站 | 亚洲精品无码国产 | 日欧一片内射va在线影院 | 国产精品丝袜黑色高跟鞋 | 又粗又大又硬又长又爽 | 亚洲s码欧洲m码国产av | 国产一精品一av一免费 | 精品久久久久久亚洲精品 | 极品尤物被啪到呻吟喷水 | 无码人妻丰满熟妇区毛片18 | 综合人妻久久一区二区精品 | 国产成人一区二区三区在线观看 | 少妇人妻大乳在线视频 | 午夜福利不卡在线视频 | 樱花草在线社区www | 强奷人妻日本中文字幕 | 国产激情一区二区三区 | 影音先锋中文字幕无码 | 男人的天堂2018无码 | 国产亚洲精品久久久ai换 | 国产国产精品人在线视 | 国产无遮挡又黄又爽免费视频 | 国产电影无码午夜在线播放 | 久久精品中文字幕一区 | 久久天天躁夜夜躁狠狠 | 色综合久久久无码中文字幕 | 国产精品久久久久7777 | 精品人人妻人人澡人人爽人人 | 美女毛片一区二区三区四区 | 丁香花在线影院观看在线播放 | 日本饥渴人妻欲求不满 | 亚洲男人av香蕉爽爽爽爽 | 99精品无人区乱码1区2区3区 | 帮老师解开蕾丝奶罩吸乳网站 | 国产无遮挡又黄又爽又色 | 久久国产精品二国产精品 | 精品成在人线av无码免费看 | 欧美精品一区二区精品久久 | 国产无遮挡又黄又爽免费视频 | 国产 浪潮av性色四虎 | 午夜福利一区二区三区在线观看 | 午夜福利不卡在线视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美日韩视频无码一区二区三 | 亚洲成av人影院在线观看 | 天堂а√在线中文在线 | 欧美黑人性暴力猛交喷水 | 女人被男人爽到呻吟的视频 | 中文字幕无码日韩专区 | 思思久久99热只有频精品66 | 高中生自慰www网站 | 黑人粗大猛烈进出高潮视频 | 熟妇女人妻丰满少妇中文字幕 | 久久国语露脸国产精品电影 | 激情五月综合色婷婷一区二区 | 欧美性猛交xxxx富婆 | 蜜桃视频插满18在线观看 | 亚洲精品成a人在线观看 | 亚洲色偷偷偷综合网 | 高潮毛片无遮挡高清免费 | 欧美日韩一区二区三区自拍 | 一本大道久久东京热无码av | 国产真人无遮挡作爱免费视频 | 红桃av一区二区三区在线无码av | 在线看片无码永久免费视频 | 精品一区二区三区波多野结衣 | 中文字幕色婷婷在线视频 | 亚洲人成网站在线播放942 | 国产人妻人伦精品1国产丝袜 | 亚洲综合精品香蕉久久网 | 国精产品一品二品国精品69xx | 丝袜 中出 制服 人妻 美腿 | 人人妻人人澡人人爽人人精品 | 久久久无码中文字幕久... | 俺去俺来也在线www色官网 | 日韩精品成人一区二区三区 | 国产午夜无码精品免费看 | 日本欧美一区二区三区乱码 | 老熟女乱子伦 | 久久 国产 尿 小便 嘘嘘 | 午夜福利一区二区三区在线观看 | 国产艳妇av在线观看果冻传媒 | 久精品国产欧美亚洲色aⅴ大片 | 国产亚洲精品久久久久久久 | 日韩亚洲欧美中文高清在线 | 性啪啪chinese东北女人 | 国产精品美女久久久 | 国产女主播喷水视频在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 在线a亚洲视频播放在线观看 | 亚洲热妇无码av在线播放 | 久久精品人人做人人综合 | 久久久久se色偷偷亚洲精品av | 人人澡人人妻人人爽人人蜜桃 | 国产精品嫩草久久久久 | 国产人妻人伦精品 | 无码av岛国片在线播放 | 国产又粗又硬又大爽黄老大爷视 | 亚拍精品一区二区三区探花 | 日本xxxx色视频在线观看免费 | 国产在线无码精品电影网 | 六月丁香婷婷色狠狠久久 | 99久久久无码国产aaa精品 | 特级做a爰片毛片免费69 | 国产婷婷色一区二区三区在线 | 鲁大师影院在线观看 | 成人精品天堂一区二区三区 | 最近中文2019字幕第二页 | 亚洲色偷偷男人的天堂 | 国产精品美女久久久网av | 亚洲国产精品久久人人爱 | 东京热一精品无码av | 曰本女人与公拘交酡免费视频 | 天下第一社区视频www日本 | 正在播放老肥熟妇露脸 | 日韩成人一区二区三区在线观看 | 国产激情无码一区二区app | 亚洲精品午夜国产va久久成人 | 亚洲欧美国产精品专区久久 | 一个人免费观看的www视频 | 婷婷色婷婷开心五月四房播播 | 亚洲自偷自偷在线制服 | 无码人妻出轨黑人中文字幕 | 久久99精品国产麻豆蜜芽 | 丰满诱人的人妻3 | 东京无码熟妇人妻av在线网址 | 无人区乱码一区二区三区 | 天天做天天爱天天爽综合网 | 亚洲日本在线电影 | 国产午夜福利100集发布 | www国产亚洲精品久久久日本 | 国产精品va在线观看无码 | 无码午夜成人1000部免费视频 | 国产精品久免费的黄网站 | 曰韩少妇内射免费播放 | 久久国产精品萌白酱免费 | 午夜精品久久久久久久 | 免费看男女做好爽好硬视频 | 激情内射日本一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 丰满少妇人妻久久久久久 | 成熟妇人a片免费看网站 | 亚洲色www成人永久网址 | 国产精品久免费的黄网站 | 性欧美videos高清精品 | 久久成人a毛片免费观看网站 | 成人试看120秒体验区 | 久久精品国产99久久6动漫 | 亚洲色欲久久久综合网东京热 | 综合激情五月综合激情五月激情1 | 久久亚洲精品中文字幕无男同 | 曰韩无码二三区中文字幕 | 99久久99久久免费精品蜜桃 | 中文字幕 人妻熟女 | 搡女人真爽免费视频大全 | 欧美日本精品一区二区三区 | 亚洲精品一区二区三区四区五区 | 一本久道久久综合婷婷五月 | 国产香蕉97碰碰久久人人 | 亚洲精品久久久久久一区二区 | 国产激情无码一区二区 | 波多野结衣av在线观看 | 成人无码视频在线观看网站 | 色欲人妻aaaaaaa无码 | 日韩视频 中文字幕 视频一区 | 黄网在线观看免费网站 | 日本精品久久久久中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 久久综合九色综合欧美狠狠 | 亚洲综合久久一区二区 | 久久99精品久久久久久动态图 | 熟妇人妻无码xxx视频 | 国产精品久久久久影院嫩草 | 无码任你躁久久久久久久 | 成人精品视频一区二区三区尤物 | 人人澡人人妻人人爽人人蜜桃 | 国产精品亚洲专区无码不卡 | 国产电影无码午夜在线播放 | 国产亚洲人成a在线v网站 | 精品无人国产偷自产在线 | 久久无码人妻影院 | 欧美日韩一区二区三区自拍 | 亚洲精品一区二区三区大桥未久 | 亚洲成av人综合在线观看 | 国产乱人无码伦av在线a | 亚洲中文字幕在线观看 | 亚洲成av人片在线观看无码不卡 | 精品欧美一区二区三区久久久 | 欧美人与善在线com | 永久免费观看国产裸体美女 | 亚洲日韩乱码中文无码蜜桃臀网站 | 纯爱无遮挡h肉动漫在线播放 | 亚洲精品久久久久中文第一幕 | 日韩av无码一区二区三区不卡 | 激情国产av做激情国产爱 | 日本在线高清不卡免费播放 | 亚洲日韩av一区二区三区中文 | 国产又粗又硬又大爽黄老大爷视 | 天堂无码人妻精品一区二区三区 | 色五月五月丁香亚洲综合网 | 岛国片人妻三上悠亚 | www国产亚洲精品久久久日本 | 久久久久亚洲精品中文字幕 | 亚洲精品一区二区三区大桥未久 | 久久99精品久久久久久 | 成在人线av无码免观看麻豆 | 性开放的女人aaa片 | 亚洲中文字幕在线观看 | 丰满护士巨好爽好大乳 | 少妇无码一区二区二三区 | 全球成人中文在线 | 色五月五月丁香亚洲综合网 | 亚洲一区av无码专区在线观看 | 福利一区二区三区视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 国产女主播喷水视频在线观看 | 亚洲国产一区二区三区在线观看 | 久久综合九色综合欧美狠狠 | 无码av最新清无码专区吞精 | 无码午夜成人1000部免费视频 | 成人欧美一区二区三区黑人免费 | 东京热无码av男人的天堂 | 精品国产福利一区二区 | 性色av无码免费一区二区三区 | 成年美女黄网站色大免费全看 | 欧美日韩人成综合在线播放 | 欧美激情一区二区三区成人 | 成 人 网 站国产免费观看 | 国产在线精品一区二区三区直播 | 熟妇人妻中文av无码 | 亚洲精品综合一区二区三区在线 | 又湿又紧又大又爽a视频国产 | 狠狠色噜噜狠狠狠狠7777米奇 | 97色伦图片97综合影院 | 久久亚洲a片com人成 | 牛和人交xxxx欧美 | 爽爽影院免费观看 | 日本在线高清不卡免费播放 | 台湾无码一区二区 | 最新国产乱人伦偷精品免费网站 | 熟女少妇人妻中文字幕 | 亚洲精品国产品国语在线观看 | 国产精品.xx视频.xxtv | 爱做久久久久久 | 久久人人爽人人爽人人片av高清 | 亚洲色无码一区二区三区 | 国产精品丝袜黑色高跟鞋 | 久久午夜无码鲁丝片 | 国产亚av手机在线观看 | 日本又色又爽又黄的a片18禁 | 一个人免费观看的www视频 | 久久亚洲日韩精品一区二区三区 | 人妻插b视频一区二区三区 | 老子影院午夜精品无码 | 亚洲中文字幕va福利 | 夜夜影院未满十八勿进 | 国产国语老龄妇女a片 | 亚洲国产午夜精品理论片 | 久久久久99精品国产片 | 性色av无码免费一区二区三区 | 欧美性猛交xxxx富婆 | 亚洲国产成人av在线观看 | 男女超爽视频免费播放 | 国产成人精品无码播放 | 女人被男人躁得好爽免费视频 | 国精产品一区二区三区 | 色偷偷人人澡人人爽人人模 | 精品无码国产一区二区三区av | 国产婷婷色一区二区三区在线 | 中文字幕无码日韩欧毛 | 久久综合给久久狠狠97色 | 中文字幕人成乱码熟女app | 午夜时刻免费入口 | 久精品国产欧美亚洲色aⅴ大片 | 少妇久久久久久人妻无码 | 中文字幕无码日韩专区 | 成人免费视频在线观看 | 一二三四社区在线中文视频 | 精品成在人线av无码免费看 | 久久综合色之久久综合 | 成人无码精品1区2区3区免费看 | 欧美日韩一区二区三区自拍 | 亚洲经典千人经典日产 | 99久久亚洲精品无码毛片 | 欧美性猛交内射兽交老熟妇 | 漂亮人妻洗澡被公强 日日躁 | 国产免费久久精品国产传媒 | 人人爽人人爽人人片av亚洲 | 午夜成人1000部免费视频 | 激情内射日本一区二区三区 | 熟妇激情内射com | 国产精品久久久 | 六月丁香婷婷色狠狠久久 | 亚洲成av人片天堂网无码】 | 国产成人无码区免费内射一片色欲 | 国产精品久久久久无码av色戒 | 草草网站影院白丝内射 | 国产乱码精品一品二品 | 亚洲小说图区综合在线 | 亚洲s色大片在线观看 | 国产超级va在线观看视频 | a在线亚洲男人的天堂 | 野外少妇愉情中文字幕 | 啦啦啦www在线观看免费视频 | 中文亚洲成a人片在线观看 | 亚洲人成网站免费播放 | 久久99精品久久久久久动态图 | 精品人妻人人做人人爽 | 欧美亚洲国产一区二区三区 | 国产在线精品一区二区高清不卡 | 国产免费观看黄av片 | 成人精品视频一区二区 | 在线а√天堂中文官网 | 无遮挡国产高潮视频免费观看 | 欧美日韩人成综合在线播放 | 综合激情五月综合激情五月激情1 | 成人性做爰aaa片免费看不忠 | 又紧又大又爽精品一区二区 | www成人国产高清内射 | 国产精品沙发午睡系列 | 无码纯肉视频在线观看 | 国产国产精品人在线视 | 亚洲理论电影在线观看 | 精品一区二区三区波多野结衣 | 麻豆精产国品 | 好男人www社区 | 亚洲毛片av日韩av无码 | 国产免费久久久久久无码 | 国产真实乱对白精彩久久 | 亚洲 激情 小说 另类 欧美 | 色欲久久久天天天综合网精品 | 国产日产欧产精品精品app | 久久精品一区二区三区四区 | 亚洲成av人片在线观看无码不卡 | 日韩人妻少妇一区二区三区 | 一本色道久久综合亚洲精品不卡 | 亚洲爆乳大丰满无码专区 | 十八禁真人啪啪免费网站 | 久久久久国色av免费观看性色 | 欧美日韩综合一区二区三区 | 亚洲s色大片在线观看 | 亚洲天堂2017无码中文 | 99精品国产综合久久久久五月天 | 中文字幕人妻无码一区二区三区 | 亚洲热妇无码av在线播放 | av无码电影一区二区三区 | 国产农村乱对白刺激视频 | 97夜夜澡人人爽人人喊中国片 | 天堂无码人妻精品一区二区三区 | 色欲久久久天天天综合网精品 | 久久久中文久久久无码 | 欧美人与禽zoz0性伦交 | 成人片黄网站色大片免费观看 | 娇妻被黑人粗大高潮白浆 | 日韩av无码一区二区三区不卡 | 色婷婷av一区二区三区之红樱桃 | 免费无码午夜福利片69 | 成人精品天堂一区二区三区 | 欧美色就是色 | 人人爽人人澡人人高潮 | 丰满人妻一区二区三区免费视频 | 久久久久久a亚洲欧洲av冫 | 国产性生大片免费观看性 | 久久亚洲中文字幕精品一区 | 国产凸凹视频一区二区 | 呦交小u女精品视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 丰满诱人的人妻3 | 日韩精品无码一区二区中文字幕 | 久久国产精品_国产精品 | 色综合天天综合狠狠爱 | 国产色xx群视频射精 | 亚洲国产精品一区二区美利坚 | 国产精品久免费的黄网站 | 人人妻人人藻人人爽欧美一区 | 国产人妻久久精品二区三区老狼 | 色五月丁香五月综合五月 | 思思久久99热只有频精品66 | 无码纯肉视频在线观看 | 亚洲毛片av日韩av无码 | 无码国产色欲xxxxx视频 | 亚洲精品欧美二区三区中文字幕 | 亚洲经典千人经典日产 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲欧美精品伊人久久 | 久久久久亚洲精品男人的天堂 | 久久视频在线观看精品 | 久久人人97超碰a片精品 | 国产黄在线观看免费观看不卡 | 久久久精品欧美一区二区免费 | 激情亚洲一区国产精品 | 国产精品人人妻人人爽 | 高潮毛片无遮挡高清免费视频 | 国产明星裸体无码xxxx视频 | 兔费看少妇性l交大片免费 | 婷婷五月综合激情中文字幕 | 无码国产激情在线观看 | 欧美成人高清在线播放 | 内射后入在线观看一区 | 久久久婷婷五月亚洲97号色 | 国产无遮挡吃胸膜奶免费看 | 亚洲精品成人av在线 | 亚洲中文字幕久久无码 | 国产精品对白交换视频 | 中文字幕色婷婷在线视频 | 精品久久8x国产免费观看 | 精品无码国产自产拍在线观看蜜 | 久久久亚洲欧洲日产国码αv | 婷婷丁香五月天综合东京热 | 日本一区二区三区免费播放 | 国产精品办公室沙发 | 欧美老妇交乱视频在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 天干天干啦夜天干天2017 | 欧美第一黄网免费网站 | 久久久久久九九精品久 | 国产两女互慰高潮视频在线观看 | 18无码粉嫩小泬无套在线观看 | 成人三级无码视频在线观看 | 男人扒开女人内裤强吻桶进去 | 无码人妻出轨黑人中文字幕 | 国精品人妻无码一区二区三区蜜柚 | 噜噜噜亚洲色成人网站 | 国产亚洲精品久久久久久久 | 色五月丁香五月综合五月 | 人人妻人人澡人人爽人人精品浪潮 | 精品乱子伦一区二区三区 | 人妻aⅴ无码一区二区三区 | 国产av无码专区亚洲awww | 久久99国产综合精品 | 激情五月综合色婷婷一区二区 | 18精品久久久无码午夜福利 | 少妇厨房愉情理9仑片视频 | 久久久久成人片免费观看蜜芽 | 超碰97人人做人人爱少妇 | 99国产精品白浆在线观看免费 | 亚洲欧美日韩国产精品一区二区 | 日韩视频 中文字幕 视频一区 | 国产舌乚八伦偷品w中 | 蜜臀aⅴ国产精品久久久国产老师 | 波多野结衣av在线观看 | 国产精品免费大片 | 国产黄在线观看免费观看不卡 | 久久精品一区二区三区四区 | 日韩欧美成人免费观看 | 精品无码一区二区三区的天堂 | 啦啦啦www在线观看免费视频 | 日本肉体xxxx裸交 | a在线亚洲男人的天堂 | 色 综合 欧美 亚洲 国产 | 国产av人人夜夜澡人人爽麻豆 | 国内精品久久毛片一区二区 | 国产精品久久福利网站 | 国产精品亚洲а∨无码播放麻豆 | 欧美freesex黑人又粗又大 | 领导边摸边吃奶边做爽在线观看 | 国产欧美亚洲精品a | 亚洲国产精品成人久久蜜臀 | 亚无码乱人伦一区二区 | 亚洲欧美色中文字幕在线 | 精品国产福利一区二区 | 午夜福利不卡在线视频 | 久久久精品456亚洲影院 | 粗大的内捧猛烈进出视频 | 97夜夜澡人人爽人人喊中国片 | 久久亚洲国产成人精品性色 | 老头边吃奶边弄进去呻吟 | 国产欧美精品一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 欧美freesex黑人又粗又大 | 婷婷色婷婷开心五月四房播播 | 欧洲美熟女乱又伦 | 又色又爽又黄的美女裸体网站 | 久久综合给久久狠狠97色 | 成人精品视频一区二区三区尤物 | 少妇人妻av毛片在线看 | 亚洲va中文字幕无码久久不卡 | 又大又硬又黄的免费视频 | 亚洲精品久久久久中文第一幕 | 日韩人妻无码一区二区三区久久99 | 搡女人真爽免费视频大全 | 最近的中文字幕在线看视频 | 日本精品少妇一区二区三区 | 久久精品国产99精品亚洲 | 国产精品美女久久久网av | 国产无遮挡吃胸膜奶免费看 | 特大黑人娇小亚洲女 | 最新版天堂资源中文官网 | 中文字幕亚洲情99在线 | 丰满少妇高潮惨叫视频 | 国产成人精品一区二区在线小狼 | 狠狠躁日日躁夜夜躁2020 | 日本www一道久久久免费榴莲 | 国产亚洲美女精品久久久2020 | 人人妻人人澡人人爽欧美一区九九 | 免费男性肉肉影院 | 在线 国产 欧美 亚洲 天堂 | 欧美zoozzooz性欧美 | 国模大胆一区二区三区 | 亚洲理论电影在线观看 | 国产午夜亚洲精品不卡下载 | 丰满诱人的人妻3 | 国产人妻精品一区二区三区不卡 | 亚洲欧美日韩综合久久久 | 十八禁真人啪啪免费网站 | 一个人看的www免费视频在线观看 | 九九综合va免费看 | 精品久久久中文字幕人妻 | 天天躁夜夜躁狠狠是什么心态 | 国产 浪潮av性色四虎 | 人妻aⅴ无码一区二区三区 | 男人扒开女人内裤强吻桶进去 | 2019午夜福利不卡片在线 | 99久久无码一区人妻 | 日韩人妻系列无码专区 | 7777奇米四色成人眼影 | 国产av一区二区三区最新精品 | 久久精品人妻少妇一区二区三区 | 国产一区二区不卡老阿姨 | 久久综合激激的五月天 | 亚洲最大成人网站 | 亚洲一区av无码专区在线观看 | 蜜臀av无码人妻精品 | 99久久精品无码一区二区毛片 | 国产成人午夜福利在线播放 | 国色天香社区在线视频 | 日本护士毛茸茸高潮 | 18黄暴禁片在线观看 | 亚洲一区二区三区偷拍女厕 | 国产精华av午夜在线观看 | 亚洲欧美色中文字幕在线 | 亚洲a无码综合a国产av中文 | 丰满诱人的人妻3 | а√资源新版在线天堂 | 亚洲精品一区二区三区大桥未久 | 中文无码精品a∨在线观看不卡 | 亚欧洲精品在线视频免费观看 | 欧洲欧美人成视频在线 | 免费网站看v片在线18禁无码 | 天天拍夜夜添久久精品大 | 欧美老妇交乱视频在线观看 | 丰满少妇人妻久久久久久 | 一本一道久久综合久久 | 久在线观看福利视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲爆乳大丰满无码专区 | 影音先锋中文字幕无码 | 精品午夜福利在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 青青草原综合久久大伊人精品 | 久久亚洲精品中文字幕无男同 | 久久久成人毛片无码 | 国色天香社区在线视频 | 精品国产精品久久一区免费式 | 激情国产av做激情国产爱 | 波多野42部无码喷潮在线 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲 日韩 欧美 成人 在线观看 | 俄罗斯老熟妇色xxxx | 国产极品视觉盛宴 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久久久久久人妻无码中文字幕爆 | 中文字幕无线码 | 中文字幕色婷婷在线视频 | 风流少妇按摩来高潮 | 国产两女互慰高潮视频在线观看 | 亚洲成熟女人毛毛耸耸多 | 2020久久香蕉国产线看观看 | 久久精品国产99精品亚洲 | 日韩 欧美 动漫 国产 制服 | 熟妇人妻中文av无码 | 亚洲一区二区三区在线观看网站 | 国产三级久久久精品麻豆三级 | 免费网站看v片在线18禁无码 | 久久精品无码一区二区三区 | 亚洲日韩av一区二区三区中文 | 亚洲a无码综合a国产av中文 | 水蜜桃亚洲一二三四在线 | 亚洲国产欧美日韩精品一区二区三区 | 欧美变态另类xxxx | 丰满诱人的人妻3 | 粉嫩少妇内射浓精videos | 女人和拘做爰正片视频 | 欧美xxxxx精品 | 亚洲 另类 在线 欧美 制服 | 日日碰狠狠丁香久燥 | 国产无遮挡又黄又爽免费视频 | 妺妺窝人体色www在线小说 | 色综合视频一区二区三区 | 亚洲国产日韩a在线播放 | 丰腴饱满的极品熟妇 | 理论片87福利理论电影 | 波多野结衣 黑人 | 97人妻精品一区二区三区 | 国产精品99久久精品爆乳 | 国产成人精品视频ⅴa片软件竹菊 | 风流少妇按摩来高潮 | 四虎永久在线精品免费网址 | 色 综合 欧美 亚洲 国产 | 日日麻批免费40分钟无码 | 高清无码午夜福利视频 | 小泽玛莉亚一区二区视频在线 | 亚洲成a人片在线观看无码 | 欧美人妻一区二区三区 | 伦伦影院午夜理论片 | 日本一区二区三区免费播放 | 亚洲日本va午夜在线电影 | 日韩av无码中文无码电影 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜嘿嘿嘿影院 | 欧美丰满老熟妇xxxxx性 | 成人精品一区二区三区中文字幕 | 国产精品第一国产精品 | 国产精品免费大片 | 一本无码人妻在中文字幕免费 | 在线精品亚洲一区二区 | 亚洲色无码一区二区三区 | 在线 国产 欧美 亚洲 天堂 | 台湾无码一区二区 | 亚洲中文字幕在线无码一区二区 | 一本色道久久综合亚洲精品不卡 | 亚洲gv猛男gv无码男同 | 久久久精品欧美一区二区免费 | 国产精品18久久久久久麻辣 | 少妇厨房愉情理9仑片视频 | 亚洲精品成a人在线观看 | 亚洲欧美综合区丁香五月小说 | 欧美成人午夜精品久久久 | 国产 浪潮av性色四虎 | 亚洲中文字幕av在天堂 | 中文字幕亚洲情99在线 | 牲欲强的熟妇农村老妇女视频 | 亚洲精品国产品国语在线观看 | 亚洲精品一区二区三区大桥未久 | 久久亚洲日韩精品一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 日本一本二本三区免费 | 国产卡一卡二卡三 | 精品午夜福利在线观看 | 丰满少妇高潮惨叫视频 | 日韩av无码一区二区三区 | 精品国产国产综合精品 | 国产成人精品视频ⅴa片软件竹菊 | 搡女人真爽免费视频大全 | 六月丁香婷婷色狠狠久久 | 无码国内精品人妻少妇 | 亚洲人成无码网www | 夫妻免费无码v看片 | 欧美色就是色 | 特级做a爰片毛片免费69 | 人妻aⅴ无码一区二区三区 | 日韩视频 中文字幕 视频一区 | 奇米影视7777久久精品人人爽 | 国产激情无码一区二区app | 亚洲成av人综合在线观看 | 成人免费无码大片a毛片 | 久久国产自偷自偷免费一区调 | 无码人妻出轨黑人中文字幕 | 女人被爽到呻吟gif动态图视看 | 成人免费视频在线观看 | 中文字幕无线码免费人妻 | 鲁一鲁av2019在线 | 又大又黄又粗又爽的免费视频 | 亚洲精品综合一区二区三区在线 | 蜜桃臀无码内射一区二区三区 | 亚洲精品一区三区三区在线观看 | 国产午夜福利亚洲第一 | 国产福利视频一区二区 | 亚洲爆乳大丰满无码专区 | 亚洲色www成人永久网址 | 强开小婷嫩苞又嫩又紧视频 | 精品日本一区二区三区在线观看 | 国产婷婷色一区二区三区在线 | 国产精品久久久午夜夜伦鲁鲁 | 无码av最新清无码专区吞精 | 又大又黄又粗又爽的免费视频 | 性生交片免费无码看人 | 亚洲s色大片在线观看 | 国产真人无遮挡作爱免费视频 | 国产成人综合在线女婷五月99播放 | 国产成人久久精品流白浆 | 久久久久se色偷偷亚洲精品av | 在线天堂新版最新版在线8 | 国产极品美女高潮无套在线观看 | 水蜜桃亚洲一二三四在线 | 女人被男人躁得好爽免费视频 | 国产乱人伦偷精品视频 | 久久久久久久久888 | 老头边吃奶边弄进去呻吟 | 欧美人与物videos另类 | 啦啦啦www在线观看免费视频 | 色老头在线一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 熟妇女人妻丰满少妇中文字幕 | 狠狠cao日日穞夜夜穞av | 日本免费一区二区三区最新 | 给我免费的视频在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 久久精品国产日本波多野结衣 | 日本www一道久久久免费榴莲 | 99久久人妻精品免费一区 | 麻豆国产丝袜白领秘书在线观看 | 亚洲人成人无码网www国产 | 国产无遮挡又黄又爽免费视频 | 欧美精品无码一区二区三区 | 天堂一区人妻无码 | 国产内射老熟女aaaa | 亚洲区欧美区综合区自拍区 | 激情内射日本一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 老熟妇仑乱视频一区二区 | 国产精品久久久久7777 | 久久zyz资源站无码中文动漫 | 国产va免费精品观看 | 一本无码人妻在中文字幕免费 | 国产午夜福利亚洲第一 | 日韩无套无码精品 | 亚洲国产精品久久久久久 | 国产精品va在线播放 | 精品无码一区二区三区爱欲 | 亚洲中文字幕无码中字 | 欧洲欧美人成视频在线 | 久久午夜夜伦鲁鲁片无码免费 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲成av人在线观看网址 | 亚洲精品欧美二区三区中文字幕 | 成人免费视频视频在线观看 免费 | 人人爽人人爽人人片av亚洲 | 男女性色大片免费网站 | 奇米影视888欧美在线观看 | 亚洲日韩中文字幕在线播放 | 亚洲欧美色中文字幕在线 | 97色伦图片97综合影院 | 99久久99久久免费精品蜜桃 | 国产精品第一区揄拍无码 | 久久人人爽人人爽人人片ⅴ | 国产美女精品一区二区三区 | 欧美日韩亚洲国产精品 | 中文字幕无码av波多野吉衣 | 亚洲另类伦春色综合小说 | 精品水蜜桃久久久久久久 | 国产无av码在线观看 | 大地资源网第二页免费观看 | 精品无人国产偷自产在线 | 久久久精品人妻久久影视 | 又色又爽又黄的美女裸体网站 | 捆绑白丝粉色jk震动捧喷白浆 | 爱做久久久久久 | 性欧美videos高清精品 | 久久这里只有精品视频9 | 天天做天天爱天天爽综合网 | 给我免费的视频在线观看 | 日本熟妇人妻xxxxx人hd | 帮老师解开蕾丝奶罩吸乳网站 | 国产成人一区二区三区在线观看 | 一本久久伊人热热精品中文字幕 | 97se亚洲精品一区 | 欧美丰满老熟妇xxxxx性 | 黑人粗大猛烈进出高潮视频 | 牲欲强的熟妇农村老妇女 | 国产精品爱久久久久久久 | 亚洲s码欧洲m码国产av | 成年美女黄网站色大免费视频 | 成在人线av无码免观看麻豆 | 丰满人妻翻云覆雨呻吟视频 | 国产肉丝袜在线观看 | 婷婷色婷婷开心五月四房播播 | 国产精品亚洲一区二区三区喷水 | 国产成人精品必看 | 日本乱人伦片中文三区 | 99久久精品国产一区二区蜜芽 | 国产麻豆精品一区二区三区v视界 | 亚洲中文字幕在线无码一区二区 | 无码任你躁久久久久久久 | 国产亚洲人成在线播放 | 无套内射视频囯产 | 波多野结衣高清一区二区三区 | 精品成在人线av无码免费看 | 国产偷国产偷精品高清尤物 | 国产9 9在线 | 中文 | 女人被男人爽到呻吟的视频 | 国产香蕉尹人综合在线观看 | 51国偷自产一区二区三区 | 久久久久久国产精品无码下载 | 国产人妻大战黑人第1集 | 精品久久久无码人妻字幂 | 无码免费一区二区三区 | 色五月丁香五月综合五月 | 免费看男女做好爽好硬视频 | 无码人妻黑人中文字幕 | www成人国产高清内射 | 久久国产劲爆∧v内射 | 精品国产福利一区二区 | 午夜熟女插插xx免费视频 | 国产精品无码一区二区桃花视频 | 沈阳熟女露脸对白视频 | 欧美精品在线观看 | 玩弄人妻少妇500系列视频 | 国产精品亚洲lv粉色 | 人人妻人人澡人人爽人人精品 | 午夜精品久久久久久久 | 我要看www免费看插插视频 | 人人澡人人透人人爽 | 伊人久久大香线蕉av一区二区 | 日韩少妇内射免费播放 | 国产深夜福利视频在线 | 久久综合九色综合97网 | 人妻少妇精品视频专区 | 人人妻人人澡人人爽欧美一区九九 | 精品国产一区二区三区av 性色 | 内射老妇bbwx0c0ck | 娇妻被黑人粗大高潮白浆 | 亚洲成av人影院在线观看 | 最新国产乱人伦偷精品免费网站 | 午夜免费福利小电影 | 日韩av无码中文无码电影 | 人人妻人人澡人人爽欧美精品 | 亚洲人成影院在线无码按摩店 | 内射巨臀欧美在线视频 | 精品无码国产一区二区三区av | 亚洲 a v无 码免 费 成 人 a v | 少妇人妻偷人精品无码视频 | 搡女人真爽免费视频大全 | 3d动漫精品啪啪一区二区中 | 久久国产精品萌白酱免费 | 亚洲一区二区三区在线观看网站 | 国产成人无码av片在线观看不卡 | 国产精品久久久久影院嫩草 | 无码精品国产va在线观看dvd | 国产特级毛片aaaaaa高潮流水 | 国内精品人妻无码久久久影院蜜桃 | 人人妻人人澡人人爽欧美精品 | 亚洲国产欧美在线成人 | 人妻夜夜爽天天爽三区 | 伊人久久大香线蕉av一区二区 | 国产精品资源一区二区 | 成熟妇人a片免费看网站 | 欧美三级不卡在线观看 | 四虎永久在线精品免费网址 | 精品人妻av区 | 亚洲成色在线综合网站 | 亚洲爆乳精品无码一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人无码av一区二区 | 男女性色大片免费网站 | 欧美熟妇另类久久久久久多毛 | 欧美老熟妇乱xxxxx | 亚洲日本va中文字幕 | 国产亚洲精品久久久久久国模美 | 99久久久无码国产aaa精品 | 一本久久a久久精品vr综合 | 18无码粉嫩小泬无套在线观看 | 国语自产偷拍精品视频偷 | 亚洲日韩一区二区三区 | 精品国产福利一区二区 | 大肉大捧一进一出视频出来呀 | 亚洲欧美色中文字幕在线 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲精品一区二区三区四区五区 | 性色欲情网站iwww九文堂 | 天堂在线观看www | 三上悠亚人妻中文字幕在线 | 久久久中文字幕日本无吗 | 精品国产一区二区三区av 性色 | 国产99久久精品一区二区 | 欧洲美熟女乱又伦 | 人人妻人人澡人人爽欧美一区 | 风流少妇按摩来高潮 | 亚洲色成人中文字幕网站 | 欧美国产亚洲日韩在线二区 | 乱人伦人妻中文字幕无码 | 免费无码的av片在线观看 | 国产精品无码一区二区三区不卡 | 色综合天天综合狠狠爱 | 无码中文字幕色专区 | 日韩欧美中文字幕公布 | 日本熟妇大屁股人妻 | 精品久久久久久亚洲精品 | 精品人妻中文字幕有码在线 | 久久精品女人天堂av免费观看 | 国产成人无码午夜视频在线观看 | 国产综合在线观看 | 久久久久免费看成人影片 | 中文精品久久久久人妻不卡 | 亚洲天堂2017无码中文 | 亚洲午夜久久久影院 | 国产麻豆精品一区二区三区v视界 | 亚洲中文字幕在线无码一区二区 | 日本欧美一区二区三区乱码 | 强开小婷嫩苞又嫩又紧视频 | ass日本丰满熟妇pics | 亚洲乱码国产乱码精品精 | 曰韩少妇内射免费播放 | 水蜜桃色314在线观看 | 性欧美牲交xxxxx视频 | 乱人伦中文视频在线观看 | 亚洲一区二区观看播放 | 日本护士毛茸茸高潮 | 人妻无码αv中文字幕久久琪琪布 | 黄网在线观看免费网站 | 一本加勒比波多野结衣 | 国产精品久久福利网站 | 成人免费视频视频在线观看 免费 | 国产又爽又猛又粗的视频a片 | 少妇性荡欲午夜性开放视频剧场 | 精品一区二区三区无码免费视频 | 亚洲精品久久久久久久久久久 | 国产精品国产三级国产专播 | 性生交大片免费看女人按摩摩 | 东京热无码av男人的天堂 | 国产精品igao视频网 | 天堂无码人妻精品一区二区三区 | av香港经典三级级 在线 | 久久人人爽人人爽人人片av高清 | 日本熟妇乱子伦xxxx | 国产明星裸体无码xxxx视频 | 荫蒂添的好舒服视频囗交 | 人妻少妇精品无码专区动漫 | 国产午夜视频在线观看 | 亚洲国产精品一区二区美利坚 | 香蕉久久久久久av成人 | 妺妺窝人体色www在线小说 | 亚洲爆乳大丰满无码专区 | 亚洲区欧美区综合区自拍区 | 波多野结衣aⅴ在线 | 丰满妇女强制高潮18xxxx | 精品一区二区三区波多野结衣 | 日本精品久久久久中文字幕 | 国内精品久久毛片一区二区 | 日韩亚洲欧美精品综合 | 又大又硬又黄的免费视频 | 欧美国产日产一区二区 | 伊人久久大香线焦av综合影院 | 丝袜足控一区二区三区 | 全球成人中文在线 | 亚洲乱码中文字幕在线 | 天堂久久天堂av色综合 | 国内少妇偷人精品视频免费 | 水蜜桃av无码 | 麻豆md0077饥渴少妇 | 麻豆国产97在线 | 欧洲 | 亚洲日韩av一区二区三区四区 | 无码人妻精品一区二区三区不卡 | 无码中文字幕色专区 | 夜夜高潮次次欢爽av女 | 日本护士xxxxhd少妇 | 精品国产一区二区三区四区 | 久久99精品久久久久婷婷 | 久久人人爽人人爽人人片av高清 | 免费男性肉肉影院 | 欧美 日韩 亚洲 在线 | 国产又爽又猛又粗的视频a片 | 欧美黑人巨大xxxxx | 成 人影片 免费观看 | 国内综合精品午夜久久资源 | 亚洲精品无码国产 | 日韩人妻无码中文字幕视频 | 亚洲欧美日韩国产精品一区二区 | 亚洲a无码综合a国产av中文 | 亚洲の无码国产の无码步美 | 97无码免费人妻超级碰碰夜夜 | 夜夜夜高潮夜夜爽夜夜爰爰 | 伊人久久大香线蕉av一区二区 | 7777奇米四色成人眼影 | 乱中年女人伦av三区 | 日本护士毛茸茸高潮 | 亚洲成色www久久网站 | 亚洲啪av永久无码精品放毛片 | 婷婷五月综合缴情在线视频 | 大乳丰满人妻中文字幕日本 | 亚洲成a人一区二区三区 | 精品久久久中文字幕人妻 | 欧美人与牲动交xxxx | 最近的中文字幕在线看视频 | 久久aⅴ免费观看 | 国产精品久久久av久久久 | 国产午夜福利100集发布 | 99国产欧美久久久精品 | 亚洲国产精品一区二区美利坚 | 免费观看激色视频网站 | 宝宝好涨水快流出来免费视频 | 国产精品鲁鲁鲁 | 亚洲一区av无码专区在线观看 | 国产97人人超碰caoprom | 欧美日韩色另类综合 | 性色av无码免费一区二区三区 | 亚洲人亚洲人成电影网站色 | 5858s亚洲色大成网站www | 久久国产自偷自偷免费一区调 | 国精品人妻无码一区二区三区蜜柚 | 搡女人真爽免费视频大全 | 中文字幕无码日韩欧毛 | 国产精品国产三级国产专播 | 亚洲gv猛男gv无码男同 | 免费国产黄网站在线观看 | 影音先锋中文字幕无码 | 亚洲色偷偷偷综合网 | 久久亚洲日韩精品一区二区三区 | 亚洲爆乳大丰满无码专区 | 牲欲强的熟妇农村老妇女视频 | 鲁鲁鲁爽爽爽在线视频观看 | 国产口爆吞精在线视频 | 一本加勒比波多野结衣 | 永久免费精品精品永久-夜色 | 欧美一区二区三区视频在线观看 | 国产综合久久久久鬼色 | 久久久久se色偷偷亚洲精品av | 鲁大师影院在线观看 | 特级做a爰片毛片免费69 | 国产在线一区二区三区四区五区 | 天海翼激烈高潮到腰振不止 | 中文字幕无码免费久久99 | 99riav国产精品视频 | 久久人人爽人人爽人人片av高清 | 性欧美牲交xxxxx视频 | 熟妇女人妻丰满少妇中文字幕 | 嫩b人妻精品一区二区三区 | 永久免费观看美女裸体的网站 | 成人免费视频在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品亚洲五月天高清 | 色综合久久中文娱乐网 | 亚洲 激情 小说 另类 欧美 | 免费国产黄网站在线观看 | 少妇性俱乐部纵欲狂欢电影 | 亚洲国产精华液网站w | 免费无码肉片在线观看 | 天堂无码人妻精品一区二区三区 | 国产精品人妻一区二区三区四 | 青青青爽视频在线观看 | 亚洲国产精品一区二区美利坚 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲欧美日韩成人高清在线一区 | 久久精品一区二区三区四区 | 国产激情一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 国内精品人妻无码久久久影院蜜桃 | 在线观看国产一区二区三区 | 夜夜躁日日躁狠狠久久av | 日产精品高潮呻吟av久久 | 日韩精品一区二区av在线 | 久久久久久久人妻无码中文字幕爆 | 97精品人妻一区二区三区香蕉 | 亚洲国产av精品一区二区蜜芽 | 香港三级日本三级妇三级 | 又大又硬又爽免费视频 | 久久久久久久久888 | 97se亚洲精品一区 | 东京热无码av男人的天堂 | 亚洲色无码一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 人妻与老人中文字幕 | 国产激情无码一区二区app | 欧美日韩一区二区三区自拍 | 色偷偷人人澡人人爽人人模 | 2020久久超碰国产精品最新 | 久久久久成人片免费观看蜜芽 | 俺去俺来也www色官网 | 奇米影视888欧美在线观看 | 国产精品久久国产精品99 | 呦交小u女精品视频 | 久久亚洲日韩精品一区二区三区 | 麻豆人妻少妇精品无码专区 | 无码国产激情在线观看 | 高潮毛片无遮挡高清免费视频 | 亚洲天堂2017无码中文 | 国产精品欧美成人 | 久久国产精品二国产精品 | 国产成人综合色在线观看网站 | aⅴ在线视频男人的天堂 | 全黄性性激高免费视频 | 久久五月精品中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 领导边摸边吃奶边做爽在线观看 | 国产在线精品一区二区高清不卡 | 老太婆性杂交欧美肥老太 | 免费无码肉片在线观看 | 人妻aⅴ无码一区二区三区 | 鲁鲁鲁爽爽爽在线视频观看 | 丁香花在线影院观看在线播放 | 亚洲 另类 在线 欧美 制服 | 国产亚洲精品久久久久久大师 | 精品无码国产自产拍在线观看蜜 | 波多野结衣av一区二区全免费观看 | 国产精品对白交换视频 | 亚洲精品一区二区三区婷婷月 | 国模大胆一区二区三区 | 亚洲色无码一区二区三区 | 色婷婷综合激情综在线播放 | 正在播放老肥熟妇露脸 | 中文字幕精品av一区二区五区 | 内射老妇bbwx0c0ck | 曰韩无码二三区中文字幕 | 亚洲va中文字幕无码久久不卡 | 午夜熟女插插xx免费视频 | 东京无码熟妇人妻av在线网址 | 亚洲精品综合五月久久小说 | 老熟妇仑乱视频一区二区 | 欧美一区二区三区视频在线观看 | 日本成熟视频免费视频 | 少妇性俱乐部纵欲狂欢电影 | 超碰97人人做人人爱少妇 | 久久综合给合久久狠狠狠97色 | 国产精品久久久久无码av色戒 | 国产97色在线 | 免 | 性做久久久久久久免费看 | 丰满人妻翻云覆雨呻吟视频 | 99麻豆久久久国产精品免费 | 亚洲国产成人a精品不卡在线 | 亚洲人成网站在线播放942 | 日欧一片内射va在线影院 | 在线观看欧美一区二区三区 | 成人无码影片精品久久久 | 国产精品二区一区二区aⅴ污介绍 | 国产成人亚洲综合无码 | 亚洲日韩精品欧美一区二区 | 1000部啪啪未满十八勿入下载 | 最新国产麻豆aⅴ精品无码 | 日韩少妇内射免费播放 | 国产av一区二区精品久久凹凸 | 久久国产精品偷任你爽任你 | 亚洲成a人片在线观看无码3d | 欧美人与禽猛交狂配 | 国产乱人偷精品人妻a片 | 国产av人人夜夜澡人人爽麻豆 | 真人与拘做受免费视频 | 亚洲欧洲日本综合aⅴ在线 | 丝袜美腿亚洲一区二区 | 久久精品中文闷骚内射 | 99视频精品全部免费免费观看 | 国产一区二区三区四区五区加勒比 | 亚洲国产成人a精品不卡在线 | 日产精品高潮呻吟av久久 | 国产一区二区三区日韩精品 | 国产av剧情md精品麻豆 | 国产精品久久国产精品99 | 最近免费中文字幕中文高清百度 | 蜜桃视频韩日免费播放 | 日韩精品成人一区二区三区 | a国产一区二区免费入口 | 亚洲国产日韩a在线播放 | 欧美精品免费观看二区 | 76少妇精品导航 | 国产一区二区三区影院 | 青青草原综合久久大伊人精品 | 精品无码一区二区三区爱欲 | 日韩精品一区二区av在线 | 狠狠色噜噜狠狠狠7777奇米 | 99精品无人区乱码1区2区3区 | 久久综合给合久久狠狠狠97色 | 男女作爱免费网站 | 我要看www免费看插插视频 | 成人影院yy111111在线观看 | 成 人影片 免费观看 | 久久久久人妻一区精品色欧美 | 国产成人精品优优av | 亚洲毛片av日韩av无码 | 又粗又大又硬毛片免费看 | 中文字幕久久久久人妻 | 久久99热只有频精品8 | 日日鲁鲁鲁夜夜爽爽狠狠 | 撕开奶罩揉吮奶头视频 | 亚洲成av人片天堂网无码】 | 精品日本一区二区三区在线观看 | 亚洲成在人网站无码天堂 | 久久99精品国产.久久久久 | 在线成人www免费观看视频 | 日韩精品a片一区二区三区妖精 | 免费男性肉肉影院 | 无码av最新清无码专区吞精 | 成人女人看片免费视频放人 | 国产午夜无码视频在线观看 | 久久久久久久人妻无码中文字幕爆 | 国产女主播喷水视频在线观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 激情爆乳一区二区三区 | 国产97在线 | 亚洲 | 88国产精品欧美一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 国产人妻大战黑人第1集 | 2020久久香蕉国产线看观看 | 国产麻豆精品精东影业av网站 | 欧美日韩在线亚洲综合国产人 | 亚洲伊人久久精品影院 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲天堂2017无码 | 国产手机在线αⅴ片无码观看 | 中文亚洲成a人片在线观看 | 欧美刺激性大交 | 精品久久久无码中文字幕 | 人妻有码中文字幕在线 | 国产成人无码av片在线观看不卡 | 六月丁香婷婷色狠狠久久 | 亚洲伊人久久精品影院 | 少妇被粗大的猛进出69影院 | 国产成人一区二区三区别 | 99久久久国产精品无码免费 | 国产熟妇高潮叫床视频播放 | a在线亚洲男人的天堂 | 精品国产成人一区二区三区 | 国产香蕉尹人综合在线观看 | 免费无码的av片在线观看 | 少妇人妻偷人精品无码视频 | 99国产欧美久久久精品 | 久久久久久九九精品久 | 兔费看少妇性l交大片免费 | 久久精品国产一区二区三区肥胖 | 午夜性刺激在线视频免费 | 久久久久亚洲精品中文字幕 | 久9re热视频这里只有精品 | 人妻天天爽夜夜爽一区二区 | 国产高清不卡无码视频 | 领导边摸边吃奶边做爽在线观看 | 久久综合九色综合欧美狠狠 | 狂野欧美性猛交免费视频 | 亚洲精品综合五月久久小说 | 欧美刺激性大交 | 内射爽无广熟女亚洲 | 成人免费无码大片a毛片 | 中文字幕无码日韩欧毛 | 精品夜夜澡人妻无码av蜜桃 | 婷婷色婷婷开心五月四房播播 | а√资源新版在线天堂 | 偷窥日本少妇撒尿chinese | 国产亚洲日韩欧美另类第八页 | 亚洲色www成人永久网址 | 2020久久超碰国产精品最新 | 欧美日韩色另类综合 | 亚洲精品综合五月久久小说 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美日本精品一区二区三区 | 亚洲精品一区国产 | 2020最新国产自产精品 | 日韩精品成人一区二区三区 | 精品国产精品久久一区免费式 | 蜜臀av在线播放 久久综合激激的五月天 | 99久久婷婷国产综合精品青草免费 | 欧美人与动性行为视频 | av在线亚洲欧洲日产一区二区 | 国产午夜精品一区二区三区嫩草 | 久久精品人妻少妇一区二区三区 | 久久精品人人做人人综合试看 | 亚洲 a v无 码免 费 成 人 a v | 小鲜肉自慰网站xnxx | 久久久av男人的天堂 | 亚洲国产精品无码一区二区三区 | 中文字幕无码av激情不卡 | 蜜桃臀无码内射一区二区三区 | 色综合久久88色综合天天 | 亚洲熟女一区二区三区 | 久久久av男人的天堂 | 在线视频网站www色 | 精品无码一区二区三区的天堂 | 国产两女互慰高潮视频在线观看 | 国产午夜精品一区二区三区嫩草 | 久久久久久九九精品久 | 亚洲综合色区中文字幕 | 色狠狠av一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 久激情内射婷内射蜜桃人妖 | 日本熟妇乱子伦xxxx | 久久久精品国产sm最大网站 | 亚洲日本一区二区三区在线 | 亚洲成av人片在线观看无码不卡 | 少妇被粗大的猛进出69影院 | 国产人妻人伦精品1国产丝袜 | 秋霞特色aa大片 | 日本一区二区更新不卡 | 大色综合色综合网站 | 欧美国产日产一区二区 | 亚洲国产精品久久久久久 | 男女下面进入的视频免费午夜 | 97人妻精品一区二区三区 | 久久综合色之久久综合 | 久久久久成人片免费观看蜜芽 | 国产黑色丝袜在线播放 | 日韩精品乱码av一区二区 | 免费无码一区二区三区蜜桃大 | 狠狠cao日日穞夜夜穞av | 亚洲一区二区观看播放 | 国产激情艳情在线看视频 | 亚洲色欲色欲欲www在线 | 国产欧美亚洲精品a | 亚洲精品综合一区二区三区在线 | 三上悠亚人妻中文字幕在线 | 免费视频欧美无人区码 | 欧美性生交活xxxxxdddd | 色情久久久av熟女人妻网站 | 久久久久久国产精品无码下载 | 又大又硬又黄的免费视频 | 激情五月综合色婷婷一区二区 | 女人和拘做爰正片视频 | 久久久久久久久蜜桃 | 少女韩国电视剧在线观看完整 | 丰满护士巨好爽好大乳 | 国产国语老龄妇女a片 | 亚无码乱人伦一区二区 | 丰满少妇高潮惨叫视频 | 麻花豆传媒剧国产免费mv在线 | 国产精品久久国产三级国 | 久久精品国产亚洲精品 | 中文字幕乱码亚洲无线三区 | 亚洲综合无码久久精品综合 | 麻豆国产人妻欲求不满谁演的 | 精品欧洲av无码一区二区三区 | 日韩 欧美 动漫 国产 制服 | 十八禁真人啪啪免费网站 | 伊人久久大香线蕉av一区二区 | 黄网在线观看免费网站 | 亚洲成色www久久网站 | 日本一区二区更新不卡 | 国内少妇偷人精品视频免费 | 国产精品久久久av久久久 | 国产性生交xxxxx无码 | 国产乱人无码伦av在线a | 精品一区二区不卡无码av | 98国产精品综合一区二区三区 | 少妇高潮喷潮久久久影院 | 1000部啪啪未满十八勿入下载 | 麻豆精产国品 | 国产午夜无码视频在线观看 | 色综合视频一区二区三区 | 中文精品久久久久人妻不卡 | 麻豆国产97在线 | 欧洲 | 99久久婷婷国产综合精品青草免费 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲阿v天堂在线 | 两性色午夜视频免费播放 | 少妇被粗大的猛进出69影院 | 玩弄人妻少妇500系列视频 | 又紧又大又爽精品一区二区 | 无码人中文字幕 | 亚洲精品一区二区三区婷婷月 | 未满小14洗澡无码视频网站 | 国产9 9在线 | 中文 | 国产精品永久免费视频 | 国产深夜福利视频在线 | 亚洲精品国产精品乱码视色 | 国产av一区二区三区最新精品 | 内射后入在线观看一区 | 中文字幕日韩精品一区二区三区 | 成人动漫在线观看 | 国内精品久久毛片一区二区 | 麻花豆传媒剧国产免费mv在线 | 成人女人看片免费视频放人 | 兔费看少妇性l交大片免费 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品欧美成人 | 国产无av码在线观看 | 亚洲精品一区二区三区四区五区 | 99久久精品国产一区二区蜜芽 | 综合网日日天干夜夜久久 | 久久久久免费精品国产 | 人人爽人人爽人人片av亚洲 | 无码成人精品区在线观看 | 四虎国产精品免费久久 | 麻豆人妻少妇精品无码专区 | 青青草原综合久久大伊人精品 | 欧美怡红院免费全部视频 | 国产亚洲日韩欧美另类第八页 | 婷婷丁香六月激情综合啪 | 麻豆md0077饥渴少妇 | 亚洲日韩乱码中文无码蜜桃臀网站 | 色 综合 欧美 亚洲 国产 | 亚洲国产精品无码一区二区三区 | 网友自拍区视频精品 | 欧美人与禽猛交狂配 | 精品国产一区av天美传媒 | 波多野结衣av在线观看 | 亚洲精品中文字幕久久久久 | 国产区女主播在线观看 | 99久久99久久免费精品蜜桃 | 亚洲啪av永久无码精品放毛片 | 亚洲中文字幕在线观看 | 学生妹亚洲一区二区 | 久久熟妇人妻午夜寂寞影院 | 精品国产乱码久久久久乱码 | 国产在热线精品视频 | 久久亚洲日韩精品一区二区三区 | 日韩在线不卡免费视频一区 | 亚洲区欧美区综合区自拍区 | 精品水蜜桃久久久久久久 | 亚洲色欲色欲欲www在线 | 日日摸夜夜摸狠狠摸婷婷 | 色窝窝无码一区二区三区色欲 | 亚洲成av人片在线观看无码不卡 | 精品亚洲韩国一区二区三区 | 美女扒开屁股让男人桶 | 中文字幕无码人妻少妇免费 | 正在播放老肥熟妇露脸 | 丝袜美腿亚洲一区二区 | 久久久久久九九精品久 | 久久综合色之久久综合 | 欧美freesex黑人又粗又大 | 亚洲欧美中文字幕5发布 | 丰满少妇弄高潮了www | 日本免费一区二区三区最新 | 日本乱人伦片中文三区 | 国产精品亚洲专区无码不卡 | 久久婷婷五月综合色国产香蕉 | 在线a亚洲视频播放在线观看 | 动漫av一区二区在线观看 | 亚洲精品一区三区三区在线观看 | 亚欧洲精品在线视频免费观看 | 成人精品天堂一区二区三区 | 国产亚洲美女精品久久久2020 | 日韩av无码中文无码电影 | 又大又硬又黄的免费视频 | 天干天干啦夜天干天2017 | 日韩欧美群交p片內射中文 | 国内老熟妇对白xxxxhd | 少妇邻居内射在线 | 狠狠亚洲超碰狼人久久 | 亚洲国产精品美女久久久久 | 国产精品爱久久久久久久 | 麻豆精品国产精华精华液好用吗 | 亚洲精品久久久久久久久久久 | 丰满人妻一区二区三区免费视频 | 丰满妇女强制高潮18xxxx | 日本爽爽爽爽爽爽在线观看免 | 久久成人a毛片免费观看网站 | 国产无遮挡吃胸膜奶免费看 | 色欲综合久久中文字幕网 | 久久99热只有频精品8 | 天天做天天爱天天爽综合网 | 高清不卡一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 九月婷婷人人澡人人添人人爽 | 亚洲综合伊人久久大杳蕉 | 欧美一区二区三区视频在线观看 | 精品国产乱码久久久久乱码 | 亚洲欧美精品aaaaaa片 | 久久久久久av无码免费看大片 | 午夜精品久久久久久久久 | 蜜臀av无码人妻精品 | 亚洲一区二区三区四区 | 国产亚洲精品久久久久久久久动漫 | 日日碰狠狠躁久久躁蜜桃 | 日日麻批免费40分钟无码 | 老司机亚洲精品影院无码 | 影音先锋中文字幕无码 | 国产色视频一区二区三区 | 国产成人无码a区在线观看视频app | 激情内射亚州一区二区三区爱妻 | 网友自拍区视频精品 | 中文无码伦av中文字幕 | 国产精品无码久久av | 国产成人精品视频ⅴa片软件竹菊 | √天堂资源地址中文在线 | 日本一区二区更新不卡 | 国产亚洲精品久久久久久国模美 | 国产成人无码av片在线观看不卡 | 特级做a爰片毛片免费69 | 99久久99久久免费精品蜜桃 | 日本精品少妇一区二区三区 | 伊人久久婷婷五月综合97色 | 内射爽无广熟女亚洲 | 午夜嘿嘿嘿影院 | 一本久久伊人热热精品中文字幕 | 欧美变态另类xxxx | 狠狠综合久久久久综合网 | 岛国片人妻三上悠亚 | 一个人看的视频www在线 | 国内丰满熟女出轨videos | 国产精品嫩草久久久久 | 牲欲强的熟妇农村老妇女视频 | 窝窝午夜理论片影院 | 青春草在线视频免费观看 | 任你躁在线精品免费 | 精品久久久久久亚洲精品 | 久久久精品欧美一区二区免费 | 国产九九九九九九九a片 | 国产午夜亚洲精品不卡 | 午夜精品久久久内射近拍高清 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 中文字幕无码人妻少妇免费 | 扒开双腿疯狂进出爽爽爽视频 | 一区二区三区高清视频一 | 强伦人妻一区二区三区视频18 | 久久99久久99精品中文字幕 | 九月婷婷人人澡人人添人人爽 | 成年美女黄网站色大免费视频 | 国产麻豆精品一区二区三区v视界 | 内射爽无广熟女亚洲 | 无套内射视频囯产 | 少妇久久久久久人妻无码 | 亚洲一区二区三区偷拍女厕 | 国产午夜亚洲精品不卡 | www一区二区www免费 | 国产莉萝无码av在线播放 | 我要看www免费看插插视频 | 亚洲爆乳大丰满无码专区 | 18无码粉嫩小泬无套在线观看 | 人妻少妇精品久久 | 国产精品内射视频免费 | 亚洲精品一区二区三区婷婷月 | 无码人妻精品一区二区三区不卡 | 久久久国产精品无码免费专区 | 久久久久久久人妻无码中文字幕爆 | 中文字幕 亚洲精品 第1页 | 欧美高清在线精品一区 | 牛和人交xxxx欧美 | 国内精品九九久久久精品 | 亚洲自偷自偷在线制服 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品国产青草久久久久福利 | 亚洲欧洲日本综合aⅴ在线 | 无套内射视频囯产 | www国产亚洲精品久久久日本 | 亚洲精品成人福利网站 | 又湿又紧又大又爽a视频国产 | 国产亚洲精品久久久久久大师 | 欧美激情内射喷水高潮 | 亚洲男人av香蕉爽爽爽爽 | 国产绳艺sm调教室论坛 | 久久人人爽人人爽人人片ⅴ | 成人无码视频免费播放 | 人妻无码αv中文字幕久久琪琪布 | 丰满人妻翻云覆雨呻吟视频 | 日日碰狠狠躁久久躁蜜桃 | 亚洲一区二区三区四区 | 久久人妻内射无码一区三区 |