[ko] Technote: TL866II-Plus 를 사용한 PLD 리버스 엔지니어링

들어가며

PALCE22V10H-25PC/4 칩이 TL866II-Plus 롬 라이터에 꽂혀 있음

옛날 마이크로컴퓨터들이나 임베디드 시스템들은, 요즘과 같이 SoC(System-on-Chip) 디자인이 아닌, CPU 따로, RAM 따로, I/O Peripheral 들이 따로 분리되어 있는 구조였습니다. 이러한 시스템에서 어드레스 디코더 또한, CPU 밖에 존재하게 되는데, 어드레스 디코더의 동작이 간단한 경우, 74xx 시리즈 로직 IC 를 사용하여 어드레스 디코딩을 구현하는 경우도 있었지만, 이의 동작이 복잡한 경우는 대부분 PLD(Programmable Logic Device) 혹은 GAL(Gate Array Logic) 과 같은, 요즘의 FPGA의 조상뻘쯤 되는 칩을 사용하여 구현하는 것이 일반적이었습니다.

이러한 시스템에서 메모리 주소 공간을 알아내기 위해서는 시스템의 매뉴얼이 있으면 좋지만, 이러한 메뉴얼이 없을 경우에는, 해당 PLD 를 리버스 엔지니어링 해야 합니다.

너무 불편했던 첫 번째 시도

Arduino Mega 2560과 AVR Dragon ZIF 소켓이 점퍼 케이블로 이어져 있고, AVR Dragon ZIF 소켓에는 PALCE22V10H-25PC/4 칩이 꽃혀 있다.

PLD의 경우, 논리의 구성이 간단하기 때문에, 이와 같이 Arduino 를 이용한 Fuzzer 를 제작하여 진리표를 매핑해내는 것을 시도할 수 있습니다. 하지만 이러한 구성은, 점퍼 케이블의 신뢰성 문제와, 리버스 엔지니어링 지그 셋업이 힘들다는 단점이 있습니다.

어? 잠깐만, TL866II-Plus 의 논리 IC 점검 기능을 사용할 수 있지 않을까?

TL866II-Plus 는 기본적으로 롬라이터지만, 74xx 와 같은, 논리 IC 를 테스트할 수 있는 기능을 가지고 있습니다. 이를 PGA 리버스 엔지니어링 용도로 사용하려면 커스텀 진리표를 작성할 수 있는 기능이 필요한데, 다행스럽게도 TL866II-Plus 는 해당 기능을 제공합니다.

하지만, 공식 소프트웨어의 진리표 편집 기능은, 74xx 시리즈와 같이 단순한 로직 IC 테스팅 목적으로 만들어졌기에, 굉장히 사용하기 불편하며, 입 출력이 GUI로만 이루어지기에, 수백 개의 진리표 항목을 사용하여 테스팅하고, 이를 다른 스크립트로 후처리해, 논리 회로를 알아내는 데에는 부적합합니다.

오픈-소스 TL866II-Plus 구동 소프트웨어

다행스럽게도, 더 유연하게 사용할 수 있는 오픈 소스 TL866II-Plus 구동 소프트웨어가 존재합니다. 해당 소프트웨어는 공식 소프트웨어에서 지원하는 기능의 대부분을 지원하며, 더불어, 로직 IC 데이터베이스와 진리표를 바이너리 파일이 아닌 XML 파일을 이용해 처리하기 때문에, 공식 소프트웨어보다 더 간단하게 PAL 퍼징이 가능합니다.

간단하게 마이크로마우스의 어드레스 디코더를 퍼징할 수 있는 XML 파일을 만들어 테스트해 봅시다. (프로토타입 입니다. XML 인코더를 사용하지 않고 그냥 대충 작성했으므로 예제로만 참고하세요)

'use strict';
const jp1 = 1;

console.log(`
<?xml version="1.0" encoding="utf-8"?>
<infoic>
  <database device="TL866II">
    <manufacturer name="Logic Ic">
      <ic name="MOUSE196" type="5" voltage="5V" pins="22">`);
for (let i = 0; i < 0x20; i++) {
    let str = '';
    for (let j = 0; j < 5; j++) {
        str = `${(i >> j) & 0x01} ${str}`;
    }
    console.log(`        <vector id="${i*2}"> 0 ${str}1 0 ${jp1} X G X X X X X X X L H H V </vector>`);
    console.log(`        <vector id="${i*2}"> 0 ${str}0 1 ${jp1} X G X X X X X X X L H H V </vector>`);
}

console.log(`
      </ic>
    </manufacturer>
  </database>
</infoic>`);

이 출력물을 minipro 를 이용해 테스트합니다.

⬢ perillamint@deepthought: ~/micromouse (local) 2022-01-12T03:09:23+0900
→ minipro --logicic decoder.xml -p MOUSE196 -T
Using overridden database file decoder.xml
Found TL866II+ 04.2.128 (0x280)
Warning: Firmware is newer than expected.
  Expected  04.2.126 (0x27e)
  Found     04.2.128 (0x280)
      1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 
0000: 0  0  0  0  0  0  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0001: 0  0  0  0  0  0  0  1  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0002: 0  0  0  0  0  1  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0003: 0  0  0  0  0  1  0  1  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0004: 0  0  0  0  1  0  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0005: 0  0  0  0  1  0  0  1  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0006: 0  0  0  0  1  1  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0007: 0  0  0  0  1  1  0  1  1  X  G  X  X  X  X  X  X  X  L- H  H  V  
0008: 0  0  0  1  0  0  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H- V  
0009: 0  0  0  1  0  0  0  1  1  X  G  X  X  X  X  X  X  X  L- H  H- V  
0010: 0  0  0  1  0  1  1  0  1  X  G  X  X  X  X  X  X  X  L- H  H- V  
...

이와 같이 해당 진리표의 입력을 칩에 준 뒤, 출력값과 다른 값은 뒤에 – 를 붙여 표시해 주는 것 을 확인할 수 있습니다.

이 결과물을 이용해, Carnaugh map 을 이용하여, 손으로 풀거나, 아니면 자동으로 논리 최적화를 해 주는 소프트웨어를 사용하는 방식 등을 이용함으로서, PAL 칩의 내부 구성을 복구해낼 수 있습니다.