為什麼C語言的strcpy函式有漏洞(轉)
為什麼C語言的strcpy函式有漏洞(轉)[@more@] 前言:研究了幾天DOS下的溢位原理,最後明白了其實原理都很簡單關鍵是要懂得為什麼C語言的strcpy函式有漏洞,為什麼對這個函式的不正常使用會造成溢位。 一節:介紹strcpy函式能看到這篇文章的人可能都知道問題很多是出在它的身上吧呵呵。 先看一看在標準的C語言的string.h中對這個函式的申明char *_Cdecl stpcpy (char *dest, const char *src);對於程式碼看下面的:(這是微軟對這個函式的說明) (%VC%/vc7/crt/src/intel/strcat.asm) ;*** ;char *strcpy(dst, src) - copy one string over another ;Purpose: ; Copies the string src into the spot specified by ; dest; assumes enough room. ; ; Algorithm: ; char * strcpy (char * dst, char * src) ; { ; char * cp = dst; ; while( *cp++ = *src++ ); /* Copy src over dst */ ; return( dst ); ; } ;Entry: ; char * dst - string over which "src" is to be copied ; const char * src - string to be copied over "dst" ; ;Exit: ; The address of "dst" in EAX ; ;Uses: ; EAX, ECX ; ;Exceptions: ;********************************************************************** 本來想去掉一些註解,不過覺得還是留著好哈:) 從上面我們可以看到這樣的程式碼有問題有: 1.沒有檢查輸入的兩個指標是否有效。 2.沒有檢查兩個字串是否以NULL結尾。 3.沒有檢查目標指標的空間是否大於等於原字串的空間。 好了現在我們知道了對於呼叫string.h中的這個函式,和我們自已寫一個如下的程式沒有本質上的區別那麼我們就來研究它就可以了.就叫它c4.exe吧. main(){j();} j() { char a[]={a,b,}; char b[1]; char *c=a; char *d=b; while(*d++=*c++); printf("%sn",b); } 二節:除錯我們的c4.exe 所用工具W32dasm,debug,tcc,tc 第一步我們用TC2編繹生成可執行檔案c4.exe. 第二步用TCC -B生成這段C程式碼的彙編原始碼. 第三步用W32dasm和debug對c4.exe進行靜態和動態除錯 先分析由TCC生成的c4.asm程式碼如下: 先說明一下由於這是一個完整的包括了MAIN函式的C程式,程式剛開始時資料段和堆疊段還有程式碼都不在一起但是當,執行到我們的J函式時堆疊和數段就在一起了這要特別注意. ifndef ??version ?debug macro endm endif ?debug S "c4.c" _TEXT segment byte public CODE DGROUP group _DATA,_BSS assume cs:_TEXT,ds:DGROUP,ss:DGROUP _TEXT ends _DATA segment word public DATA d@ label byte d@w label word _DATA ends _BSS segment word public BSS b@ label byte b@w label word ?debug C E930A68D2E0463342E63 _BSS ends _TEXT segment byte public CODE ; ?debug L 1 _main proc near ; ?debug L 3 call near ptr _j //這兒執行我們的J函式 @1: ; ?debug L 4 ret _main endp _TEXT ends _DATA segment word public DATA //最先在資料段中定義我們的源串ab結尾符 db 97 db 98 db 0 _DATA ends _TEXT segment byte public CODE ; ?debug L 6 _j proc near push bp //J函式入口 mov bp,sp sub sp,6 push si push di push ss lea ax,word ptr [bp-6] push ax push ds mov ax,offset DGROUP:d@ //特別注意這是得到源串在資料段中的偏移 push ax //所有SCOPY@以上的程式碼的作用是在堆疊中分配源串加目的串那麼多個空間 mov cx,3 //cx=3指定要複製的字元數 call far ptr SCOPY@ //執行了另一個函式作用是把資料段中的源串拷到棧中 ; ?debug L 10 lea si,word ptr [bp-6] ; ?debug L 11 lea di,word ptr [bp-2] ; ?debug L 12 jmp short @3 @5: @3: ; ?debug L 12 mov bx,si inc si mov al,byte ptr [bx] mov bx,di inc di mov byte ptr [bx],al or al,al jne @5 @4: ; ?debug L 13 lea ax,word ptr [bp-2] push ax mov ax,offset DGROUP:s@ //得到printf函式的列印格式引數 push ax call near ptr _printf pop cx pop cx @2: ; ?debug L 14 pop di pop si mov sp,bp pop bp ret _j endp _TEXT ends ?debug C E9 _DATA segment word public DATA s@ label byte db 37 //% db 115 //s db 10 //換行符:) db 0 _DATA ends extrn SCOPY@:far _TEXT segment byte public CODE extrn _printf:near _TEXT ends public _main public _j end 三節:分析W32Dasm得來的靜態彙編程式碼,也就是程式最終的程式碼同時我們一步步來分析 這時堆疊的情況. 文章寫到這兒可能大家一定認識都是些看到就頭大的程式碼吧,沒事我先分析一下 這些程式碼就執行來說可以分為三個部分: 1.從01FE到020B是根據C程式碼中的定義在堆疊中分配空間例子中分了6個位元組,定義多少分多少也沒有毛病 2遠跳到0000:1395是把資料段中的源串放到堆疊中由於放入個數在cx中所以這兒也沒有毛病 3在堆疊中把源串拷到目的串所在的記憶體單元中問題就在這兒了! :0001.01FA E80100 call 01FE //執行我們的j函式 :0001.01FD C3 ret :0001.01FE 55 push bp :0001.01FF 8BEC mov bp, sp :0001.0201 83EC06 sub sp, 0006 :0001.0204 56 push si :0001.0205 57 push di :0001.0206 16 push ss :0001.0207 8D46FA lea ax, [bp-06] :0001.020A 50 push ax :0001.020B 1E push ds :0001.020C B89401 mov ax, 0194 :0001.020F 50 push ax :0001.0210 B90300 mov cx, 0003 :0001.0213 9A95130000 call 0000:1395 //這兒先跳到1395去執行了由於它是在0000所以是遠跳 :0001.0218 8D76FA lea si, [bp-06] :0001.021B 8D7EFE lea di, [bp-02] :0001.021E EB00 jmp 0220 :0001.0220 8BDE mov bx, si :0001.0222 46 inc si :0001.0223 8A07 mov al , [bx] :0001.0225 8BDF mov bx, di :0001.0227 47 inc di :0001.0228 8807 mov [bx], al :0001.022A 0AC0 or al , al :0001.022C 75F2 jne 0220 :0001.022E 8D46FE lea ax, [bp-02] :0001.0231 50 push ax :0001.0232 B89701 mov ax, 0197 :0001.0235 50 push ax :0001.0236 E8BC08 call 0AF5 //執行列印輸出 :0001.0239 59 pop cx :0001.023A 59 pop cx :0001.023B 5F pop di :0001.023C 5E pop si :0001.023D 8BE5 mov sp, bp :0001.023F 5D pop bp :0001.0240 C3 ret //下面的就是我們的SCOPY@ 0001.1395 55 push bp :0001.1396 8BEC mov bp, sp :0001.1398 56 push si :0001.1399 57 push di :0001.139A 1E push ds :0001.139B C57606 lds si, [bp+06] :0001.139E C47E0A les di, [bp+0A] :0001.13A1 FC cld :0001.13A2 D1E9 shr cx, 01 :0001.13A4 F3 repz :0001.13A5 A5 movsw :0001.13A6 13C9 adc cx, cx :0001.13A8 F3 repz :0001.13A9 A4 movsb :0001.13AA 1F pop ds :0001.13AB 5F pop di :0001.13AC 5E pop si :0001.13AD 5D pop bp :0001.13AE CA0800 retf 0008 我們現在開始DEBUG動態除錯: 第一步D:turboc2>debug c4.exe -g 01FE 透過W32DASM中的查詢我們直接跳到J入口處執行 AX=0000 BX=0566 CX=000E DX=067F SP=FFE8 BP=FFF4 SI=00D8 DI=054B DS=13DB ES=13DB SS=13DB CS=129F IP=01FE NV UP EI PL ZR NA PE NC 129F:01FE 55 PUSH BP -t AX=0000 BX=0566 CX=000E DX=1193 SP=FFE6 BP=FFF4 SI=00D8 DI=054B DS=13DB ES=13DB SS=13DB CS=129F IP=01FF NV UP EI PL ZR NA PE NC 129F:01FF 8BEC MOV BP,SP 由於上一條指令是CALL O1FE,所以也就有一條POP 01FD,然後又是一個PUSH BP -d ss:ffe0 13DB:FFE0 FF 01 9F 12 F3 0B F4 FF-FD 01 1D 01 01 00 F2 FF ................ 13DB:FFF0 54 05 F6 FF 00 00 43 35-2E 45 58 45 00 00 FB 00 T.....C5.EXE.... 現在就來看看棧的情況 mov bp,sp後BP就成了FFE6 低 FFE0 | ->SUB SP,0006(空了六個位元組為源目的串在堆疊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-967659/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
緩衝區溢位漏掘之整數範圍限制淺析(轉)
下一篇:
駭客中級技術--緩衝區溢位攻擊(轉)
請登入後發表評論
登入
全部評論
相關文章
- 【C語言】字串複製。(不能使用strcpy函式)C語言字串函式
- c語言函式庫(轉)C語言函式
- 【轉載】C 語言有什麼奇技淫巧
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- 實現C中的strcpy函式函式
- C語言有關函式淺析C語言函式
- C語言的函式C語言函式
- 何為程式語言?為什麼要學C語言?C語言
- 為什麼C語言屹立不倒?C語言
- 為什麼純函式式語言至今無法流行起來?函式
- 類似於C語言的printf函式 (轉)C語言函式
- 嵌入式開發為什麼選擇C語言?C語言
- 用C語言寫strcat、strcpy、strlen、strcmpC語言
- 為什麼會有這麼多的程式語言?
- C語言 execve()函式C語言函式
- C語言常用函式C語言函式
- strcpy函式原型函式原型
- C語言函式sscanf()的用法C語言函式
- C語言qsort函式的使用C語言函式
- C語言 將函式(有參、無參)作為引數傳遞C語言函式
- 為什麼會有這麼多程式語言
- C語言 itoa函式及atoi函式C語言函式
- 為什麼那麼多人要學習go語言?go語言有什麼特點?Go
- [ASM C/C++] C語言的main 函式ASMC++C語言AI函式
- C語言函式呼叫棧C語言函式
- 詳解C語言函式C語言函式
- tmpnam() - C語言庫函式C語言函式
- tmpfile() - C語言庫函式C語言函式
- C語言時間函式C語言函式
- C語言 函式指標C語言函式指標
- 08. C語言函式C語言函式
- C語言基礎函式C語言函式
- 為什麼中國人沒有自己的程式語言?
- strcpy函式和memcpy函式的區別函式memcpy
- Python和C語言有什麼區別?PythonC語言
- 函式式思維: 為什麼函數語言程式設計越來越受關注函式函數程式設計
- 什麼是Go語言?Go語言有什麼特點?Go
- 為什麼很多公司都轉型go語言開發?Go語言能做什麼Go