看板 C_and_CPP 關於我們 聯絡資訊
剛剛我在上課,老師講了一個東西讓我非常困惑不已... 因為我非本科系出身,只是對寫程式很有興趣去自修的, 對指標、記憶體位址有基本的認識,然後剛剛老師在suse下用Anjuta在講c的指標 就隨便寫了一個很簡單的內容: int x=77; printf("%p", &x); > 0x7fff4c64a0ac 秀出位址給我們看,然後就把秀出來的位址 0x7fff4c64a0ac 複製回程式裡... printf("%d", *((int*)0x7fff4c64a0ac)); 打算直接叫出位址裡的東西給我們看... 當下我疑問就很大,不是每次宣告的時候,系統才配發給我們位址嗎? 想當然是失敗了,不過老師卻很肯定只要程式沒更動,每次執行就會拿到同樣的位址, 所以他回到windos用devcpp寫了一樣的程式碼, 但這次就真的是每次執行,拿到x的位址就都是一樣了, 把位址寫死可以去拿到x的值... 於是老師就說可能是os的演算法有差異造成的... 可是我又問說這樣很奇怪,如果說我這樣把位址寫死, 拿到另一台電腦上執行不會有問題嗎? 老師卻說不會... 這樣我疑問很大啊,怎麼可能每次位址都一樣?? 可是在windos底下的情況的確又是這樣, 想請問各位前輩到底是什麼情況呢?? -- 真理和公平的界定是那麼模糊 道理不道理要怎麼說才能清楚 在匆忙的世界我們走自己的路 努力的追逐那其實退步的進步 路上的風景經過了也就不在乎 黃玠 我們都該學習 什麼是滿足 拾荒地圖 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.209.198
ericinttu:請教一下是哪邊的老師? 09/05 16:17
purpose:Windows 按照預設值,每次都會把執行檔載入到同個位址, 09/05 16:18
purpose:假設 4000 好了,而區域變數 x 通常位址固定在某個相對 09/05 16:20
purpose:距離,比如固定隔 4 位元組,所以位址不變是有可能的 09/05 16:21
purpose:當然你必須每次都把 int x 放在第一個函數 main 裡,才行 09/05 16:22
purpose:你們老師東西只教一半,虛擬位址、物理位址、stack frame 09/05 16:25
purpose:這些如果沒先講過,那他扯這些,完全只會誤導別人而已 09/05 16:26
ericinttu:改問你們老師教的是什麼科目? 09/05 16:28
嗯...大概知道答案了,感謝大家~ 我只是想找答案而已,至於老師我不想多說= =" 根據老師自己的說法也是非本科系啦,但據他本人言寫了不下10年的code 因為是職訓的課程,時間很短,教的東西很雜 所以我猜他大概也不想講的很細吧... 只是有時候寫程式的邏輯連我都覺得怪怪的就是了........
sand1050:剛用VC測 變數記憶體位置每次都不一樣 09/05 17:00
littleshan:現在的OS都有address space layout randomization 09/05 17:07
littleshan:所以同一套說法現在已經不管用了 09/05 17:09
james732:這種事情研究練習玩玩就好,別在實務上使用啊… 09/05 17:10
james732:糟糕我不小心按到噓 09/05 17:10
ericinttu:幫好人推回來 09/05 17:11
purpose:感謝補 li 大補充。剛用 cl aslr.c 編譯。執行檔在 Win7 09/05 17:27
purpose:位址會變,在 XP 跑不會。應該是 VISTA 後才支援。 09/05 17:27
purpose:cl aslr.c /link /DYNAMICBASE:NO 這樣編譯,就能關掉選項 09/05 17:28
B9: 看過十年經驗的程式設計師寫出大一大二等級的程式 09/05 19:10
cobrasgo:哇靠這是哪的老師,害人啊… 09/05 20:20
angleevil:<--大二程度 09/05 20:48
purincess:樓上是十年經驗設計師(_m_) 09/05 20:56
angleevil:只是五年的設計師...而且想轉跑道了! 寫不出什麼了 09/05 21:04
Serge45:我上司號稱寫五年C++,連刪除物件會呼叫dtor都會忘記 09/05 21:23
angleevil:<--不會c++ 09/05 21:49
ericinttu:<--只會++c 09/05 21:56
b9307025:複製回程式裡那行要看東西怎不是用%d 那是indirect不是嗎 09/05 22:06
james732:過了好久,補個推XD 09/05 22:21
changyuheng:推 b9307025,我也覺得是 %x 09/05 22:44
抱歉,是我打錯了 是%d沒錯~"~ ※ 編輯: NullLife 來自: 123.193.204.107 (09/05 22:48)
ppc:這種課不上也罷... 09/05 23:27
EdisonX:我突然想起某個面試題... 09/05 23:32
TsinTa:感覺這老師只是在賣弄技巧,而且技巧也..... 09/05 23:39
flydragon198:我也寫了十年的程式呀,只不過是寫一年,重複十次而已 09/06 01:20
xvid:ASLR? 09/06 01:40
yauhh:事實擺明了,在Linux就不是這樣子,卻硬要以自己的認知講故事 09/06 01:44
yauhh:倒不如 http://en.wikipedia.org/wiki/Portable_Executable 09/06 01:57
yauhh:看這個比較營養 09/06 01:57
legnaleurc:... 這太超過,無法說明原理的東西不如別教 :( 09/06 05:25
damody:還好吧?師父告訴你有這個東西,之後把它學好就是學生的 09/06 10:48
damody:責任了,像酒劍仙也沒有教李消遙教到學會劍神才離開 09/06 10:48
damody:他只有教御劍術耶,根本不能打後面的王呀,會不會太超過? 09/06 10:50
UNARYvvv:to 二樓: 區域變數的位址不會固定相對於執行檔載入位址 09/06 11:18
UNARYvvv:應該說配在 stack 上的和 image base 無關, 那種有相對關 09/06 11:27
UNARYvvv:係的是 static variable 09/06 11:28
purpose:我的意思是 int main 的第一個區域變數 x 是會固定 09/06 12:21
purpose:http://tinyurl.com/d3z53lq 就這張圖來說吧,其右下角的 09/06 12:33
purpose:call stack 一直到 main 每次執行都不會改變,再加上 ASLR 09/06 12:33
purpose:不開啟的情況下,每次的 ebp 值都會一樣,所以 &x 這個位 09/06 12:34
purpose:址,在這種情況下,跟 image base 是有固定相對距離的 09/06 12:35
UNARYvvv:這在保證每次執行檔載入位址固定、ESP 起始位址固定是成 09/06 13:42
UNARYvvv:立沒錯,但就連限定 Windows 平台時都還是要系統版本以及 09/06 13:44
UNARYvvv:編譯器設定配合才能滿足這個前提,我是傾向不這樣假設啦 09/06 13:44
dirkc:推樓上二位的討論 09/06 16:52
adxis:借問一下 VC 的 /Zi 是不是也有影響? 09/07 21:23
purpose:應該不會吧.../Zi 不是只牽涉 *.pdb 嗎?純猜測 09/07 21:26
purpose:為什麼你會覺得有關 09/07 21:26
adxis:印象中會影響指令的順序 @@ 09/08 00:05