ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › בדיקה האם עליתי על עצמי
- This topic has 8 תגובות, 4 משתתפים, and was last updated לפני 8 שנים, 9 חודשים by Idan Dor.
-
מאתתגובות
-
16 בפברואר 2016 בשעה 22:00 #83287awesombllyמשתתף
בניתי קוד פשוט, ורציתי לבצע בדיקה האם האוגר bx נמצא על ax אם כן ידלג עליו, אך זה לא עובד לי.
הנה הקטע קוד שאמור לבדוק.
bomb:
add bx, 1
cmp bx, ax
je bomb
mov [bx], axjmp bomb
בכל מקרה אשמח אם מישהו יסביר לי איך אני בודק בעזרת שני השורדים שלי אם אני נמצא על מקום של כל אחד מהם, אם כן אז לדלג. תודה רבה 🙂
- הדיון הזה עודכן לפני 8 שנים, 9 חודשים ע״יawesomblly.
16 בפברואר 2016 בשעה 23:20 #83290cgxמנחהאתה יכול לדרוס את עצמך גם, למשל, בכתובת
bx+116 בפברואר 2016 בשעה 23:32 #83291adiמשתתףכמו שנאמר, על מנת שלא תדרוס את עצמך באף כתובת ניתן לעשות משהו כמו זה:
mov dx,0xcccc
@bomb:
inc bx
cmp bx,ax
jnz @skip
add bx,@codeEnd
@skip:
mov [bx],dx
jmp @bomb
@codeEnd:
——————————————————————
לגבי לא להרוג גם את השורד שאיתך, האופציות האפשריות הן לשמור את המיקום שלו ברגיסטר נוסף ולבדוק גם את הערך שלו. אופציה נוספת זה שתריץ את שניהם מאותו המיקום אך תקח בחשבון שזה לא בהכרח הדבר שאתה רוצה משיקולים אסטרטגיים..
מקווה שעזרתי 🙂17 בפברואר 2016 בשעה 16:51 #83293awesombllyמשתתףעדי בדוגמה שלך זה עובד, אך ברגע שאני תוקף באלכסון אם התנאי שאני עושה בדיוק כמוך עדיין אני הורג את עצמי..
אני חושב שזה בגלל שהax כל שנייה זז מצד לצד בתוך המקום שהוא נולד.
ויש לי עוד שאלה, אפשר להזיז את השחקן שלי למקום כלשהו?17 בפברואר 2016 בשעה 17:10 #83294Idan Dorמשתתףהדוגמא של עדי איננה מגינה עליך מלפגוע באצמך, הדבר היחידי שהדוגמא של עדי בודקת זה האם המיקום הבא להפצצה הוא בדיוק המיקום ההתחלתי שלך (AX). שים לב ש AX לא משתנה לבד בקוד (אלה אם אתה משנה אותו) ומצביע רק על המיקום ההתחלתי שלך.
מה שזה אומר שאם אתה מפציץ באלכסון הקוד של עדי לא יגן עליך אלה יגן רק על הבית הראשון של הקוד שלך.אתה יכול להזיז את השחקן שלך לכל מקום שאתה רוצה (לדוגמא עם jmp bx) אבל אתה צריך לדאוג שיהיה שם קוד להריץ. המנוע (ומהמחשב) תמיד מריץ את הפקודה שרשומה במיקום IP בזיכרון (הכתובת המלאה היא CS:IP אבל זה לא משנה כרגע) אם דאגת לשים שם קוד שעושה משהו אז אין בעיה והוא ירוץ לאחר שתקפוץ לשם, אם לא כתבת שם קוד אז המנוע יגרום לך להריץ את מה שרשום שם וכנראה תמות בגלל פקודה לא חוקית.
מרבית השורדים מזיזים את עצמם כל הזמן וכותבים את הקוד שלהם מחדש כל פעם.עידן.
17 בפברואר 2016 בשעה 17:26 #83295awesombllyמשתתףאז עידן אתה יכול לתת לי דוגמא לקוד שיכול "לנקות" קוד זדוני שנמצא בזירה ואז לקפוץ לשם ?
ממש תודה על העזרה חברים17 בפברואר 2016 בשעה 17:43 #83296Idan Dorמשתתףהדוגמא הבאה היא שורד פשוט ובסיסי, בנוסף היא בכוונה לא יעילה. היא מבוססת על שורד בשם MAMALIGA (שלאחר שניצח לפני כמה שנים שחרר את קוד המקור עם הסבר פה בפורום).
base_jump_length = 0x0a00
jump_length = -(base_jump_length)
@Start:
add ax, @ZombieCodeAndJump – @Start
mov si, ax
push ax
mov ax, 0xa4a4
mov dx, 0xa4a4
int 0x86
mov cx, @End – @ZombieCodeAndJump
rep movswpop ax
push ds
push es
pop ds
pop es
mov di, ax
xor si, si
movsb@ZombieCodeAndJump:
movsw
movsw
movsw
movsw
movsw
movsw
movsw
add di,jump_length
movsw
db 0xE9
dw jump_length
movsw
xor si,si
movsb
@End:הקוד עושה את הדברים הבאים:
כותב בעזרת int86 את הפקודה movsb לזיכרון המשותף (סגמנט ES) הרבה פעמים (256).
לאחר ההפצצה הזאתי הוא מעתיק קוד קפיצה (בעזרת rep movsw) לאחר מה שהוא כתב קודם.
מחליף את הסגמנטים ES ו DS כך שעכשיו movsw ו movsb מעתיקים מהסגמנט המשותף אל הזירה ולא להפך.
מתחיל להעתיק את הקוד בעזרת movsb.דבר זה גורם לכך שהוא כל הזמן מעתיק קוד מ ES מריץ אותו ואז מעתיק עוד קוד עד שהוא מגיע לקוד הקפיצה שעביר אותו למקום אחד ואז הוא עושה אותו דבר שמה.
כפי שציינתי קודם, מה שהשורד עושה הוא איננו הפצצה יעילה אבל הוא מהווה דוגמא פשוטה יחסית לשורד טוב.
בנוסף, לא חובה להשתמש ב ES וב movsw כדי לגרום לשורד לזוז וניתן ליצור בקלות שורד שפשוט מעתיק את עצמו ממקום למקום אבל שורד זה יהיה מאוד פגיע בניגוד לדוגמא שבה הקוד מוגן מכיוון שהוא מאוחסן ב ES.עידן.
17 בפברואר 2016 בשעה 17:58 #83297awesombllyמשתתףואו זה ממש מסובך אנחנו בקבוצה לא יודעים אפילו movsw :/
כרגע מה שהבנו הכי טוב זה איך הcannon עובד ועשינו משהו דומה לא הצלחנו להתקדם משמה17 בפברואר 2016 בשעה 18:07 #83298Idan Dorמשתתףמניסיוני אין דרך טובה יותר ללמוד מאשר לנסות להבין קוד כזה.
כמה הסברים לעזרה:
Movsw- אחת הפקודות הכי שימושיות בתחרות הזאתי בגלל כמות הדברים שהיא עושה. באופן כללי היא מעתיקה שתי בתים בזיכרון ממקום מסוים למקום אחר ואז מקדמת את האינדקסים בשתיים, דבר זה נותן שאם מכוונים אותה כמו שצריך ניתן להעתיק הרבה מידע וקוד פשוט בעזרת הפעלת הפקודה הזאת שוב ושוב. באופן ספציפי היא מעתיקה שתי בתים (גודל שנקרא גם מילה) מ DS:SI ל ES:DI ואז מוסיפה ל SI ול DI את המספר 2. בתחילת המשחק DS מצביע לזירה ו ES אל האזור המשותף אז הפקודה מעתיקה מהזירה אל האזור המשותף.
Rep- הפקודה מריצה את הפקודה שאחריה CX פעמים, חשוב לציין שכל הרצה עולה סיבוב אחד במנוע. כלומר rep movsw עם cx=3 זה אותו דבר כמו הפקודה movsw שלוש פעמים ברצף חוץ מזה שזה תופס פחות מקום בזיכרון. דבר זה שימושי להעתקות ארוכות שבהם צריך להריץ את movsw עשרות פעמים. (חשוב לציין ש rep עובד רק עם פקודות מסוימות ולא עם כולם).
Movsb- אותו דבר כמו movsw רק עם בית אחד כל פעם במקום מילה כל פעם.אני ממליץ לך לקמפל ולהריץ את הקוד בדיבאגר (לדוגמא זה שיואב כתב שאפשר למצוא אותו פה בפורום ובעמודי מידע), ככה תוכל לראות מה הקוד עושה בכל שלב ומה רשום לא באוגרים בכל רגע.
עידן.
-
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.