הזומבים של קודגורו 9.5 והפתרון שלהם

עמוד

ברוכים הבאים לאתר תחרויות קודגורו! פורומים אקסטרים הזומבים של קודגורו 9.5 והפתרון שלהם

מוצגות 11 תגובות – 1 עד 11 (מתוך 11 סה״כ)
  • מאת
    תגובות
  • #76714
    Idan 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, דבר זה הקשה על הפיתרון המקורי שלי ושל יואב אז נאלצנו לשנות מעט את הפיתרון. הבעיה תוקנה כבר במנוע שלנו וכנראה שבימים הקרובים התיקון גם יהיה תקף במנוע הרשמי.

    #77781
    Yoav
    משתתף

    שימו לב שהקוד שעידן רשם מוצא את הזומבים והורג אותם – בתחרות עצמה השתמשנו בקוד שהופך את הזומבים לעותק מושלם שלנו והורג אותם ממש לקראת הסוף, בערך באופקוד 196000.
    לגבי השורד פרנויה עצמו, אם יהיה ביקוש נעלה את הקוד שלו לפורום; בכל מקרה, הרעיון הכללי הוא שבמקום להשתמש בפקודה שהשתמשנו בה בקנגרו
    Call far [di]
    שבגללה היינו צריכים בקודגורו 9 לשנות סגמנטים כל הזמן, הפכנו אותה לפקודה
    Call far [bx+si]
    שאיפשרה לנו להישאר בסגמנט הזירה והפכה את השורד שלנו ליציב יותר וקריא יותר. מלבד זאת, פרנויה הוא גרסה חדשה יותר של קנגרו.

    #81573
    ddt
    משתתף

    ניסיתי להריץ את הקוד של ה 100 סיבובים והוא לא מתקמפל לי
    יש לי שגיאה אפילו בשורה הראשונה:
    Zombie_Address_Location = 0×9090 ;nop nop

    1: error: parser: instruction expected

    שגיאות אחרות שיש הן

    error: comma, colon, decorator or end of line expected after operand

    ובמקומות של קוד שנראה בסדר

    איך אני פותר את השורה הראשונה ועם איזה כלי כדאי לי לעבוד שייתן לי יותר מידע למצוא בעצמי מה לא בסדר?

     

    #81574
    ddt
    משתתף

    ואני אשמח גם לקבל מידע מה זה אומר כל מה שרשום בקטע הזה שעידן כתב למעלה:
    "דבר שחשוב לשים לב שכל זומבי (השורד לא עושה את זה) מריץ שני שערים הנותנים לו להתאים את עצמו לסיבובים של הזומבי שהוא פותר, דבר זה קיים מכיוון האורך של סיבוב של זומבי משתנה בהתאם למספר שהוא מקבל ולכן לא ניתן לצפות מתי הוא יתחיל את הלופ שלו שוב, ולכן צריך להתאים את השורד אליו."

    למשל מה זה מריץ שני שערים? ואיך הזומבים פותרים זומבים אחרים? הם לא אמורים לקבל כתובות מהשורדים של הקבוצות?

     

    #81659
    Idan 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>

    #81660
    Idan 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>

    #81671
    ddt
    משתתף

    כן אני משתמש ב NASM.
    אבל הרצתי עכשיו את הקוד שלך עם ה FASM ואני עדיין מקבל שגיאה ב compile
    על השורה הראשונה Error:invalid name
    והפקודה שעליה יש לי שגיאה היא:

    Zombie_Address_Location=0×9090

    אז איך אני יכול להריץ קוד שמתקמפל באחד מהם?

     

    #81675
    ddt
    משתתף

    אני לא רואה שיש פה אפשרות להוסיף קובץ עם קוד אבל אולי זה עדיף כי ככה אפשר לקמפל קובץ ASM שהוא בביטחון עובד

     

    #81676
    ddt
    משתתף

    אם אני שם את השורה הראשונה בהערה גם על ה int 0×87  הוא נותן לי invalid name

    אולי צריך לשנות הגדרות ב FASM כדי שיוכל לקמפל קוד של שורדים?

    #81680
    Idan 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>

    #81681
    Idan Dor
    משתתף

    <p style="text-align: right;">נראה שזה אוטומתית שינה לי את זה במה שרשמתי, פשוט תחליף את ה X שבקוד ב X משלך והכל יעבוד</p>

מוצגות 11 תגובות – 1 עד 11 (מתוך 11 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.