ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › הזומבים של קודגורו 9.5 והפתרון שלהם
- This topic has 10 תגובות, 3 משתתפים, and was last updated לפני 10 שנים, 5 חודשים by Idan Dor.
-
מאתתגובות
-
25 באפריל 2014 בשעה 12:47 #76714Idan Dorמשתתף
שלום לכולם, אני עידן מקבוצת פרנויה והשתתפנו בקודגורו 9.5, בתחרות היה זומבים שמאוד נהניתי לפתור יחד עם יואב וחשבנו לחלוק איתכם את הפיתרון. הזומבים בנויים על אלגוריתם המכונה אריה במדבר.
השם המוזר הזה מגיע מבדיחה מתמטית ישנה – איך תופסים אריה במדבר? ראשית, בונים גדר סביב המדבר. שנית, בונים גדר שעוברת באמצע המדבר. כעת האריה נמצא באחד משני חצאי המדבר. בונים גדר שחוצה גם את חצי המדבר הזה לשניים, ומקבלים שני "רבעי מדבר", שהאריה נמצא באחד מהם. ממשיכים שוב ושוב בתהליך בניית הגדר עד שבסופו של דבר האריה נמצא בתוך כלוב זעיר של מטר על מטר.
בקיצור מה שהזומבים עשו היה לקלוט מספר מהזירה ולענות האם המיקום שלהם נמצא לפני או אחרי מקום ההתחלה שלהם, ואז בעזרת שיטת אריה במדבר מוצאים אותם וחוטפים אותם.
אני מצרף קוד יעיל מאוד שאני ויואב יצרנו שבו השורד משתלט על זומבי ואז הזומבי משתלט על הזומבי הבא וכך עד השישי. לאחר שהזומבי משתלט על הבא בתור הוא מת.
דבר שחשוב לשים לב שכל זומבי (השורד לא עושה את זה) מריץ שני שערים הנותנים לו להתאים את עצמו לסיבובים של הזומבי שהוא פותר, דבר זה קיים מכיוון האורך של סיבוב של זומבי משתנה בהתאם למספר שהוא מקבל ולכן לא ניתן לצפות מתי הוא יתחיל את הלופ שלו שוב, ולכן צריך להתאים את השורד אליו.
קודם כל אצרף את הקוד של הזומבי:
00000000 EB10 jmp short 0x12
00000002 BEA095 mov si,0x95a0
00000005 93 xchg ax,bx
00000006 FC cld
00000007 AD lodsw
00000008 FD std
00000009 39D8 cmp ax,bx
0000000B 73FF jnc 0xc
0000000D 0C90 or al,0x90
0000000F AD lodsw
00000010 E2F4 loop 0x6
00000012 BEA095 mov si,0x95a0
00000015 93 xchg ax,bx
00000016 FC cld
00000017 AD lodsw
00000018 FD std
00000019 39D8 cmp ax,bx
0000001B 73FF jnc 0x1c
0000001D 0C90 or al,0x90
0000001F AD lodsw
00000020 E2F4 loop 0x16
00000022 BEA095 mov si,0x95a0
00000025 93 xchg ax,bx
00000026 FC cld
00000027 AD lodsw
00000028 FD std
00000029 39D8 cmp ax,bx
0000002B 73FF jnc 0x2c
0000002D 0C90 or al,0x90
0000002F AD lodsw
00000030 E2F4 loop 0x26
חשוב לציין שזה הקוד של זומבי A, ההבדל בין הזומבים הוא החלפה בשורה mov si, 0x95a0 את a למספר הזומבי, לדוגמא לזומבי C יהיה רשום 0x95c0.
כעת אצרף קוד שפותר את כל ששת הזומבים כמו שציינתי למעלה, הקוד מצליח להשתלט על כל ששת הזומבים לפני האופקוד ה 600.
Zombie_Address_Location = 0x9090 ;nop nop
random commands that do nothing
mov si, 0x95f2
jmp @Start ;first loop happens during the init of the other loops
@ToChangeLocation:
mov si, 0x95f2
mov cx, 0xc
mov word [si], dx
mov word [si-0x2], 0xffff
@ZombieGate1:
test si, [si]
loopz @ZombieGate1
mov cx, 0xc
mov word [si-0x2], 0xffff
mov word [si], dx
@ZombieGate2:
test si, [si]
loopz @ZombieGate2
@Start:
mov di, 0x8000 ;search starting constant
mov [si – 0x2], di ;cld ;asks the question
mov bp, di ;search fixing constant
mov ax, 0x4000 ;search constant
add di, ax ;std ;adds search constant from di indirectly
mov [si], dx ;jnc 0x1c ;resets the answer to 0
mov cx, 0x7 ;zombie search loop times
cmp word [si], bp ;nop / lodsw ;tests if the answer is all 0s or 1s
jc @AskZombie ;lodsw / loop 0x16 ;keeps on going if the answer is all 0s
sub di, bp ;loop 0x16 ;substructs search fixing constant to di
mov [si-0x2], di ;cld ;asks the question
dec cx ;lodsw ;decrease cx inorder to make everything syncronised
@StartLoop:
shr ax, 0x1 ;std ;shifts search constant right
add di, ax ;cmp ax, di ;adds search constant from di
mov [si], dx ;jnc 0x1c ;resets the answer to 0
sar bp, 0x1 ;dec word [si] / or al, 0x90 ;shifts search fixing constant right
cmp word [si], bp ;nop / lodsw ;tests if the answer is all 0s or 1s
jc @AskZombie ;lodsw / loop 0x16 ;keeps on going if the answer is all 0s
add di, bp ;loop 0x16 ;substructs search fixing constant to di
@AskZombie:
mov [si-0x2], di ;cld ;asks the question
loop @StartLoop ;lodsw ;starts over
mov [si], dx ;std
call @Here ;cmp ax, di
@Here:
pop bx ;jnc 0x1c ;resets the answer to 0
add di, 0x16 ;dec word [si] / or al, 0x90
nop ;nop / lodsw ;tests if the answer is all 0s or 1s
cmp word [si], ax ;lodsw / loop 0x16 ;keeps on going if the answer is all 0s
jc @ZombieOk ; / loop 0x16 ;substructs search fixing constant to di
sub di, 0x100
@ZombieOk:
sub byte [bx – @Here + @ToChangeLocation + 0x1], 0x10
lea ax, [bx – @Here + @ToChangeLocation]
mov word [Zombie_Address_Location], ax
mov ax, Zombie_Address_Location
mov dx, 0x16ff
push es
push ds
pop es
cld
int 0x86
pop es
@There:
mov word [bx + @There – @Here], 0xcccc
jmp $חשוב לציין שבניגוד למה שעודד חשב כשהוא כתב את הזומבים ולא בזבז להם את ה 87 שלהם הם לא היו באמת מוגנים והיה אפשר כפי שאני ויואב תכננו לעשות בהתחלה וכמו שקבוצת 0x6far עשתה, אפשר להשתלט על הזומבי הראשון בעזרת 87 ולגרום לו להשתלט על הבא בתור בעזרת ה 87 שלו וכך משיגים את כולם מאוד מהר.
הפתרון שעודד היה צריך לממש כדי להגן עליהם מ 87 הוא לשים שלוש פעמים את הבית 0xcc בין השכפולים של הקוד של הזומבי.
הנה הקוד שמשיג את כל הזומבים לפני האופקוד ה-100:
Zombie_Address_Location = 0x9090 ;nop nop
random commands that do nothing
@FakeStart:
jmp @Start
;This code int 0x87 a zombie and transports him to this location
@Start:
push es
push ds
pop es
@ToChangeLocation:
mov word [Zombie_Address_Location], ax
mov ax, 0xf4e2
@ToChangeLocationTwo:
mov dx, 0xa0be
mov bx, 0x16ff
mov cx, Zombie_Address_Location
std
int 0x87
pop es
cld
;Places the correct location into bx and changing the command
;mov word [zombie_Address_Location] to
;nop xor di, di
call @Here
@Here:
pop bx
mov byte [bx – @Here + @ToChangeLocation], 0x90
add byte [bx – @Here + @ToChangeLocationTwo + 0x2], 0x10
@There:
mov word [bx + @There – @Here], 0xcccc
jmp $
אם יש למישהו שאלה לגבי דבר שרשום פה אני ויואב נשמח לענות עליה.
נ.ב יש כרגע באג במנוע שגורם לכך שהפקודה SHR מתנהגת כמו SAR כך ש"אין" באמת פקודת SHR, דבר זה הקשה על הפיתרון המקורי שלי ושל יואב אז נאלצנו לשנות מעט את הפיתרון. הבעיה תוקנה כבר במנוע שלנו וכנראה שבימים הקרובים התיקון גם יהיה תקף במנוע הרשמי.26 באפריל 2014 בשעה 00:20 #77781Yoavמשתתףשימו לב שהקוד שעידן רשם מוצא את הזומבים והורג אותם – בתחרות עצמה השתמשנו בקוד שהופך את הזומבים לעותק מושלם שלנו והורג אותם ממש לקראת הסוף, בערך באופקוד 196000.
לגבי השורד פרנויה עצמו, אם יהיה ביקוש נעלה את הקוד שלו לפורום; בכל מקרה, הרעיון הכללי הוא שבמקום להשתמש בפקודה שהשתמשנו בה בקנגרו
Call far [di]
שבגללה היינו צריכים בקודגורו 9 לשנות סגמנטים כל הזמן, הפכנו אותה לפקודה
Call far [bx+si]
שאיפשרה לנו להישאר בסגמנט הזירה והפכה את השורד שלנו ליציב יותר וקריא יותר. מלבד זאת, פרנויה הוא גרסה חדשה יותר של קנגרו.11 ביוני 2014 בשעה 20:18 #81573ddtמשתתףניסיתי להריץ את הקוד של ה 100 סיבובים והוא לא מתקמפל לי
יש לי שגיאה אפילו בשורה הראשונה:
Zombie_Address_Location = 0×9090 ;nop nop1: error: parser: instruction expected
שגיאות אחרות שיש הן
error: comma, colon, decorator or end of line expected after operand
ובמקומות של קוד שנראה בסדר
איך אני פותר את השורה הראשונה ועם איזה כלי כדאי לי לעבוד שייתן לי יותר מידע למצוא בעצמי מה לא בסדר?
11 ביוני 2014 בשעה 20:29 #81574ddtמשתתףואני אשמח גם לקבל מידע מה זה אומר כל מה שרשום בקטע הזה שעידן כתב למעלה:
"דבר שחשוב לשים לב שכל זומבי (השורד לא עושה את זה) מריץ שני שערים הנותנים לו להתאים את עצמו לסיבובים של הזומבי שהוא פותר, דבר זה קיים מכיוון האורך של סיבוב של זומבי משתנה בהתאם למספר שהוא מקבל ולכן לא ניתן לצפות מתי הוא יתחיל את הלופ שלו שוב, ולכן צריך להתאים את השורד אליו."למשל מה זה מריץ שני שערים? ואיך הזומבים פותרים זומבים אחרים? הם לא אמורים לקבל כתובות מהשורדים של הקבוצות?
13 ביוני 2014 בשעה 17:15 #81659Idan Dorמשתתף<p style="text-align: right;">בגלל איך שהלולאה של הזומבים בנוייה (בגלל ה נופ) אז האורך שלה משתנה בהתאם לאיפה נימצא הזומבי ובהתאם למה שרשום במיקום דיבור שלו עם השורדים, בגלל זה הזומבים שמגיעים אחרי השורד שלנו לא יודעים איפה בלולאה נמצא הזומבי ולכן כדי להתאים אותם אל הזומבי הם צריך לעבור שער שיאפס אותם מבחינת "זמן" אך מכיוון שהשאר הזה הוא לולאה באורך 2 אז לא ניתן לדעת איפה בלולאה נמצא הזומבי, אלה אפשר לדעת שהוא נמצא באחד משתי מקומות, בגלל שהקוד מכוון להיות בדיוק מושלם באופן יחסי למיקום הזומבי בקוד צריך להריץ דרך שער נוסף כדי לדעת בדיוק איפה נמצא הזומבי בלולאה שלו ואז רק לאחר מיכן ניתן להתחיל לפתור את הזומבי.</p>
<p style="text-align: right;">אחרי שהשורד משתלט על זומבי אחד הוא מעביר אותו לקוד עם השערים והזומבי פותר את הבא בתור, ואז הבא בתור מגיע עובר את השערים ופותר את זה שאחריו וכו.</p>
<p style="text-align: right;">שני השערים הם בעצם לולאה שנעצרת כאשר הזומבי עונה לשורד, ובכך מגלים איפה הוא נמצא בלולאה שלו.</p>
<p style="text-align: right;"></p>13 ביוני 2014 בשעה 17:18 #81660Idan Dorמשתתף<p style="text-align: right;">ניסית להקמפל עם NASM</p>
<p style="text-align: right;">נכון?</p>
<p style="text-align: right;">הנה הבעיה שלך הקוד שלי בנוי מבחינת משתנים לאיך שהתוכנה FASM עובדת</p>
<p style="text-align: right;">היא זהה לחלוטין לNASM</p>
<p style="text-align: right;">חוץ מהעובדה שיש לה ממשק גרפי ולכן היא יותר נוחה, הקוד נועד להתקמפל בה ולא ב NASM</p>
<p style="text-align: right;">(פשוט בגלל שצריך להגדיר משתנים אחרת בשתי הקומפלרים אז זה לא עבד לך)</p>14 ביוני 2014 בשעה 00:22 #81671ddtמשתתףכן אני משתמש ב NASM.
אבל הרצתי עכשיו את הקוד שלך עם ה FASM ואני עדיין מקבל שגיאה ב compile
על השורה הראשונה Error:invalid name
והפקודה שעליה יש לי שגיאה היא:Zombie_Address_Location=0×9090
אז איך אני יכול להריץ קוד שמתקמפל באחד מהם?
14 ביוני 2014 בשעה 08:42 #81675ddtמשתתףאני לא רואה שיש פה אפשרות להוסיף קובץ עם קוד אבל אולי זה עדיף כי ככה אפשר לקמפל קובץ ASM שהוא בביטחון עובד
14 ביוני 2014 בשעה 08:45 #81676ddtמשתתףאם אני שם את השורה הראשונה בהערה גם על ה int 0×87 הוא נותן לי invalid name
אולי צריך לשנות הגדרות ב FASM כדי שיוכל לקמפל קוד של שורדים?
14 ביוני 2014 בשעה 12:31 #81680Idan Dorמשתתף<p style="text-align: right;">המקור לבעיה שלך הוא משהו מוזר בפורום, חלק מתווי ה</p>
<p style="text-align: right;">x</p>
<p style="text-align: right;">הוכלפו בתווי</p>
<p style="text-align: right;"><span style="color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 12px; line-height: 18px; background-color: rgb(251, 251, 251);">×</span></p>
<p style="text-align: right;">עכשיו אין לי שמץ למה זה ככה, אבל תצטרך באופן ידני בכל שורה שהקומפילר טוען שיש בעיה להחליף את התוו שיש בפורום ב</p>
<p style="text-align: right;">x</p>
<p style="text-align: right;">כי יש שם מבחינת הקומפילר תוו שהוא אינו</p>
<p style="text-align: right;">x</p>
<p style="text-align: right;">ואז יש בעיות.</p>
<p style="text-align: right;">לדוגמא את השורה:</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">Zombie_Address_Location = 0×9090 ;nop nop random commands that do nothing</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">לחליף:</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">Zombie_Address_Location = 0x9090 ;nop nop random commands that do nothing</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">וזה יפתור לך את הבעיה.</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">דרך אגב FASM מקמפל לקבצי</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">.bin</p>
<p style="border: 0px; font-family: Montserrat, sans-serif; font-size: 12px; margin: 0px 0px 20px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); line-height: 18px; text-align: right; background-color: rgb(251, 251, 251);">אז כדי שהמנוע ישתמש בהם צריך להוריד להם את הסיומת אחר כך, פשוט תמחוק אותה מהשם.</p>14 ביוני 2014 בשעה 12:32 #81681Idan Dorמשתתף<p style="text-align: right;">נראה שזה אוטומתית שינה לי את זה במה שרשמתי, פשוט תחליף את ה X שבקוד ב X משלך והכל יעבוד</p>
-
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.