ポケモン赤の任意コード実行で「ポケモン言えるかな?」

f:id:fujidig:20220105144938p:plain

ポケモンの姿+名前の表示と鳴き声の再生を「ポケモン言えるかな?」の順番で行うプログラムを任意コード実行バグで実行しました。

なかなかしょうもないですね。

アセンブリコードは以下の通りとなります。

[org(0xd9b3)]
first:
    ld a, 164
    ld b, a
    ld de, table
loop:
    ld a, [de]
    or a
    jp nz, nonzero
zero:
    push de
    push bc
    ld c, 60
    call 0x376F # DelayFrames
    pop bc
    pop de
    jr join
nonzero:
    ld [0xCF78], a
    ld [0xD092], a
    ld   hl, 0xc3a0
    push bc
    push de
    call 0x2F1C # GetMonHeader
    call 0x2D6D # LoadFrontSpriteByMonIndex
    pop de
    ld a, [de]
    push de
    ld [0xd0e3], a
    call 0x1A99 # GetMonName
    ld b, 0
    ld c, 6
    ld hl, 0xc3a7
    ld a, 0x7f
    call 0x3718 # FillMemory
    ld b, 0
    ld c, 6
    ld hl, 0xc3bb
    ld a, 0x7f
    call 0x3718 # FillMemory
    ld de, 0xcd68
    ld hl, 0xc3bb
    call 0x0405 # PlaceString
    pop de
    ld a, [de]
    push de
    call 0x2DBE # GetCryData
    call 0x0E33 # PlaySound
    #call 0x2DB5 # PlayCry
    ld c, 15
    call 0x376F # DelayFrames
    pop de
    pop bc
join:
    inc de
    dec b
    jr nz, loop
    ret
table:
    db 0x54, 0x42, 0x08, 0x96, 0x2f, 0xa5, 0x6b, 0xa4, 0x68
    db 0x18, 0x3a, 0x11, 0x0c, 0x91, 0x99

    db 0x00
    
    db 0x6c, 0x66, 0xbd, 0x35, 0x84, 0x5a, 0x01, 0x78
    db 0xaa, 0x3b, 0x74, 0x0e, 0x37, 0x48, 0x4d, 0x69, 0xba
    
    db 0x00

    db 0x71, 0x93, 0x22, 0xb0, 0x28, 0xa6, 0x23, 0xad, 0x36
    db 0x65, 0xb1, 0x6e, 0x9d, 0x49, 0x67, 0x95, 0x33, 0x1a

    db 0x00

    db 0x7b, 0x8e, 0x5d, 0x55, 0x1b, 0x4e, 0x10, 0x61
    db 0x9e, 0x7c, 0x46, 0x5c, 0x21, 0x39, 0x9b

    db 0x00

    db 0x05, 0x60, 0x2e, 0x30, 0x70, 0x1d, 0x97, 0x85

    db 0x00

    db 0x12, 0x8f, 0x09, 0x1c, 0x17, 0x4b, 0xb2, 0x0a, 0x88

    db 0x00

    db 0x24, 0xbe, 0x64, 0x94, 0x0d, 0x02, 0x16, 0x31, 0x04, 0xa9

    db 0x00

    db 0x80, 0x62, 0x82, 0x2d, 0x0f, 0x03, 0xb9

    db 0x00

    db 0x6f, 0x40, 0x13, 0xbb, 0x5b, 0xa8, 0x2a, 0x8d
    db 0x9a, 0x6d, 0xb4, 0x41, 0x25, 0x4c, 0x19, 0x06

    db 0x00

    db 0x26, 0x8a, 0x2b, 0x2c, 0x7e, 0x81, 0x29, 0x98
    db 0xbc, 0xab, 0xa7, 0x90, 0x59, 0x83, 0x53, 0x72, 0x0b
    db 0x7d, 0x76, 0x07, 0x63, 0x8b, 0x47, 0x27, 0x52, 0x3c
    db 0xa3, 0x1e, 0x58, 0x6a, 0x77, 0xb3, 0x14, 0x4a, 0x75

    db 0x00
    db 0x00
    db 0x00

    db 0x15

    db 0x00