שאלה קטנה באסמבלי

galh

New member
רץ נורא מהר... ../images/Emo3.gif

אם אני זוכר נכון (מה שבדרך כלל לא קורא), הטריק הוא לשים תוית (Label בלעז), הכתובת של התוית היא הערך EIP.
 

אלדד28

New member
רעיון מעניין

אבל זה גם כן HACK, לא פחות מה-CALL+POP שלי... אין פקודה נורמלית לעשות את זה?!
 

galh

New member
לא יודע... ../images/Emo5.gif

אני די בטוח שב- PDP-11 זה אפשרי אם ניגשים ל- r7.
במאמר הזה, הכותב טוען שלא ניתן לעשות את זה עם MASM או VC, אז אולי קומפיילר אחר יהיה יותר "נחמד" בנושא? הוא, אגב, משתמש ב- CALL וגישה ישירה ל- SP (במקום ה- POP שלך).
 

אלדד28

New member
אם אני לא טועה,

הקוד שלו שגוי, כי ret עושה pop ו-jmp לכתובת הזו. הוא לא עושה pop, ולכן זה יישאר ב-stack. לא יודע איך הקוד שלו עובד אבל אין לי זמן להתעמק כרגע
 

MotiAd

New member
אני לא מבין מה הבעייה?...

למה לא להשתמש ב-$ אלא אם כן אני טועה. EIP אמור להחזיק את הכתובת של הקוד המתבצע (קבלו תיקון פקודה). בעיקרון $ אמור להחזיר את המיקום הנוכחי בקוד מבחינת IP אבל זה גם לא ייתן לך כלום על וינדוס או לינוקס. אבל אין לזה שימוש כי הוא משתנה כל הזמן. אתה רוצה לקבל את הערך שלו לפני פקודה או לאחריה? זה המפתח.
 

MotiAd

New member
הוא לא מעביר את הקוד...

באסמבלי ל-ML שמותקן יחד איתו? ככה זה אמור לעבוד. לא?
 

voguemaster

New member
לא עובד ב-VC

בכל מקרה הנה פונק' שתעבוד ב-VC:
unsigned long __cdecl GetEIP() { // test unsigned long eip; __asm { mov eax, [ebp+4] sub eax,5 // substract size of the simplest CALL instruction mov eip,eax } return eip; }​
 

voguemaster

New member
שכחתי לציין

הפונק' הנ"ל תעבוד רק ב-VC (אלא אם כן יש ל-GCC מילה שמורה שנקראת cdecl) ויותר מכך, היא תעבוד רק עבור stack frame שהוא EBP based.
 
למעלה