1. 程式人生 > >弧注入 return to libc(返回C函式標準庫攻擊)

弧注入 return to libc(返回C函式標準庫攻擊)

最近看到的一個弧注入的題目,瞭解一下原理

首先弧注入就是在不寫入任何可執行程式碼的情況下注入程式,呼叫原有的庫函式,達到攻擊的目的,在Linux下使用較多,這次以windows為例

源程式

#include <stdio.h>
#include <windows.h>
#include <string>
#define PASSWORD "1234567"
int verify_password (char *password)
{
	int authenticated;
	char buffer[44];
	authenticated=strcmp(password,PASSWORD);
//	strcpy(buffer,password);//over flowed here!	
	memcpy(buffer,password,150);//over flowed here!	

	return authenticated;
}
main()
{p
	int valid_flag=0;
	char password[1024];
	FILE * fp;
	LoadLibrary("user32.dll");//prepare for messagebox
	if(!(fp=fopen("password.txt","rw+")))
	{
		exit(0);
	}
	fscanf(fp,"%s",password);
	valid_flag = verify_password(password);
	if(valid_flag)
	{
		printf("incorrect password!\n");
	}
	else
	{
		printf("Congratulation! You have passed the verification!\n");
	}
	fclose(fp);
}

因為strcpy有00字串結尾標誌的限制,所以使用memcpy函式直接拷貝記憶體

實驗目的是呼叫messageboxA函式實現彈窗功能

先是函式呼叫時棧幀的變化

首先在母函式的棧幀中壓入返回地址,函式用到的引數(這些都儲存在母函式的棧幀中)

然後使呼叫子函式,在子函式中執行建立新函式棧幀的操作

在弧注入中建構函式棧幀

返回地址壓入的是ExitProgess的地址,即執行完彈窗就退出程式,避免程式崩潰

當執行到函式返回地址處時,跳轉到MessageBox的入口處新建的棧幀將會在函式返回地址出開始向低地址出增長,MessageBox會以為下面的ExitProgess和函式引數屬於母棧幀,從而達到類似呼叫函式的效果,

如果需要連續的呼叫函式,可以這樣構造棧幀

即先EBP地址,在要呼叫函式地址,在下一個函式的地址,再就是函式的引數,函式的引數內容(寫在上面會在執行函式的時候被破壞掉)

該題目的檔案用十六進位制表示為

return to libc