日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

顶级极客技术挑战赛,你敢来挑战吗?| 大神登峰造极

發布時間:2024/4/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 顶级极客技术挑战赛,你敢来挑战吗?| 大神登峰造极 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是極客君,去年鵝廠內部極客圈舉辦了第二次極客大賽,題目如下:

"實現一個世界上最小的程序來輸出自身的MD5"

作為極客圈一員的我也參加了比賽,比賽競爭很激烈,為了爭奪一個字節的優勢,大家都拿出自己的絕活,比賽重新刷新了我對匯編的認知和對程序運行原理理解,昨天分享一個典型的樸素解法:

最小MD5挑戰賽,你敢來戰嗎?

但這篇"菜鳥"樸素解法,已經讓有些人看得不知所云,其實要完全理解其中一些技巧,可能需要實際操作一下,計算機實踐很重要,看不懂也可以做個吃瓜群眾,長長見識也可以。

上篇文章說過點贊在看超過20,今天就放出大神解法,我相信此法一出,評論區會一片驚呼:

A:天啊,這個男人不得了,他做到了最短!

B:神仙打架

C :??膜拜第一名大佬,各種技巧溜得飛起,學習了

? ? ?

D :? 跪著看完了,厲害!

E? :??降維打擊

...

文章稍微有點長,不想慢慢看完,可以直接拉到底,接下來該你上場表演了。

開闊眼界的大神解法

299字節打印自身的MD5,NO.1(冠軍)

用 nasm 寫匯編,手動構造 ELF 格式文件。ELF 文件分為三部分:

[A] [B] [C]

其中 A 的長度為 64 的倍數,B+C 的長度 <= 55。

A+B 包括:ELF 文件頭、計算 MD5 一個 block 的代碼、輸出 16 進制的代碼。盡可能壓縮這部分代碼的大小。

C 是對 A 計算 MD5(不加 padding)的中間結果,13 字節。(為什么是 13 不是 16?因為撞了 3 個字節,詳見下文。)

思路

大的方向無非就這些:

  • 撞:理想情況下,我們的程序就簡單執行一條輸出指令,撞出一個滿足?MD5(print(md5_string)) == md5_string?的?md5_string。

  • 利用外部能力:調用外部程序,或者利用 Linux 內核中的 MD5 實現。

  • 算:程序讀取自身,計算 MD5 并輸出。

  • 如果考慮撞,MD5 有 128 位,2 的 128 次方據說已經超過了宇宙中基本粒子的數量,窮舉顯然是不行的,只能用密碼學的方法構造。鑒于本文作者的密碼學知識接近于 0,就不賣弄了,不過據群里的同學說這樣構造出來的文件會很大,并不適合本次比賽。

    而利用外部能力的路已經被堵死,不允許 fork,也不允許使用 socket,此路不通。

    看來可行的方法就是算,成了一個純工程優化問題。這一塊正好本文作者有點經驗,研究生方向是編譯器,做的題目是 code size reduction。

    MD5 算法

    第一想法是去抄開源代碼,我一開始抄了 Linux kernel 里的 MD5 實現,但后來發現并不適合本次比賽。開源的 MD5 實現為了性能大都做了人工循環展開和常量預計算,會把代碼撐得很大。不如直接照著 MD5 算法的偽碼來寫,維基百科上面的偽代碼寫得夠清晰,就它了。

    簡單描述:

    需要先對原始數據做 padding,將它的長度變成 64 字節的整數倍,MD5 算法在 64 字節長的 block 上進行。

    具體 padding 方法:在原始數據后增加一字節 0x80,然后再增加若干個 0,直到總長度為 64 的倍數,并且最后至少留出 8 個字節的位置,用于填寫 little endian 編碼的原始數據總長度(按位計,即字節數乘以 8)。

    Padding 完成后,對每個 64 字節 block 進行計算,block 的計算方法參考下一節的代碼。每一輪計算結束后更新 16 字節的 MD5 狀態,最后一輪計算完成后,將狀態用 16 進制打印出來。

    C++ 實現

    以下是一個 C++ 寫的完整實現,在不太損失可讀性的前提下用較簡短的寫法,不考慮性能:

    #include <cmath> #include <cstdio> #include <cstring> #include <memory>using namespace std;static const uint8_t SHIFT[] = {7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21};// 注:為了省事,下面代碼假設了 CPU 是 little endian static void compute_md5(void* result, const void* orig_data, size_t orig_size) {uint32_t* hash = reinterpret_cast<uint32_t*>(result);hash[0] = 0x67452301;hash[1] = 0xefcdab89;hash[2] = 0x98badcfe;hash[3] = 0x10325476;// 計算padding后的總長度size_t padded_size;if (orig_size % 64 > 55) {padded_size = orig_size / 64 * 64 + 128;} else {padded_size = orig_size / 64 * 64 + 64;}// 增加paddingstd::unique_ptr<char[]> padded_data(new char[padded_size]);memset(padded_data.get(), 0, padded_size);memcpy(padded_data.get(), orig_data, orig_size);padded_data[orig_size] = 0x80;*(uint64_t*)(padded_data.get() + padded_size - 8) = orig_size * 8;// 開始計算for (const uint32_t* data = (const uint32_t*)padded_data.get();padded_size >= 64; data += 16, padded_size -= 64) {uint32_t a = hash[0];uint32_t b = hash[1];uint32_t c = hash[2];uint32_t d = hash[3];for (int i = 0; i < 64; ++i) {uint32_t f, g;if (i < 16) {f = ((c ^ d) & b) ^ d; // 等價于 (b & c) | ((~b) & d);g = i;} else if (i < 32) {f = ((b ^ c) & d) ^ c; // (d & b) | ((~d) & c);g = 5*i + 1;} else if (i < 48) {f = b ^ c ^ d;g = 3*i + 5;} else {f = c ^ (b | (~d));g = 7*i;}uint32_t K = static_cast<uint32_t>(fabs(sin(i + 1)) * 4294967296.0);f += a + K + data[g % 16];int shift_val = SHIFT[(i / 16) * 4 + (i % 4)];f = (f << shift_val) | (f >> (32 - shift_val));a = d;d = c;c = b;b += f;}hash[0] += a;hash[1] += b;hash[2] += c;hash[3] += d;} }int main(int argc, char** argv) {FILE* fp = fopen(argv[0], "rb");if (fp == nullptr) {perror("Failed to open file");return 1;}char buffer[65536];size_t len = fread(buffer, 1, sizeof(buffer), fp);fclose(fp);unsigned char result[16];compute_md5(result, buffer, len);for (int i = 0; i < 16; ++i) {printf("%02x", result[i]);}putchar('\n');return 0; }

    這個版本用?g++ -Os?編譯出來,strip 一下,不做其他處理,大約 14 KB。

    用匯編改寫

    接下來的任務就是想辦法用匯編重寫這個 14 KB 的程序,將代碼壓縮到最小。

    手動構造 ELF

    手動構造 ELF 網上能找到不少例子,例如:Smallest executable program (x86-64)。它使用 nasm 構造了一個最小的 64 位 ELF,先照著它搭個架子。

    這個例子提供了兩個思路:(1) ELF 頭部有很多不重要的字段,可以用來放代碼或數據 (2) ehdr 的最后 8 個字節和 phdr 的最前面 8 個字節可以重合。

    借助 nasm 可以很容易地將 file size 硬編碼到代碼里。還有?%define、%if?等也可以幫助我們省很多事。

    手動構造 ELF 以后,也不再需要再去讀文件,加載到內存里的地址完全受我們控制了,直接去讀。

    系統調用

    沒有 C 庫以后,系統調用需要自己寫。x86-64 有 syscall 指令,發起系統調用很方便。

    • 入參:

      • eax = 系統調用號,可以在?/usr/include/asm/unistd_64.h?文件中找到

      • rdi, rsi, rdx, r10, r8, r9 分別為第 1 至 6 個參數

    • 出參:

      • rax = 返回值(如果失敗,返回 -errno)

      • rcx, r11 被破壞(它們分別被 syscall 指令用來保存返回地址和 rflags)

      • 其他寄存器的值保留

    假設棧頂 32 字節是計算好的 MD5 字符串,輸出的系統調用:

    0: b8 01 00 00 00 mov eax,0x1 ; write 系統調用5: bf 01 00 00 00 mov edi,0x1 ; 標準輸出a: 48 89 e6 mov rsi,rsp ; 指針d: ba 20 00 00 00 mov edx,0x20 ; 長度 32 字節12: 0f 05 syscall

    匯編代碼優化

  • 預先計算 MD5 中間狀態

    將 ELF 文件分為三部分:[A] [B] [C]

    其中 A 的長度為 64 的倍數,B+C 的長度 <= 55。

    A+B 包括:ELF 文件頭、計算 MD5 一個 block 的代碼、輸出 16 進制的代碼。

    C 是對 A 計算 MD5(不加 padding)的中間結果,16 字節,由輔助腳本計算并填入。(后面會把 C 變成 13 字節,見下文。)

    這樣可以省掉外層循環,匯編只用計算最后 64 位字節。

  • 避免 copy

    默認 text 段是不可寫的,可以修改 p_flags,從 5 (可讀可執行) 寫為 7 (可讀寫可執行),同時把 p_memsz 改大一些。這樣 padding 就可以直接加在后面,不需要再拷貝到棧上。

  • 分支之間共用指令

    注意最內層的那一串 if-else:有兩個分支都用到?b^c,還有兩個分支計算?f?的最后一步是?^c,還兩個分支計算?f?的最后一步是?^d。這里代碼都可以共用,不僅可以省掉幾個字節,更重要的是,分支代碼碼變得更短以后,更容易塞到文件頭里面。

  • 指令選擇

    盡量選用早期 x86 就有的指令,一般編碼會比較短。很多不常用的指令,只因為生得早,占了好坑,都只要一兩個字節。

    例如:lodsb?只要一個字節,而?mov al,[rsi]; inc rsi?要好幾個。

    又如,loop addr?指令大致相當于?dec ecx; jnz addr,也少了好幾個字節。沒有哪個現代編譯器會主動生成這個指令,實際上 Intel 也不建議用,較新的 CPU 里沒有為這個指令做優化,性能偏低。但對本題卻相當合適。

    拿不準的時候多試幾次,用 objdump 看哪個短。

  • 寄存器的選擇

    優先使用從 32 位時代沿襲下來的 8 個寄存器 (rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp),避免使用 r8-r15。對于很多指令,使用 r8-r15 會多占一個字節。例如:

    0: 41 83 e0 01 and r8d,0x14: 83 e0 01 and eax,0x1
  • 用最短的代碼賦值小常量給寄存器

    對 0 值,對寄存器異或自身:xor eax, eax。這個很常見,減少代碼體積,也不損失性能,Intel 也推薦這樣寫。

    對于非 0 值,下面的寫法就損失性能了,但對本題有用。

    將常量 1 賦給 ebx,最自然的寫法 5 個字節:

    0: bb 01 00 00 00 mov ebx,0x1

    這樣寫只要 4 個字節(如果知道 ebx 的高位已經是 0,則只需后一指令,2 個字節):

    0: 31 db xor ebx,ebx 2: b3 01 mov bl,0x1

    這樣寫只要 3 個字節:

    0: 6a 01 push 0x1 2: 5b pop rbx
  • 32 位 or 64 位寄存器

    x86-64 有一個特性,目標操作數是 32 位寄存器時,會同時清空對應 64 位寄存器的高 32 位。所以?xor eax, eax?與?xor rax, rax?等價;mov eax, 1?也與?mov rax, 1?等價。使用 32 位寄存器常常可以省一個字節(r8-r15 除外):

    0: 31 c0 xor eax,eax 2: 48 31 c0 xor rax,rax

    但注意,在作為地址時,情況相反,64 位少一個字節:

    0: 67 8d 43 08 lea eax,[ebx+0x8] 4: 8d 43 08 lea eax,[rbx+0x8]
  • 進程初始狀態

    網上說 Linux 進程啟動時,除了 RCX 以外,其他寄存器的值都不確定。但實測拿到的都是 0,所以省略對寄存器清 0 的操作。

    (有的資料說其他寄存器會繼承?execve?之前的值,懶得去驗證,不過對此存疑。如果操作系統不清 0,這會是一個安全漏洞,父進程可能無意中漏泄信息給子進程。)

  • 使用 16 位地址

    ELF 的常見初始虛擬地址是諸如 0x8048000 這樣的值,把它改成 0x1000,這樣兩個字節可以放下地址。

    不能比 0x1000 更小了,因為 0x1000 == 4096 是一個頁面的大小,在最前面至少要留一個頁面,否則 NULL 會成為有效指針。

  • 棧優化

    棧涉及到內存操作,比用寄存器慢。然而 push、pop 作為元老級的 8086 指令,編碼超級短,前 8 個寄存器的 push、pop 只要一個字節。

    0: 50 push rax 1: 5b pop rbx 2: 48 89 c3 mov rbx,rax

    在這個例子里,出棧再入棧竟然比 mov 少一個字節!

  • 浮點運算

    現在 Intel 推薦用 SSE/AVX 來做浮點運算,但對本題還是 x87 香,計算 sin、取絕對值都是一條指令的事情(兩個字節)。

    x87 寄存器是棧式的,寫復雜的算式比較麻煩。好在本題的式子并不復雜,下面幾行代碼就可以計算出?(fabs(sin(i + 1)) * 4294967296.0),其中?[rbx-0x14]?指向一個預存了?4294967296.0?的地址。

    10d4: 50 push rax ; i+1 入棧10d5: db 04 24 fild DWORD PTR [rsp] ; 轉成浮點數,放到st010d8: d9 fe fsin ; sin10da: d9 e1 fabs ; abs10dc: d8 4b ec fmul DWORD PTR [rbx-0x14] ; 乘以 429496729610df: dd 0c 24 fisttp QWORD PTR [rsp] ; 轉成整數,寫到棧頂10e2: 5a pop rdx ; 出棧,讀到結果
  • pext 指令

    C++ 代碼里有一處?(i / 16) * 4 + (i % 4),很適合用 pext 指令來實現。pext 是一條 BMI 2 指令,可以簡便地從源操作數里抽一些不連續的位出來。

    假設?i?放在 eax,那么用?pext ecx, eax, bit_mask?(bit_mask = 0b00110011) 就可以從?i?里面提取出第 0、1、4、5 位,正好就是?(i / 16) * 4 + (i % 4)?的值。

  • 使用 near 跳轉

    jmp、jcc 都有 8 位偏移和 32 位偏移兩個版本。32 位太浪費,盡量調整代碼塊的位置,讓所有跳轉都變成 8 位(跳轉范圍在 -128 至 127 字節之間)。實在避免不了的,用兩條短 jmp 中轉一下都能節省一個字節。

  • 尋址優化

    x86-64 提供了相對 rip 的尋址,為位置無關代碼(PIC)提供了很大便利。又由于它比絕對尋址短,所以編譯器通常在非 PIC 代碼中也會使用它。

    但遺憾的是,它始終使用 32 位偏移量,太浪費。可以考慮固定使用一個寄存器保存一個地址,后面的尋址都相對它進行,并設法將偏移保持在 8 位的范圍內(-128 至 127)。

    對比以下三條指令的長度:

    0: 8b 43 02 mov eax,DWORD PTR [rbx+0x2] 3: 8b 05 02 00 00 00 mov eax,DWORD PTR [rip+0x2] 9: 8b 04 25 02 00 00 00 mov eax,DWORD PTR [0x2]
  • 調用函數

    call 指令沒有 8 位偏移的版本,32 位偏移很浪費。先將函數地址裝到一個寄存器,再 call 這個寄存器,只要兩個字節:

    0: ff d3 call rbx
  • 最后撞三個字節

    寫完代碼以后,發現 ELF 頭部還剩兩個可以自由修改的字節。代碼里還有一些等效的指令,例如,當已知 eax 和 ecx 的值相等時,下面四條指令等價:

    lea ecx, [rax+rax*4+1] lea ecx, [rax+rcx*4+1] lea ecx, [rcx+rax*4+1] lea ecx, [rcx+rcx*4+1]

    又如,在判斷循環條件時,下面代碼里的?jb?可以替換為?jne:

    inc eax cmp al, 64 jb _loop_md5

    于是,通過給 nasm 增加參數?-Dalternative=...,并在代碼里使用?%if alternative = ...?來選擇使用哪一種等價的寫法。

    再寫一個額外的程序來遍歷頭部兩個字節的值,以及代碼中這些有?alternative?的地方的指令選擇,使得計算出的 MD5 的中間結果的最后三個字節是?0x80 0x00 0x00,即與 MD5 padding 的前三個字節相同,這樣就可以從文件內容中省去這三個字節。

    代碼

    完整代碼:

    bits 64; 定義“變量”對應的寄存器; R_ 表示 64 位,r_ 表示對應的 32 位,_w 表示低 16 位, _l 表示低 8 位%define r_base ebx ; 始終指向$$+offs%define R_base rbx%define r_base_w bx;%define r_a r8d ; a,b,c,d 在內層循環中保存MD5狀態;%define R_a r8 ; r_a 現在不占用寄存器了,移到棧頂 [rsp]%define r_b edi%define R_b rdi%define r_c ebp%define R_c rbp%define r_d edx%define R_d rdx%define r_i eax ; 內層循環下標%define R_i rax%define r_i_l al%define r_f esi ; 內層循環中的變量 F; ecx用作臨時變量; 一般是使用 0x8048000,故意改成一個很小的數,以便兩個字節可以放下地址 %define base 0x1000org base ehdr: ; Elf64_Ehdrdb 0x7F, "ELF", 2, 1, 1, 0 ; e_ident; times 8 db 0; 這個代碼塊正好8字節,放這里 _16_to_32:; if (16 <= i && i < 32) {; g = 5*i + 1;; f = ((b ^ c) & d) ^ c; // (d & b) | ((~d) & c);; }%if alternative = 1 ; alternative用于控制生成多種等效的代碼,fill.py會對它們進行遍歷,; 找到使MD5中間結果最后幾個字節恰好等于 0x80 0x00 0x00 的組合lea ecx, [R_i+R_i*4+1]%elif alternative = 2lea ecx, [R_i+rcx*4+1]%elif alternative = 3lea ecx, [rcx+R_i*4+1]%elselea ecx, [rcx+rcx*4+1]%endifand r_f, r_djmp _reuse_code ; _16_to_32 與 _32_to_48 最后一條指令相同,jmp過去省兩個字節 times 8 - ($ - _16_to_32) db 0; enddw 2 ; e_typedw 62 ; e_machine;dd 1 ; e_version (modifiable) _0x1p32 dd 4294967296.0 ; pow(2.0, 32)dq _start ; e_entrydq phdr - $$ ; e_phoff;dq 0 ; e_shoff (modifiable);dd 0 ; e_flags (modifiable);dw ehdrsize ; e_ehsize (modifiable); 14個可以修改的字節,放一個函數在此(13字節); 將al低4位轉為1位16進制 _make_hex:and eax, 15cmp al, 10jb .lt10add al, 'a' - '0' - 10 .lt10:add al, '0'stosbret; 剩一個字節,放pext的mask%if alternative = 1 _pext_mask db 0b00110011%elif alternative = 2 _pext_mask db 0b01110011%elif alternative = 3 _pext_mask db 0b10110011%else _pext_mask db 0b11110011%endif times 14-($-_make_hex) db 0dw phdrsize ; e_phentsize;; overlap the last 8 bytes of ehdr with phdr phdr: ; Elf64_Phdrdd 1 ; p_type = 1; e_phnum (word, 1); e_shentsize (word, modifiable)db 7 ; p_flags=7 (readable, writable, executable)db 0 ; 這個字節留給fill.py修改 (p_flags只要最低1字節對即可,高位隨便改) _context_ptr dw base + (_context - $$) ; e_shnum (word, modifiable); e_shstrndx (word, modifiable)ehdrsize equ $ - ehdrdq 0 ; p_offsetdq $$ ; p_vaddr;;dq $$ ; p_paddr (modifiable) _0_to_16: ; 這個代碼塊正好8字節,放這里; if (i < 16) {; g = i;; f = ((c ^ d) & b) ^ d; // (b & c) | ((~b) & d);; }mov r_f, r_cxor r_f, r_dand r_f, r_bjmp _reuse_code_2 ; _0_to_16 與 _48_to_64 最后一條指令相同,jmp過去省兩個字節 times 8-($-_0_to_16) db 0dq filesize ; p_filesz;dq filesize+512 ; p_memsz; 挪用p_memsz用于存一些其他數據,只要這里填的值至少比filesize大一些,但又不要過于; 巨大以免運行錯誤 _16_to_32_relay: jmp short _16_to_32 ; 中轉向_16_to_32的跳轉,便得兩處跳轉都使用8位偏移量 _compute_start_ptr dd ($$ + filesize - filesize % 64) times (8 - ($ - _16_to_32_relay)) db 0;dq 0x1000 ; p_align;; p_align是phdr的最后8個字節,對靜態鏈接的代碼沒什么用,省去 phdrsize equ $ + 8 - phdr_shift db 7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21%assign start_of_code base + ($ - $$) %warning code: start_of_code_48_to_64:; if (i >= 48) {; g = 7*i;; f = c ^ (b | (~d));; }%if alternative = 1imul ecx, r_i, 7%elseimul ecx, 7%endifmov r_f, r_dnot r_for r_f, r_b _reuse_code:xor r_f, r_cjmp _join; R_base 偏移 offs 字節,指向 _make_hex offs equ _make_hex - $$; 程序入口 _start:mov r_base_w, base + offs ; mov r_base, $$ + offs; 文檔說進程啟動時rdi的值未定,但實測至少tlinux2; 保證了它是0mov esi, [R_base - offs - $$ + _context_ptr]; 本來這里應該用movzx讀2個字節的,但正好后面2個字節也是0,就用mov省一個字節push rsi; MD5 paddingmov byte [rsi + _end - _context], 0x80mov word [rsi + _end - _context + paddingsize - 8], filesize*8; uint32_t a = hash[0];; uint32_t b = hash[1];; uint32_t c = hash[2];; uint32_t d = hash[3];push qword [rsi]mov r_b, [rsi + 4]mov r_c, [rsi + 8]mov r_d, [rsi + 12]; for (int i = 0; i < 64; ++i) {; xor r_i, r_i ; 文檔說啟動時rax的值未定,實測至少tlinux2上進程啟動時eax=0 _loop_md5:; 有兩個分支用到 b^c,在分支前先算出來放到f,省兩個字節mov r_f, r_b ; f = b ^ cxor r_f, r_cmov ecx, r_i ; g = icmp r_i_l, 16jb _0_to_16cmp r_i_l, 32jb _16_to_32_relaycmp r_i_l, 48jae _48_to_64_32_to_48:; if (32 <= i && i < 48) {; g = 3*i + 5;; f = b ^ c ^ d;; }%if alternative = 1lea ecx, [R_i+R_i*2+5]%elif alternative = 2lea ecx, [R_i+rcx*2+5]%elif alternative = 3lea ecx, [rcx+R_i*2+5]%elselea ecx, [rcx+rcx*2+5]%endif _reuse_code_2:xor r_f, r_d_join:; f += a; a = d;; (d := garbage)xchg r_d, [rsp]add r_f, r_d; f += in[g % 16];and ecx, 15mov r_d, [R_base - offs - $$ + _compute_start_ptr]add r_f, [R_d + rcx*4]; int shift_val = _shift[(i / 16) * 4 + (i % 4)];pext ecx, r_i, [R_base-offs-$$+_pext_mask] ; _pext_mask的高24位不是0,不過不影響,因為r_i高位全是0mov cl, [R_base-offs-$$+_shift+rcx] ; [_shift + rcx]; K[i] := floor(2^32 × abs (sin(i + 1)))inc r_ipush R_ifild dword [rsp]fsinfabsfmul dword [R_base-offs-$$+_0x1p32] ; * 2^32fisttp qword [rsp]; f += K[i]pop R_d ; 把r_d當作臨時寄存器用一下,pop出來的是剛才fisttp寫入[rsp]的值,即K[i]add r_f, r_d; f = (f << shift_val) | (f >> (32 - shift_val));rol r_f, cl; d = c;; c = b;; b += f;mov r_d, r_cmov r_c, r_badd r_b, r_f; }cmp r_i_l, 64%if alternative = 1jb _loop_md5%elsejne _loop_md5%endif; hash[0] += a;; hash[1] += b;; hash[2] += c;; hash[3] += d;pop rax ; Apop rsi ; _contextadd [rsi], eaxadd [rsi+4], r_badd [rsi+8], r_cadd [rsi+12], r_d; PRINT HEX;xor ecx, ecx ; 從前面循環里出來,ecx高位還是0mov cl, 16 ; mov ecx, 16lea edi, [rsi+16].loop_print_hex:mov al, [rsi]shr eax, 4call R_base ; call _make_hexlodsbcall R_base ; call _make_hexloop .loop_print_hex;rsi is already buffer of hex stringmov al, 1 ; mov eax, 1 (write) (eax高位已經是0)mov edi, eax ; mov edi, 1 (1 = stdout)%if alternative = 1lea edx, [rax+31] ; mov edx, 32; 用lea比mov短一點%elselea edx, [rdi+31]%endifsyscall; 返回后eax=32; EXIT%if alternative = 1mov al, 231 ; exit_group (eax高位已經是0)%elif alternative = 2add al, 231-32 ; 同上%elif alternative = 3sub al, 32-231 ; 同上%elif alternative = 4mov al, 60 ; exit (eax高位已經是0)%elif alternative = 5add al, 60-32 ; 同上%elsesub al, 32-60 ; 同上%endifxor edi, edisyscall%if ($ - $$) % 64 > 64 - 13 - 9 %assign wasted_padding 64 - ($ - $$) % 64 %warning Wasted padding bytes: wasted_paddingalign 64 %endif; _context 的初始內容由 fill.py 填入 _context: times 13 db 0 ; 最后三個字節由fill.py保證正好是0x80 0x00 0x00 (和MD5的padding一致)_end:filesize equ $ - $$ main_loops equ (filesize + 9 + 63) / 64 ; MD5算法循環次數 paddingsize equ 64 * main_loops - filesize ; 原始數據后需要附加的字節數%assign filesize filesize %warning File size: filesize

    光憑這個 asm 還不夠,還要配合碰撞的腳本才能編譯出來正確的二進制:

    • README.md:解題描述

    • build.ninja:編譯腳本

    • main.asm: 主程序

    • fill.py: 用于碰撞 3 個字節的腳本

    • fill_helper.cpp: fill.py 的輔助代碼(用 C++ 加速)

    • md5.out: 最終的 299 字節可執行文件

    • cpp_reference.cpp:C++ 參考實現

    最終文件?md5.out?。從源碼編譯需要先安裝 Python 3、ninja、nasm,然后運行 ninja 命令,等 10~20 分鐘(取決于機器性能),就能得到 md5.out。

    感興趣的小伙伴,可以在公眾號回復“md5”獲取完整實現。


    大神解法,我是跪著看完了,歡迎小伙伴在留言區打上666,膜拜一下大佬,

    如果文章給你長見識了,那就一鍵三連繼續支持,點贊和在看超過30,我就放另辟蹊徑的野路子解法:

    絕對讓你感嘆腦洞如此之大,讓人望其項背。

    推薦閱讀

    最小MD5挑戰賽,你敢來戰嗎?

    頂級C程序員之路

    一個奇葩的網絡問題

    C++模版的本質

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的顶级极客技术挑战赛,你敢来挑战吗?| 大神登峰造极的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    久久情爱 | 黄色特级毛片 | 成人性生交大片免费观看网站 | 免费三级大片 | 91在线日韩| 欧美精品一区二区三区四区在线 | 99色人| av在线播放网址 | 色婷婷电影 | 在线免费观看黄色 | 在线久久| 伊人亚洲综合网 | 亚洲欧美综合精品久久成人 | 毛片网站免费在线观看 | 国产高清免费在线播放 | 在线不卡a| 亚洲精品国偷自产在线99热 | 97国产精品久久 | 国产一区二区在线免费视频 | 亚洲精品视 | 日本性xxxxx| 国产伦理一区二区三区 | 国产精品久久嫩一区二区免费 | 亚洲乱码久久久 | 五月婷丁香网 | 亚洲精品国偷拍自产在线观看蜜桃 | 精品国产乱码久久久久久三级人 | 国产视频中文字幕 | 免费一级特黄毛大片 | 探花视频免费在线观看 | 久草精品免费 | 日一日干一干 | 最近更新中文字幕 | 91九色porn在线资源 | 在线国产一区 | 日韩在线无 | 在线观看国产区 | av电影久久| 波多野结衣一区二区三区中文字幕 | 蜜臀av免费一区二区三区 | 天天曰视频 | 最新日韩在线 | 色婷婷视频在线 | 国产精品精品国产婷婷这里av | 久久99精品波多结衣一区 | 欧美成人h版 | 国产91在线观看 | 中文av一区二区 | 久久精品久久精品久久 | 精品亚洲免费 | 在线免费观看视频一区二区三区 | 人人澡人人爽欧一区 | 天天透天天插 | 国产日本三级 | 91麻豆视频 | 亚洲在线视频观看 | 国产无吗一区二区三区在线欢 | 国产亚洲va综合人人澡精品 | 中国成人一区 | 在线观看精品一区 | 日韩黄色免费在线观看 | 深爱激情久久 | 91精品视频在线免费观看 | 成人久久久久久久久久 | 香蕉视频在线观看免费 | 九九99| bbbbb女女女女女bbbbb国产 | 婷婷色在线观看 | 国产精品视频线看 | 国产成人在线免费观看 | 亚洲精品视频在线 | 香蕉在线观看视频 | 天天草视频 | 免费99视频 | 岛国av在线不卡 | 久久亚洲福利视频 | 国产精品免费观看在线 | 国产资源网| 亚洲精品网页 | 成人在线你懂得 | 天天操天天色综合 | 欧美综合在线视频 | 97人人爽人人 | 日韩三级不卡 | 国产一级三级 | 免费观看第二部31集 | 国产黄色特级片 | 日韩专区 在线 | 337p日本欧洲亚洲大胆裸体艺术 | 在线不卡中文字幕播放 | 亚洲在线视频网站 | 91av在线视频免费观看 | 毛片基地黄久久久久久天堂 | 狠狠狠狠狠狠狠干 | 日韩一区二区三区观看 | 九九免费观看全部免费视频 | 人人爽人人做 | 国产拍揄自揄精品视频麻豆 | 一级免费av | 国产免费高清视频 | 精品国产乱子伦一区二区 | 精品国产一区二区三区久久久 | 激情综合亚洲精品 | 天天躁天天狠天天透 | 久久午夜视频 | 久草在线视频看看 | 日韩欧美高清免费 | 狠狠操狠狠插 | 国产69精品久久久久9999apgf | 在线 国产 日韩 | 亚洲一区二区精品视频 | 国内外成人在线视频 | 色综合中文字幕 | www.国产毛片| 99久高清在线观看视频99精品热在线观看视频 | 6080yy精品一区二区三区 | 成人黄色小视频 | 久草在线网址 | 色妞色视频一区二区三区四区 | 日韩在线免费 | 欧美一区二区在线免费观看 | 最近日本mv字幕免费观看 | 亚洲综合射 | 免费在线观看黄网站 | 亚洲精选视频免费看 | 国产精品观看在线亚洲人成网 | 精品久久久久久久久久久院品网 | 色在线观看网站 | 日日操夜夜操狠狠操 | 91丨九色丨蝌蚪丨对白 | 亚洲精品免费在线观看视频 | www狠狠 | 99精品视频免费在线观看 | 国产成人在线观看 | 成人精品视频久久久久 | 成人小视频在线免费观看 | 狠狠狠狠狠狠天天爱 | www.婷婷色| 久久精品婷婷 | 99热这里有精品 | 国产又粗又硬又长又爽的视频 | 国产精品白浆 | 国产精品久久一区二区三区, | 亚洲一区二区麻豆 | 亚洲永久精品在线观看 | 国产精品久久av | 久久久久久综合 | 久久久久免费精品国产小说色大师 | 亚洲精品午夜久久久久久久久久久 | 2019中文字幕网站 | 午夜精品一区二区三区免费视频 | 波多野结衣在线播放视频 | 91看片淫黄大片在线播放 | 国产一区二区三区免费观看视频 | 天天色欧美 | 亚洲第一中文字幕 | 久久精品亚洲国产 | 欧美经典久久 | 国产视频二区三区 | 精品人妖videos欧美人妖 | 国产精品午夜在线观看 | 99久热精品 | 免费人成网| 激情五月亚洲 | 久久久精品网站 | 超碰99人人 | 我要色综合天天 | 在线免费国产 | 在线播放日韩av | 色噜噜狠狠狠狠色综合久不 | 蜜臀av免费一区二区三区 | 国产超碰97| 国产黄色在线看 | 97超碰人人网 | 精品成人网 | 欧美精品黑人性xxxx | 在线观看日本高清mv视频 | 欧美激情xxxx | av官网在线 | 最近中文字幕免费观看 | 日韩中文字幕一区 | 国产精品二区三区 | 国产高清久久 | 国产高清在线看 | 欧美男女爱爱视频 | 九九视频免费在线观看 | 天天操天天怕 | 一区二区三区国产精品 | 亚洲精品视频在线 | 日韩免费观看一区二区三区 | 国产精品久久一区二区三区, | 久久成人精品电影 | 成人黄色av免费在线观看 | 欧美网址在线观看 | 国产精品久久一区二区三区, | 久久精品99久久久久久 | 黄网站色| 国产一性一爱一乱一交 | 奇米影视777四色米奇影院 | 最近中文字幕大全 | 日韩一级片观看 | 欧日韩在线 | 美女网站久久 | 日韩久久午夜一级啪啪 | 日日操日日插 | 狠狠干干 | 国产亚洲婷婷免费 | 9在线观看免费高清完整 | 九九九九热精品免费视频点播观看 | 国产免费视频在线 | 五月婷婷丁香在线观看 | 亚洲激情在线观看 | 日韩欧美视频一区二区三区 | 国产成人精品亚洲精品 | av免费电影网站 | 美女免费视频一区 | 亚洲精品字幕 | 国产精品av久久久久久无 | 中文字幕在线观看免费高清完整版 | 91在线看网站 | 精品视频中文字幕 | 婷婷丁香综合 | 天天做天天干 | 免费黄色在线播放 | 狠狠色综合网站久久久久久久 | 欧美另类人妖 | 色之综合网 | 免费成视频 | 久久久久免费观看 | 免费在线激情视频 | av日韩中文 | 久久免费国产精品 | 国产精品综合在线 | 91精品在线看 | 免费男女羞羞的视频网站中文字幕 | 欧美极度另类性三渗透 | 亚洲午夜小视频 | 久草视频视频在线播放 | 在线观看小视频 | 丁香婷婷电影 | 色综合久久久久综合99 | 国产精品涩涩屋www在线观看 | 久久男人免费视频 | 久久免费视屏 | 在线 视频 一区二区 | 国产精品s色 | 久草在线视频资源 | 欧美a级片网站 | 久久福利电影 | 日本成人免费在线观看 | 久久久午夜精品理论片中文字幕 | 国产美女久久久 | 久久精品视频国产 | 日韩在线免费高清视频 | 色吊丝在线永久观看最新版本 | 激情视频在线观看网址 | 日韩欧美在线观看一区二区三区 | 国产精品99在线播放 | 日韩免费在线观看 | 欧美久久久久久久久中文字幕 | 激情综合五月天 | 久久久久久久久久久电影 | 亚洲男男gⅴgay双龙 | 99热999 | 国产欧美日韩一区 | 欧美精品久久人人躁人人爽 | 99久久精品国 | 国产玖玖视频 | 在线va视频 | 亚洲h视频在线 | 国产精品a久久久久 | 精品久久亚洲 | 欧美99精品| 99久久9| 国产高清视频在线播放一区 | 日韩中文字幕免费电影 | 最近日本中文字幕 | 亚洲激情婷婷 | 国产一卡久久电影永久 | 五月丁色 | 玖玖视频国产 | 麻豆影视在线观看 | 日韩毛片一区 | 国产精品一区二区在线观看 | 久久婷婷网 | 国产一级二级在线观看 | 欧美日韩调教 | 成人久久亚洲 | 日韩v欧美v日本v亚洲v国产v | 成 人 免费 黄 色 视频 | 国产精品精品久久久 | 日韩一区二区免费视频 | 国产在线久久久 | 97人人爽 | 国产无区一区二区三麻豆 | 成人中文字幕+乱码+中文字幕 | 久久韩国免费视频 | 亚洲91精品 | 午夜婷婷在线播放 | 免费看国产曰批40分钟 | 国内精品亚洲 | 天天摸日日摸人人看 | 久久国产一二区 | 午夜免费福利视频 | 精品国产1区2区3区 国产欧美精品在线观看 | 欧美成人精品在线 | av动图| 久草 | 午夜三级毛片 | 激情喷水 | 黄色免费观看 | 国产成人精品综合久久久 | 免费在线播放视频 | 成人h电影在线观看 | 1024手机在线看 | 一级久久精品 | 国产精品久久久久高潮 | 中文字幕在线观看不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 成在人线av | 久久国产亚洲 | 97在线精品 | 成人黄色电影在线 | 97视频在线播放 | 国产999精品 | 国产人成一区二区三区影院 | 特黄特色特刺激视频免费播放 | 精品一区二三区 | 很黄很黄的网站免费的 | 天天操伊人 | 日韩av免费在线电影 | 久久 国产一区 | av成人免费网站 | 天天操天天是 | 夜夜干夜夜 | 欧美乱大交 | 在线看片成人 | 亚洲精品国 | 久久与婷婷 | 综合在线观看色 | 人人爽夜夜爽 | 91视频com | 麻豆免费精品视频 | 久久久国产视频 | 免费成人在线视频网站 | 九九免费在线观看视频 | 丰满少妇麻豆av | 久久8| 国产人成免费视频 | 免费观看91 | 亚洲久草在线 | 国产精品免费久久久久久 | 久草在线网址 | 激情网站免费观看 | 亚洲va欧美va人人爽 | 人人干人人爽 | 日韩一区二区三区视频在线 | 中文字幕免费观看 | 午夜av一区 | 免费观看高清 | 久久精品之 | 99久久精品久久久久久动态片 | 久久久久福利视频 | 国产精品99久久久久久久久久久久 | 特级西西人体444是什么意思 | 亚洲天堂网在线播放 | 精品一区二区三区四区在线 | 国产一区二区不卡视频 | 麻豆网站免费观看 | 精品国产精品国产偷麻豆 | 99在线精品观看 | 欧美一区二区精品在线 | 夜夜躁日日躁狠狠久久88av | 久久久久久久免费看 | 99精品国产一区二区三区麻豆 | 久久国产精品电影 | 色狠狠操 | aⅴ视频在线 | 国产日韩欧美在线播放 | 91麻豆免费视频 | 国产小视频在线免费观看视频 | 在线你懂 | 日韩一区精品 | 国产精品 日韩 | 日日夜夜综合网 | 亚洲精品视频免费在线观看 | 久久久99精品免费观看app | 免费av的网站 | 丁香久久综合 | 欧美久久综合 | 欧美一级日韩免费不卡 | 少妇性aaaaaaaaa视频 | 日韩在线观看一区二区三区 | 国产亚洲精品无 | 中文字幕一区二区三区乱码在线 | 91亚洲国产成人久久精品网站 | 国产视频在线一区二区 | 亚洲国产精久久久久久久 | 成人在线视频你懂的 | 黄色影院在线观看 | 亚洲97在线 | 日韩欧美大片免费观看 | 国产精品久久久99 | 91免费在线 | av三级在线播放 | 国产精品一区二区白浆 | 久久精品精品电影网 | 黄色软件视频大全免费下载 | 欧美成人999 | 17videosex性欧美 | 精品麻豆| 天天激情天天干 | 婷婷丁香自拍 | 亚洲精品视频免费在线观看 | 久久久国产毛片 | 黄色软件在线观看视频 | 99久久夜色精品国产亚洲96 | av中文天堂| 国产精品v欧美精品v日韩 | 欧美美女视频在线观看 | 精品国产伦一区二区三区观看方式 | 欧美精品首页 | 亚洲精品动漫在线 | 黄色成人av | 国产不卡视频在线 | 中文不卡视频在线 | 国产精品一区二区吃奶在线观看 | 综合av在线 | aⅴ精品av导航 | 91超级碰 | 精品福利国产 | 免费观看性生活大片3 | 狠狠的操你 | 91麻豆精品国产 | 狠狠色狠狠色综合日日92 | 国产精品久久久久久999 | 中文字幕av最新 | 国产69精品久久久久9999apgf | 日韩动态视频 | 蜜桃视频在线观看一区 | 亚洲精品91天天久久人人 | 在线高清一区 | 国产精品a成v人在线播放 | 欧美视频二区 | 91成人免费在线视频 | 福利视频一区二区 | 精品久久久久久亚洲综合网 | 久久99久久精品 | 国产亚洲婷婷 | a在线观看视频 | 色婷婷激情五月 | 99在线观看 | 香蕉视频91 | 国产成人中文字幕 | 免费日韩一区 | 成人免费色 | 午夜精品一区二区三区可下载 | 亚洲在线日韩 | 韩国av电影在线观看 | 伊人婷婷在线 | 日韩国产欧美在线播放 | 麻豆久久 | 五月天综合在线 | 久热电影| av丝袜制服 | 精品产品国产在线不卡 | 国产在线理论片 | 91在线播 | 一本色道久久精品 | 成人久久久久 | 精品久久国产精品 | 欧洲av不卡 | 在线观看国产成人av片 | 国产成本人视频在线观看 | 99视频免费播放 | 欧美aa一级| 色97在线| 日韩免费一区二区在线观看 | 国产人免费人成免费视频 | 欧美 日韩 久久 | 毛片888| 色开心| av大全在线播放 | 国产精品 日韩精品 | av在线直接看 | 久久激五月天综合精品 | 国产精品午夜久久 | 国产高清精品在线观看 | 东方av在线免费观看 | 国产精品美乳一区二区免费 | 91一区啪爱嗯打偷拍欧美 | 久草热久草视频 | 久久久香蕉视频 | 亚洲国产成人精品电影在线观看 | 欧美精品久久久久久久久久白贞 | 综合久久久久久久 | 国产精品一区二区av日韩在线 | 黄网站免费大全入口 | 正在播放五月婷婷狠狠干 | 亚洲91av| 成 人 黄 色 视频 免费观看 | 国产一区在线不卡 | 日本中文字幕在线观看 | 亚洲人精品午夜 | 一区二区三区日韩视频在线观看 | 国产精品一区二区在线免费观看 | 91福利社区在线观看 | 韩国在线一区 | 成人黄性视频 | 国产精品久久久久久久久久久杏吧 | 美女在线黄 | 日韩理论在线播放 | av片中文| 午夜av电影院 | 又黄又爽又刺激视频 | 中文字幕免费观看 | 中文字幕在线观看一区二区 | 日韩av中文在线观看 | 在线观看免费成人 | 日本99干网 | 亚洲无人区小视频 | 黄色三级在线看 | 日本资源中文字幕在线 | 开心色插 | 免费观看一区二区三区视频 | 国产69精品久久99不卡的观看体验 | 97精品欧美91久久久久久 | 亚洲一区欧美精品 | 国产精品一区久久久久 | 国产一区网 | 国产中文字幕一区二区 | 天天干婷婷 | 久久99国产精品 | 日本久久久久久久久 | 天天操偷偷干 | 91入口在线观看 | 亚洲精品影院在线观看 | 日韩电影在线观看一区二区三区 | 97国产在线 | 国产一级二级av | 综合久久久久久久久 | 中文字幕你懂的 | 日本不卡一区二区三区在线观看 | 亚洲专区 国产精品 | 国产精品午夜久久 | 中文字幕首页 | 欧美性生活久久 | 91精品专区| 免费av看片| 欧美一区二区伦理片 | 白丝av在线 | 久久久久久久久网站 | 日本69hd | 久久午夜免费观看 | 国产日韩亚洲 | 国产经典三级 | 国产99自拍 | 精品久久影院 | 久久一区91 | 97精品国产一二三产区 | 91x色| 国产在线观看a | 超碰在97| 亚洲成aⅴ人在线观看 | 国产高清久久 | 亚洲视频久久 | 亚洲欧洲国产精品 | 国产正在播放 | 中文字幕日韩精品有码视频 | 国产精品美女久久久久久久久 | 国产一区二区三精品久久久无广告 | 亚洲欧美日韩在线一区二区 | 欧美成人精品在线 | 热re99久久精品国产66热 | 国产91影视 | 久久久久一区 | 激情综合五月网 | 国产在线最新 | www.天天射.com| 色偷偷av男人天堂 | 中文字幕 第二区 | 国产一级免费播放 | 91视频麻豆视频 | 色多多视频在线 | www.天天射.com | 免费在线观看亚洲视频 | 伊人色播 | 五月婷婷婷婷婷 | 亚洲不卡123 | 亚洲综合在线五月 | 男女靠逼app| 久久精品视频免费观看 | 久久国产视频网站 | 亚洲天堂网站视频 | 成人影音在线 | 久久精品国产亚洲精品 | 精品一区二区在线观看 | 亚洲视频免费在线观看 | 一级全黄毛片 | 91九色国产视频 | 国产精品二区在线 | 国产日产精品一区二区三区四区 | 色婷婷久久 | 超碰免费在线公开 | 欧美日韩二三区 | 人成午夜视频 | 久久99精品久久久久久久久久久久 | 黄色一级大片在线观看 | 日韩在线观 | 色综合久久久久网 | 中文字幕在线看视频 | 国产成人精品综合久久久 | 欧美日韩网址 | 九九久久国产精品 | 欧美日韩中 | 最近日本韩国中文字幕 | 色a4yy| 欧美日韩精品在线观看 | 五月开心婷婷网 | 日韩69av | 亚洲毛片在线观看. | 久久精品999 | 久久精品欧美视频 | 亚洲精品视频免费在线 | 美女网站色免费 | 亚洲一区二区精品在线 | 激情丁香5月 | 九九综合九九综合 | 超碰免费成人 | 色网站国产精品 | 色吊丝在线永久观看最新版本 | 国产成人精品久久亚洲高清不卡 | 免费视频久久久久久久 | 超碰在线观看99 | 美女一级毛片视频 | 香蕉视频91 | 亚洲国产精品第一区二区 | 亚洲成人精品在线观看 | 91视频啊啊啊 | 中文字幕免费不卡视频 | 九月婷婷综合网 | av蜜桃在线 | 久久福利电影 | 在线观看中文字幕一区 | 免费在线看成人av | 高清有码中文字幕 | 中文国产在线观看 | 亚洲精品资源 | 成人少妇影院yyyy | 久久欧洲视频 | 高清av在线免费观看 | 69精品久久 | 99在线播放 | 黄色精品一区二区 | 黄色免费网 | 久久久www成人免费精品 | 激情视频一区二区三区 | 天天综合区 | 日本黄网站| 欧美成人h版 | 三级黄色片在线观看 | 色在线视频网 | 激情视频免费观看 | 国产精品国产三级国产aⅴ入口 | 国产高清无av久久 | 日本公乱妇视频 | 91亚洲欧美激情 | 西西www4444大胆视频 | 亚洲综合小说电影qvod | 日日日日日 | 97天天干| 91精品国产成 | 综合天天色 | 黄色av三级在线 | 极品美女被弄高潮视频网站 | 91在线porny国产在线看 | www.成人精品 | 丁香花中文字幕 | 亚洲亚洲精品在线观看 | 国产精品99久久久久久久久 | 精品欧美乱码久久久久久 | 91视频午夜 | 2022中文字幕在线观看 | 亚洲一区久久久 | 久久99精品久久只有精品 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 日韩资源在线播放 | 欧美一级看片 | 亚洲婷婷伊人 | .国产精品成人自产拍在线观看6 | 久草免费电影 | 国产又粗又猛又色 | 91精品系列 | 开心激情婷婷 | 国产精品欧美久久 | 美女在线观看网站 | 亚洲国产片色 | 黄色不卡av | 亚洲国产免费看 | 97超碰在线免费 | 91少妇精拍在线播放 | 国产视频一区在线免费观看 | 欧美成人aa | 婷婷丁香综合 | 日韩欧美视频一区二区 | 天天干 天天摸 天天操 | 免费观看日韩 | 很黄很污的视频网站 | av888av.com| 亚洲va在线va天堂va偷拍 | 青春草免费在线视频 | 高清av在线免费观看 | 黄色资源在线观看 | 国内精品久久久久久久久 | 中文字幕一区二区三区久久 | 亚洲欧美日韩一区二区三区在线观看 | 在线播放 一区 | 久久试看 | 国产美腿白丝袜足在线av | 美女啪啪图片 | 99国产在线观看 | 精品国产激情 | 欧美激情精品久久久久久 | 久久精品一区二区三区国产主播 | 久久狠狠一本精品综合网 | 97超碰国产精品女人人人爽 | 午夜av一区 | 久久久久久久久久久高潮一区二区 | 国产精品久久久久久久久久妇女 | 日韩在线视频一区 | 中文字幕有码在线 | 免费看片在线观看 | 又黄又爽又色无遮挡免费 | 久久久久综合网 | 亚洲国产剧情 | 欧美精品久久久久久久久免 | 色婷婷亚洲 | 高清av在线免费观看 | 精品国产一二三 | 国产精品久久99综合免费观看尤物 | 9992tv成人免费看片 | 青青草国产在线 | 激情综合色综合久久 | 国产精品久久麻豆 | 免费高清在线观看成人 | 日韩欧美久久 | 久久乐九色婷婷综合色狠狠182 | 国产精品爽爽久久久久久蜜臀 | 亚洲欧洲中文日韩久久av乱码 | 亚洲精品欧洲精品 | 久久av伊人 | 天天操天天操一操 | 日韩毛片在线播放 | 一区二区三区四区久久 | 国产色综合 | 免费日韩 精品中文字幕视频在线 | 在线视频成人 | 99久久影院 | 亚洲一区二区精品视频 | 美女福利视频在线 | 免费视频a | 久久国产精品电影 | 国产视频2| 国产黄色精品在线观看 | 久草在线视频精品 | 国产精品理论在线观看 | 免费观看mv大片高清 | 天天摸天天舔 | 麻豆成人精品 | 激情欧美一区二区免费视频 | 亚洲精品mv在线观看 | 久久99网站| 91精品在线免费 | 激情婷婷丁香 | 国产精品毛片久久 | 欧美日韩精品在线视频 | 麻豆成人精品 | 三级动态视频在线观看 | 久二影院 | 日韩视频一区二区在线观看 | 日韩电影中文字幕在线观看 | 亚洲九九九在线观看 | 爱射综合| 免费看国产一级片 | 久久艹影院 | 日韩免费一区二区在线观看 | 国产精品成人在线观看 | 精品91视频 | 激情婷婷丁香 | 999久久久久久久久久久 | 久草在线免 | www.一区二区三区 | www.五月天婷婷 | 国产精品久久久久久一二三四五 | 久久中文字幕导航 | 国产精品一区二区三区免费视频 | 色综合久久久网 | 久久精品欧美 | 狠狠狠狠干 | 免费观看xxxx9999片 | 探花视频免费在线观看 | 玖玖爱在线观看 | 女人高潮一级片 | 久久成人国产精品一区二区 | 黄色成人毛片 | 久草综合视频 | 久久久久久国产精品亚洲78 | 91av视频免费观看 | 亚洲乱码精品 | 日韩一区二区免费在线观看 | 国产精品永久在线观看 | 香蕉视频色 | 久久久精品免费观看 | 日韩在线观看不卡 | 少妇精69xxtheporn | 欧美在线视频不卡 | 色综合久久久久久中文网 | 97超碰免费 | 久久电影国产免费久久电影 | 国产综合小视频 | 男女拍拍免费视频 | 五月天久久 | 在线你懂的视频 | 91精品国产99久久久久久久 | 日本公妇在线观看高清 | 日日爽视频 | 久久欧洲视频 | 丝袜美腿在线 | 国产一区二区在线精品 | 久99久在线 | 中文字幕日韩精品有码视频 | 欧美成人区 | 成人欧美亚洲 | 国产啊v在线观看 | 欧美精品久久久久久久久久丰满 | 五月天久久激情 | 日韩在线观看第一页 | 99精品在线免费视频 | 黄色在线看网站 | 久草视频一区 | 九九久久影院 | 黄色网免费 | 黄色在线观看网站 | 人人爽人人爽人人爽 | 日本韩国精品一区二区在线观看 | 日本黄色免费在线观看 | 黄色三几片 | 久久爱导航 | av在线等 | 亚洲一区精品二人人爽久久 | 超碰午夜| 日韩精品无码一区二区三区 | 欧美日韩一区二区三区视频 | 日本韩国精品一区二区在线观看 | 亚洲精品视频网 | 国产999视频在线观看 | 五月婷婷综合久久 | 日日躁夜夜躁xxxxaaaa | 国产色在线 | 日韩精品一区二区三区三炮视频 | 日韩午夜在线观看 | 国产精品欧美日韩在线观看 | 黄色特级片 | 999毛片| 亚洲,播放 | 色a资源在线 | 最新色站 | 国产一区二区三区 在线 | 在线观看日韩精品 | 亚洲综合视频网 | 青青河边草手机免费 | 亚洲国产欧美一区二区三区丁香婷 | 国产精品一区在线观看 | 亚洲国产精品成人va在线观看 | 久草视频观看 | 成人精品亚洲 | 亚洲精品大全 | 久久99精品久久只有精品 | 日韩在线电影 | 久久久影视 | 国产精品一区二区三区久久久 | 亚洲国产成人在线观看 | 91精品少妇偷拍99 | 天天干夜夜爽 | 中文不卡视频在线 | 婷婷成人在线 | 一区二区三区四区精品视频 | 婷婷成人亚洲综合国产xv88 | 99久久精品电影 | 热re99久久精品国产99热 | 在线黄色免费av | 在线观看完整版 | 日韩黄色一区 | 激情片av| 国产小视频免费在线观看 | 在线看的av网站 | 亚洲人成免费网站 | 久久国产精品99久久久久久丝袜 | 黄色小说在线观看视频 | 精品久久久久久综合日本 | 久久99亚洲网美利坚合众国 | 久久草网| 久久精品视频2 | 一级一片免费视频 | 色瓜| 日韩一区二区三区免费视频 | 久草在线最新 | 伊人网站| 亚洲精品88欧美一区二区 | 成人免费在线播放 | 亚洲精品一区二区三区四区高清 | 亚洲精品tv久久久久久久久久 | 人人玩人人弄 | 亚洲精品在线一区二区 | av大片免费在线观看 | 中文字幕av最新更新 | 亚洲国产精品一区二区久久hs | 免费看的黄色片 | 97视频在线观看免费 | 99精品视频播放 | 日韩一二区在线 | 久久国产精品久久精品国产演员表 | 欧美嫩草影院 | 国产成人综合图片 | 国产最新网站 | 国产高清久久久久 | 五月婷婷影院 | 缴情综合网五月天 | 免费视频二区 | 免费黄色看片 | 一级淫片a| av东方在线| 亚洲精品一区中文字幕乱码 | 亚州精品一二三区 | 日日爽天天爽 | 日韩三级中文字幕 | av在线免费在线观看 | 夜夜摸夜夜爽 | 日韩欧美有码在线 | 成人免费视频网站 | 国产免费叼嘿网站免费 | 手机在线看a | 中文字幕频道 | 91精品久久久久久久久 | 久99久久 | 91尤物在线播放 | 国产一区成人在线 | 91麻豆精品国产91久久久久久久久 | 色婷婷a | 欧美 日韩 性 | 日本夜夜草视频网站 | 国产精品美女 | 黄污视频网站 | 色婷婷88av视频一二三区 | 色五月激情五月 | 二区视频在线 | 91av在线免费观看 | 在线观看成人一级片 | 国产精品一区二区三区免费看 | 亚洲精品视频在线免费 | 在线观看岛国片 | 精品久久久久久久久久国产 | 丁香九月婷婷 | 国产精品高清在线 | 在线观看激情av | 午夜精品视频一区二区三区在线看 | www.eeuss影院av撸 | 日韩av电影中文字幕在线观看 | 精品国产成人av | 国产精选在线观看 | 激情久久五月天 | 天天舔夜夜操 | 国产日产精品一区二区三区四区的观看方式 | 国产视频首页 | 精品国产自在精品国产精野外直播 | 最近2019年日本中文免费字幕 | 久久国产精品99久久久久久老狼 | 精品久久五月天 | 久久一视频 | 精品一区二区免费视频 | 在线v片免费观看视频 | 在线观看亚洲国产 | 91| 国产高清在线一区 | 99久久超碰中文字幕伊人 | 国产精彩在线视频 | 久久毛片高清国产 | 久久久久久久久黄色 | 国产黄大片在线观看 | 91精品日韩 | av中文字幕在线看 | 天天艹天天 | 久久国产日韩 | 亚洲精品美女久久久 | 麻豆视频免费播放 | 激情久久五月 | 福利视频入口 | 久草在线视频网 |