ctf-writeups

Access Code

Here's the program cartridge for the satellite terminal's login system. We need the access code to start exploring the system.

    AccessCode.peg

Disassemble the code using the debugger:

@puts:
        0300.0000: MOV     A3, 0x7F
        0304.0000: LDB     A1, [A0]
        0306.0000: INC     A0, 1
        0308.0000: AND     A2, A1, A3
        030B.0000: WRB     (0), A2
        030D.0000: CMP     A1, A2
        030F.0000: BRR.NE  @puts+0x4 //0304.0000
        0312.0000: RET
@print_hex_byte:
        0314.0000: ADD     A5, PC, 0x3A
        0319.0000: SRU     A3, A0, 0x4
        031D.0000: LDB     A4, [A5 + A3]
        0320.0000: WRB     (0), A4
        0322.0000: AND     A0, 0xF
        0326.0000: LDB     A4, [A5 + A0]
        0329.0000: WRB     (0), A4
        032B.0000: RET
@print_hex:
        032D.0000: MOV     A1, A1
        032F.0000: RET.EQ
        0331.0000: ADD     A5, PC, 0x1D
        0336.0000: LDB     A2, [A0]
        0338.0000: SRU     A3, A2, 0x4
        033C.0000: LDB     A4, [A5 + A3]
        033F.0000: WRB     (0), A4
        0341.0000: AND     A2, 0xF
        0345.0000: LDB     A4, [A5 + A2]
        0348.0000: WRB     (0), A4
        034A.0000: INC     A0, 1
        034C.0000: INC     A1, -1
        034E.0000: BRR.NE  @print_hex+0x9 //0336.0000
        0351.0000: RET
        0353.0000: LDW.NE  A2, [A0]
        0355.0000: LDB.NE  A2, [A2]
        0357.0000: BRA.NE  A2, A4
        0359.0000: FCA.NE  A2, S0
        035B.0000: RDB.NE  A2, (9)
        035D.0000: SUB.LE  A5, A1
        035F.0000: MLS.LE  A5, A3
        0361.0000: DVS.LE  A5, A5
@gimli_dump_state:
        0363.0000: PSH     {S0-S1, FP, RA-RD}
        0366.0000: INC     FP, SP, 4
        0369.0000: MOV     S0, A0
        036B.0000: WRB     (0), 0x20
        036E.0000: WRB     (0), 0x20
        0371.0000: MOV     S1, ZERO
        0373.0000: MOV     S1, S1
        0375.0000: BRR.EQ  @gimli_dump_state+0x31 //0394.0000
        0378.0000: AND     ZERO, S1, 0xF
        037D.0000: BRR.NE  @gimli_dump_state+0x29 //038C.0000
        0380.0000: WRB     (0), 0xA
        0383.0000: WRB     (0), 0x20
        0386.0000: WRB     (0), 0x20
        0389.0000: BRR     @gimli_dump_state+0x31 //0394.0000
        038C.0000: AND     ZERO, S1, 0x3
        0391.0000: WRB.EQ  (0), 0x20
        0394.0000: LDB     A0, [S0 + S1]
        0397.0000: FCR     @print_hex_byte
        039A.0000: INC     S1, 1
        039C.0000: CMP     S1, 0x30
        03A0.0000: BRR.LT  @gimli_dump_state+0x10 //0373.0000
        03A3.0000: WRB     (0), 0xA
        03A6.0000: INC     SP, FP, -4
        03A9.0000: POP     {S0-S1, FP, PC-DPC}
        03AC.0000: SUB.GE  FP, A0
        03AE.0000: SUB.GE  FP, A0
        03B0.0000: SUB.GE  RA, S0
        03B2.0000: SHL     PC, RD
        03B4.0000: MOV     PC, S2
        03B6.0000: SUB.GE  FP, A0
        03B8.0000: SUB.GE  FP, A0
        03BA.0000: SUB.GE  ZERO, FP
@gimli:
        03BC.0000: PSH     {S0-FP, RA-RD}
        03BF.0000: MOV     A1, 0x18
        03C3.0000: PSH     {A1}
        03C6.0000: MOV     A2, ZERO
        03C8.0000: POP     A0, {A3-A4}
        03CC.0000: SHL     RA, A3, 0x8
        03D0.0000: SHL     RD, A4, 0x8
        03D4.0000: SRU     A3, 0x8
        03D7.0000: ORR     A3, RD
        03D9.0000: SRU     A4, 0x8
        03DC.0000: ORR     A4, RA
        03DE.0000: ADD     A0, 0xC
        03E2.0000: POP     A0, {A5-S0}
        03E6.0000: SRU     RA, A5, 0x7
        03EA.0000: SRU     RD, S0, 0x7
        03EE.0000: SHL     A5, 0x9
        03F1.0000: ORR     A5, RD
        03F3.0000: SHL     S0, 0x9
        03F6.0000: ORR     S0, RA
        03F8.0000: ADD     A0, 0xC
        03FC.0000: POP     A0, {S1-S2}
        0400.0000: AND     RA, A5, S1
        0403.0000: AND     RD, S0, S2
        0406.0000: SRU     A1, RA, 0xE
        040A.0000: SHL     RA, 0x2
        040D.0000: SHL     RD, 0x2
        0410.0000: ORR     RD, A1
        0412.0000: SHL     FP, S2, 0x1
        0416.0000: SHL     A1, S1, 0x1
        041A.0000: ORR.GE  FP, 0x1
        041E.0000: XOR     RA, A1
        0420.0000: XOR     RD, FP
        0422.0000: XOR     RA, A3
        0424.0000: XOR     RD, A4
        0426.0000: PSH     A0, {RA-RD}
        042A.0000: ORR     RA, A3, S1
        042D.0000: ORR     RD, A4, S2
        0430.0000: SHL     RD, 0x1
        0433.0000: SHL     RA, 0x1
        0436.0000: ORR.GE  RD, 0x1
        043A.0000: XOR     RA, A3
        043C.0000: XOR     RD, A4
        043E.0000: XOR     RA, A5
        0440.0000: XOR     RD, S0
        0442.0000: SUB     A0, 0xC
        0446.0000: PSH     A0, {RA-RD}
        044A.0000: AND     RA, A3, A5
        044D.0000: AND     RD, A4, S0
        0450.0000: SRU     A1, RA, 0xD
        0454.0000: SHL     RA, 0x3
        0457.0000: SHL     RD, 0x3
        045A.0000: ORR     RD, A1
        045C.0000: XOR     RA, A5
        045E.0000: XOR     RD, S0
        0460.0000: XOR     RA, S1
        0462.0000: XOR     RD, S2
        0464.0000: SUB     A0, 0xC
        0468.0000: PSH     A0, {RA-RD}
        046C.0000: INC     A0, 4
        046E.0000: INC     A2, 1
        0470.0000: CMP     A2, 0x4
        0474.0000: BRR.LT  @gimli+0xc //03C8.0000
        0477.0000: SUB     A0, 0x10
        047B.0000: POP     {A1}
        047E.0000: SRU     A2, A1, 0x1
        0482.0000: BRR.GE  @gimli+0x125 //04E1.0000
        0485.0000: SRU     A2, 0x1
        0488.0000: BRR.GE  @gimli+0xf9 //04B5.0000
        048B.0000: POP     A0, {A3-S0}
        048F.0000: PSH     A0, {A3-A4}
        0493.0000: XOR     S0, 0x9E37
        0497.0000: ORR     A3, A1, 0x7900
        049C.0000: XOR     A5, A3
        049E.0000: PSH     A0, {A5-S0}
        04A2.0000: INC     A0, 8
        04A4.0000: POP     A0, {A3-S0}
        04A8.0000: PSH     A0, {A3-A4}
        04AC.0000: PSH     A0, {A5-S0}
        04B0.0000: INC     A0, -8
        04B2.0000: BRR     @gimli+0x125 //04E1.0000
        04B5.0000: POP     A0, {A3-A4}
        04B9.0000: INC     A0, 4
        04BB.0000: POP     A0, {A5-S0}
        04BF.0000: PSH     A0, {A3-A4}
        04C3.0000: INC     A0, -4
        04C5.0000: PSH     A0, {A5-S0}
        04C9.0000: INC     A0, 4
        04CB.0000: POP     A0, {A3-A4}
        04CF.0000: INC     A0, 4
        04D1.0000: POP     A0, {A5-S0}
        04D5.0000: PSH     A0, {A3-A4}
        04D9.0000: INC     A0, -4
        04DB.0000: PSH     A0, {A5-S0}
        04DF.0000: INC     A0, -4
        04E1.0000: INC     A1, -1
        04E3.0000: BRR.NE  @gimli+0x7 //03C3.0000
        04E6.0000: POP     {S0-FP, PC-DPC}
@gimli_absorb_byte:
        04E9.0000: LDW     A2, [A0 + 0x30]
        04EE.0000: ADD     A2, A0
        04F0.0000: LDB     A3, [A2]
        04F2.0000: XOR     A3, A1
        04F4.0000: STB     [A2],A3
        04F6.0000: RET
@gimli_squeeze_byte:
        04F8.0000: LDW     A1, [A0 + 0x30]
        04FD.0000: ADD     A0, A1
        04FF.0000: LDB     A0, [A0]
        0501.0000: RET
@gimli_advance:
        0503.0000: ADD     A1, A0, 0x30
        0508.0000: LDW     A2, [A1]
        050A.0000: INC     A2, 1
        050C.0000: STW     [A1],A2
        050E.0000: CMP     A2, 0x10
        0512.0000: RET.NE
        0514.0000: PSH     {A1, RA-RD}
        0517.0000: FCR     @gimli
        051A.0000: POP     {A1}
        051D.0000: STW     [A1],ZERO
        051F.0000: POP     {PC-DPC}
@gimli_absorb:
        0522.0000: MOV     A2, A2
        0524.0000: RET.EQ
        0526.0000: PSH     {S0-FP, RA-RD}
        0529.0000: INC     FP, SP, 6
        052C.0000: MOV     S0, A0
        052E.0000: MOV     S1, A1
        0530.0000: MOV     S2, A2
        0532.0000: LDB     A1, [S1]
        0534.0000: INC     S1, 1
        0536.0000: MOV     A0, S0
        0538.0000: FCR     @gimli_absorb_byte
        053B.0000: MOV     A0, S0
        053D.0000: FCR     @gimli_advance
        0540.0000: INC     S2, -1
        0542.0000: BRR.NE  @gimli_hash_update+0x10 //0532.0000
        0545.0000: INC     SP, FP, -6
        0548.0000: POP     {S0-FP, PC-DPC}
@gimli_squeeze:
        054B.0000: MOV     A2, A2
        054D.0000: RET.EQ
        054F.0000: PSH     {S0-FP, RA-RD}
        0552.0000: INC     FP, SP, 6
        0555.0000: MOV     S0, A0
        0557.0000: MOV     S1, A1
        0559.0000: MOV     S2, A2
        055B.0000: ADD     A0, 0x30
        055F.0000: MOV     A1, 0xF
        0563.0000: STW     [A0],A1
        0565.0000: MOV     A0, S0
        0567.0000: FCR     @gimli_advance
        056A.0000: MOV     A0, S0
        056C.0000: FCR     @gimli_squeeze_byte
        056F.0000: STB     [S1],A0
        0571.0000: INC     S1, 1
        0573.0000: INC     S2, -1
        0575.0000: BRR.NE  @gimli_squeeze+0x1a //0565.0000
        0578.0000: INC     SP, FP, -6
        057B.0000: POP     {S0-FP, PC-DPC}
@gimli_pad:
        057E.0000: PSH     {A0, FP, RA-RD}
        0581.0000: INC     FP, SP, 2
        0584.0000: MOV     A1, 0x1
        0588.0000: FCR     @gimli_absorb_byte
        058B.0000: POP     {A0}
        058E.0000: ADD     A0, 0x2F
        0592.0000: LDB     A1, [A0]
        0594.0000: XOR     A1, 0x1
        0598.0000: STB     [A0],A1
        059A.0000: MOV     SP, FP
        059C.0000: POP     {FP, PC-DPC}
@gimli_hash_init:
        059F.0000: MOV     A1, ZERO
        05A1.0000: MOV     A2, ZERO
        05A3.0000: MOV     A3, ZERO
        05A5.0000: ADD     A0, 0x30
        05A9.0000: STW     [A0],ZERO
        05AB.0000: PSH     A0, {ZERO, A1-A3}
        05AF.0000: PSH     A0, {ZERO, A1-A3}
        05B3.0000: PSH     A0, {ZERO, A1-A3}
        05B7.0000: PSH     A0, {ZERO, A1-A3}
        05BB.0000: PSH     A0, {ZERO, A1-A3}
        05BF.0000: PSH     A0, {ZERO, A1-A3}
        05C3.0000: RET
@gimli_hash_final:
        05C5.0000: PSH     {A0-A2, FP, RA-RD}
        05C8.0000: INC     FP, SP, 6
        05CB.0000: FCR     @gimli_pad
        05CE.0000: POP     {A0-A2}
        05D1.0000: FCR     @gimli_squeeze
        05D4.0000: POP     {FP, PC-DPC}
@gimli_hash:
        05D7.0000: PSH     {A0-A3, FP, RA-RD}
        05DA.0000: INC     FP, SP, 8
        05DD.0000: SUB     SP, 0x32
        05E1.0000: MOV     A0, SP
        05E3.0000: FCR     @gimli_hash_init
        05E6.0000: ADD     A5, SP, 0x36
        05EB.0000: POP     A5, {A1-A2}
        05EF.0000: MOV     A0, SP
        05F1.0000: FCR     @gimli_absorb
        05F4.0000: ADD     A5, SP, 0x32
        05F9.0000: POP     A5, {A1-A2}
        05FD.0000: MOV     A0, SP
        05FF.0000: FCR     @gimli_hash_final
        0602.0000: MOV     SP, FP
        0604.0000: POP     {FP, PC-DPC}
@memcmp8:
        0607.0000: MOV     A3, A0
        0609.0000: LDB     A4, [A3]
        060B.0000: LDB     A5, [A1]
        060D.0000: SUB     A0, A4, A5
        0610.0000: RET.NE
        0612.0000: INC     A3, 1
        0614.0000: INC     A1, 1
        0616.0000: INC     A2, -1
        0618.0000: BRR.NE  @memcmp8+0x2 //0609.0000
        061B.0000: RET
@memcmp16:
        061D.0000: MOV     A3, A0
        061F.0000: LDW     A4, [A3]
        0621.0000: LDW     A5, [A1]
        0623.0000: SUB     A0, A4, A5
        0626.0000: RET.NE
        0628.0000: INC     A3, 2
        062A.0000: INC     A1, 2
        062C.0000: INC     A2, -2
        062E.0000: BRR.NE  @memcmp16+0x2 //061F.0000
        0631.0000: RET
@memcmp:
        0633.0000: MOV     A2, A2
        0635.0000: MOV.EQ  A0, ZERO
        0637.0000: RET.EQ
        0639.0000: MOV     A3, A0
        063B.0000: AND     A4, A3, 0x1
        0640.0000: AND     A5, A1, 0x1
        0645.0000: XOR     A4, A5
        0647.0000: BRR.NE  @memcmp8+0x2 //0609.0000
        064A.0000: MOV     A4, A4
        064C.0000: BRR.EQ  @memcmp+0x2d //0660.0000
        064F.0000: LDB     A4, [A3]
        0651.0000: LDB     A5, [A1]
        0653.0000: SUB     A0, A4, A5
        0656.0000: RET.NE
        0658.0000: INC     A3, 1
        065A.0000: INC     A1, 1
        065C.0000: INC     A2, -1
        065E.0000: RET.EQ
        0660.0000: PSH     {RA-RD}
        0663.0000: FCR     @memcmp16+0x2 //061F.0000
        0666.0000: MOV     A0, A0
        0668.0000: POP.NE  {PC-DPC}
        066B.0000: AND     ZERO, A2, 0x1
        0670.0000: POP.EQ  {PC-DPC}
        0673.0000: INC     A2, -1
        0675.0000: LDB     A4, [A3 + A2]
        0678.0000: LDB     A5, [A1 + A2]
        067B.0000: SUB     A0, A4, A5
        067E.0000: POP     {PC-DPC}

@read_line:
        0681.0000: MOV     A2, A0
        0683.0000: MOV     A0, ZERO
        0685.0000: BRR     @read_line+0x13 //0694.0000
        0688.0000: INC     A0, 1
        068A.0000: STB     [A2],A3
        068C.0000: INC     A2, 1
        068E.0000: CMP     A3, 0xA
        0692.0000: RET.EQ
        0694.0000: CMP     A0, A1
        0696.0000: RET.GE
        0698.0000: RDB     A3, (0)
        069A.0000: BRR.LT  @read_line+0x7 //0688.0000
        069D.0000: XOR     A0, 0xFFFF
        06A1.0000: RET
        
        06A3.0000: PSH     {A1, FP, RA-RD}
        06A6.0000: INC     FP, SP, 2
        06A9.0000: MOV     A1, 0x20
        06AD.0000: MOV     A2, SP
        06AF.0000: MOV     A3, 0x2
        06B3.0000: FCR     @gimli_hash
        06B6.0000: MOV     SP, FP
        06B8.0000: POP     {FP, PC-DPC}

@some_func2:
        06BB.0000: PSH     {FP, RA-RD}
        06BE.0000: MOV     FP, SP
        06C0.0000: MOV     A1, 0x6874
        06C4.0000: MOV     A2, 0x5F33
        06C8.0000: PSH     {A1-A2}
        06CB.0000: ADD     A0, PC, 0x330
        06D0.0000: MOV     A1, SP
        06D2.0000: MOV     A2, 0x4
        06D6.0000: FCR     @gimli_absorb
        06D9.0000: MOV     SP, FP
        06DB.0000: POP     {FP, PC-DPC}

@some_func1:
        06DE.0000: PSH     {S0-S1, FP, RA-RD}
        06E1.0000: INC     FP, SP, 4
        06E4.0000: ADD     S0, PC, 0x317
        06E9.0000: MOV     A0, S0
        06EB.0000: FCR     @gimli_hash_init
        06EE.0000: MOV     A0, S0
        06F0.0000: MOV     A2, 0x7B6E
        06F4.0000: MOV     A1, 0x7573
        06F8.0000: PSH     {A1-A2}
        06FB.0000: MOV     A1, SP
        06FD.0000: MOV     A2, 0x4
        0701.0000: FCR     @gimli_absorb
        0704.0000: INC     SP, 4
        0706.0000: FCR     @read_line+0x3a //06BB.0000
        0709.0000: MOV     A0, S0
        070B.0000: ADD     A1, PC, 0x235
        0710.0000: MOV     A2, 0x5
        0714.0000: FCR     @gimli_absorb
        0717.0000: ADD     S1, PC, 0x338
        071C.0000: LDB     A1, [S1]
        071E.0000: SHL     A1, 0x9
        0721.0000: BRR.LT  @read_line+0xb3 //0734.0000
        0724.0000: SRU     A1, 0x9
        0727.0000: INC     S1, 1
        0729.0000: MOV     A0, S0
        072B.0000: FCR     @gimli_absorb_byte
        072E.0000: FCR     @gimli_advance
        0731.0000: BRR     @read_line+0x9b //071C.0000
        0734.0000: RDC     A3, INSN_COUNT_LO
        0736.0000: RDC     A4, INSN_COUNT_HI
        0738.0000: ADD     A3, 0x280F
        073C.0000: ADD     A4, 0x7D52
        0740.0000: PSH     {A3-A4}
        0743.0000: MOV     A0, S0
        0745.0000: MOV     A1, SP
        0747.0000: MOV     A2, 0x4
        074B.0000: FCR     @gimli_absorb
        074E.0000: INC     SP, 4
        0750.0000: MOV     A0, S0
        0752.0000: ADD     A1, PC, 0x2DC
        0757.0000: MOV     A2, 0x20
        075B.0000: FCR     @gimli_hash_final
        075E.0000: INC     SP, FP, -4
        0761.0000: POP     {S0-S1, FP, PC-DPC}
@main:
        0764.0000: PSH     {S0, FP, RA-RD}
        0767.0000: INC     FP, SP, 2
        076A.0000: SUB     SP, 0x52
        076E.0000: FCR     @read_line+0x5d //06DE.0000
        0771.0000: MOV     S0, ZERO
        0773.0000: ADD     A0, PC, 0x188
        0778.0000: FCR     @puts
        077B.0000: MOV     A0, SP
        077D.0000: MOV     A1, 0x32
        0781.0000: FCR     @read_line
        0784.0000: INC     A0, -1
        0786.0000: WRB.NG  (0), 0xA
        078A.0000: MOV.NG  A0, 0x1
        078F.0000: FCR.NG  0xFF00
        0793.0000: CMP     A0, 0x6
        0797.0000: BRR.NE  @main+0x68 //07CC.0000
        079A.0000: MOV     A1, SP
        079C.0000: POP     A1, {A2-A4}
        07A0.0000: CMP     A2, 0x6F66
        07A4.0000: CMP.EQ  A3, 0x6772
        07A8.0000: CMP.EQ  A4, 0x746F
        07AC.0000: BRR.NE  @main+0x68 //07CC.0000
        07AF.0000: ADD     A0, PC, 0x1D4
        07B4.0000: FCR     @puts
        07B7.0000: ADD     A0, PC, 0x277
        07BC.0000: MOV     A1, 0x20
        07C0.0000: FCR     @print_hex
        07C3.0000: WRB     (0), 0x22
        07C6.0000: WRB     (0), 0xA
        07C9.0000: BRR     @main+0xf //0773.0000
        07CC.0000: MOV     A3, A0
        07CE.0000: SUB     A0, FP, 0x22
        07D3.0000: MOV     A1, 0x20
        07D7.0000: MOV     A2, SP
        07D9.0000: FCR     @gimli_hash
        07DC.0000: SUB     A0, FP, 0x22
        07E1.0000: ADD     A1, PC, 0x24D
        07E6.0000: MOV     A2, 0x20
        07EA.0000: FCR     @memcmp
        07ED.0000: CMP     A0, ZERO
        07EF.0000: BRR.NE  @main+0x99 //07FD.0000
        07F2.0000: ADD     A0, PC, 0x1AC
        07F7.0000: FCR     @puts
        07FA.0000: BRR     @main+0xb5 //0819.0000
        07FD.0000: ADD     A0, PC, 0x11C
        0802.0000: FCR     @puts
        0805.0000: INC     S0, 1
        0807.0000: CMP     S0, 0x3
        080B.0000: BRR.LT  @main+0xf //0773.0000
        080E.0000: ADD     A0, PC, 0x137
        0813.0000: FCR     @puts
        0816.0000: BRR     @main+0xf //0773.0000
        0819.0000: MOV     A0, ZERO
        081B.0000: INC     SP, FP, -2
        081E.0000: POP     {S0, FP, PC-DPC}
        0821.0000: STW     [FP],FP
        0823.0000: BRR     @main

There is a hash function named gimli. The process is implemented in @gimli_hash:

  1. call @gimli_hash_init
  2. call @gimli_absorb
  3. call @gimli_hash_final

The program computes the hash of flag and compares it to the hash of the user’s input. To bypass this, we recover the secret by reverse-engineering the hashing process in some_func1, which initializes the hash with @gimli_hash_init and absorbs data using @gimli_absorb and related functions. Initially, attempting to set a breakpoint on @gimli_absorb missed the individual bytes absorbed via @gimli_absorb_byte.

Therefore, we use the debugger to find the A1 parameter of @gimli_absorb_byte, byte by byte:

$ ./runpeg --debug AccessCode.peg

EAR debugger
(dbg) b 04e9
Created breakpoint #1 at address 04E9 (X)
(dbg) c
HW breakpoint #1 hit trying to execute 1 byte at 04E9
A breakpoint was hit

Thread state:
   (ZERO)R0: 0000      (S1)R8: FD97
     (A0)R1: 0A00      (S2)R9: 0004
     (A1)R2: 0073     (FP)R10: FD90
     (A2)R3: 0004     (SP)R11: FD8A
     (A3)R4: 0000     (RA)R12: 053B
     (A4)R5: 0000     (RD)R13: 0000
     (A5)R6: EA23     (PC)R14: 04E9 //@gimli_absorb_byte+0
     (S0)R7: 0A00    (DPC)R15: 0000
FLAGS: zspcvXr

Next instructions:
@gimli_absorb_byte:
        04E9.0000: LDW     A2, [A0 + 0x30]
        04EE.0000: ADD     A2, A0
        04F0.0000: LDB     A3, [A2]
        04F2.0000: XOR     A3, A1
        04F4.0000: STB     [A2],A3
(dbg) c
HW breakpoint #1 hit trying to execute 1 byte at 04E9
A breakpoint was hit

Thread state:
   (ZERO)R0: 0000      (S1)R8: FD98
     (A0)R1: 0A00      (S2)R9: 0003
     (A1)R2: 0075     (FP)R10: FD90
     (A2)R3: 0001     (SP)R11: FD8A
     (A3)R4: 0073     (RA)R12: 053B
     (A4)R5: 0000     (RD)R13: 0000
     (A5)R6: EA23     (PC)R14: 04E9 //@gimli_absorb_byte+0
     (S0)R7: 0A00    (DPC)R15: 0000
FLAGS: zspcvXr

Next instructions:
@gimli_absorb_byte:
        04E9.0000: LDW     A2, [A0 + 0x30]
        04EE.0000: ADD     A2, A0
        04F0.0000: LDB     A3, [A2]
        04F2.0000: XOR     A3, A1
        04F4.0000: STB     [A2],A3
(dbg) c
HW breakpoint #1 hit trying to execute 1 byte at 04E9
A breakpoint was hit

Thread state:
   (ZERO)R0: 0000      (S1)R8: FD99
     (A0)R1: 0A00      (S2)R9: 0002
     (A1)R2: 006E     (FP)R10: FD90
     (A2)R3: 0002     (SP)R11: FD8A
     (A3)R4: 0075     (RA)R12: 053B
     (A4)R5: 0000     (RD)R13: 0000
     (A5)R6: EA23     (PC)R14: 04E9 //@gimli_absorb_byte+0
     (S0)R7: 0A00    (DPC)R15: 0000
FLAGS: zspcvXr

Next instructions:
@gimli_absorb_byte:
        04E9.0000: LDW     A2, [A0 + 0x30]
        04EE.0000: ADD     A2, A0
        04F0.0000: LDB     A3, [A2]
        04F2.0000: XOR     A3, A1
        04F4.0000: STB     [A2],A3

Converting the values of A1 (in hex) to ASCII yields:

>>> bytes.fromhex("73756e")
b'sun'

By repeatedly stepping through the debugger and collecting the A1 values, we recover the flag: sun{th3_fun_p4r7_15_nEAR}.