2011-10-16 66 views
2

我正在使用bash。我已經關掉ASLR在Ubuntu 11.04使用環境變量地址的隨機化

#sysctl -w kernel.randomize_va_space=0 

而且我出口使用

$ export MYSHELL=/bin/sh 

我寫了一個C程序來獲取MYSHELL的地址從shell變量:

void main(){ 
char* shell = getenv("MYSHELL"); 
if (shell) 
    printf("0x%x\n", (unsigned int)shell); 
} 

它吐出了0xbffffe82。 當我將它用作ret-to-libc攻擊的一部分時,地址會發生變化(儘管偏移很小)。 這是爲什麼發生?

此外,當我更改二進制文件的文件名,並使用以前成功的地址,它將無法正常工作,並且已被重新定位到不同的地址。爲什麼?換句話說,二進制名稱和環境變量地址的關係是什麼?這是bash的保護功能嗎?如何關閉此功能?

注意:這不是作業。

回答

1

程序啓動時的堆棧佈局記錄爲here。應該很明顯,爲什麼改變程序的名字(真正的長度)會改變佈局。

+0

完美。謝謝。 –