들어가며
옛날 마이크로컴퓨터들이나 임베디드 시스템들은, 요즘과 같이 SoC(System-on-Chip) 디자인이 아닌, CPU 따로, RAM 따로, I/O Peripheral 들이 따로 분리되어 있는 구조였습니다. 이러한 시스템에서 어드레스 디코더 또한, CPU 밖에 존재하게 되는데, 어드레스 디코더의 동작이 간단한 경우, 74xx 시리즈 로직 IC 를 사용하여 어드레스 디코딩을 구현하는 경우도 있었지만, 이의 동작이 복잡한 경우는 대부분 PLD(Programmable Logic Device) 혹은 GAL(Gate Array Logic) 과 같은, 요즘의 FPGA의 조상뻘쯤 되는 칩을 사용하여 구현하는 것이 일반적이었습니다.
이러한 시스템에서 메모리 주소 공간을 알아내기 위해서는 시스템의 매뉴얼이 있으면 좋지만, 이러한 메뉴얼이 없을 경우에는, 해당 PLD 를 리버스 엔지니어링 해야 합니다.
너무 불편했던 첫 번째 시도
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 칩의 내부 구성을 복구해낼 수 있습니다.