글을 쓰고 정리한다는 게 쉽지 않다. 기억을 되살려서 좀 재미나게 써보려 하는데..
내가 설계하고 개발하기 시작 한 패커는 그 당시 알려진 방식과 다르게 유지/보수가 편하도록 개발하였다.
쉘-코드 개발에서 어려운 점은 외부 코드 또는 데이터를 참조하지 않는 퓨어한 코드 덩어리여야 한다는 점이다.
당시 내가 리서치 한 방법은 어셈블리 언어를 통해 직접 바이트 코드를 추출하거나, IL을 통해 퓨어한 코드 덩어리가 추출되는 등의 방식이었다. 어떤 제품은 모듈 하나를 통으로 결합하는 방식도 사용되었다.
위와 같은 방식들은 나름 대중(?)적인 방법이지만 모두 유지/보수 문제 생겼다. 내가 저 방법을 사용했더라면, 제대로 된 리버서가 아닌 이상 일반 개발자들은 코드조차 보지 못하였을 것이다. 결국 내가 선택한 방법은 고급 언어를 사용할 수 있도록 하는 방식이었다.
개발자는 C언어로 작성하기만 하면 되며, 패커 코어에서 이를 재배치하여 쉘 코드로 변경해 주도록 하였다. 거기에 최초 패커는 C++로 권한을 넘기는 방법이었기에 개발자들은 C로 작성된 진입점을 볼 필요도 없었다.
다만, 시간 부족으로 코드-난독화 작업이 추가되지 않고, 고정적인 크기의 더미 코드가 추가되는 방식과 제3의 코드 난독화 도구가 사용되게 되었다. (고정 크기의 난독화는 시작과 끝에 대한 패턴을 찾고, 동일 패턴은 모두 코드-리프팅시키면 되었기에 난독화라고 하기가 좀 그렇다.)
웃기게도 다사다난하게 개발된 이 패커는 결국 프로젝트가 폭파되며 폐기되었다. 프로젝트가 완전 폭파된 게 아니고, 아무도 모르게 대체해야 하는 상태가 된 것인데, 기존 패커는 해당 프로젝트에 맞게 설계가 되었으며, 코어가 외부에 있는 형태였기에 재활용 자체가 불가능하였다.
결국 당시 내가 개인적으로 PoC 하던 패커로 다른 솔루션을 만들게 되었다.
여담 1.
쉘-코드라는 표현은 여러 의미로 사용되는데, 내가 사용한 표현은 그 자체로 동작 가능한 코드 블록을 의미한다.
여담 2.
IL은 대충 컴파일 중간 단계에 존재하는 커스텀 가능한 언어로 이해해 주길 바란다.
여담 3.
코드-리프팅 기법은 난독화된 코드를 분석가가 볼 수 있도록 불필요 코드를 제거하고, 올바르게 배치하여 펼치는 기법을 의미한다.
여담 4.
코드-난독화 기법은 알아보기 쉬운 원본 코드를 제거하고, 일반적인 방법으로는 보기 어려운 코드로 교체하는 기법이다. 패커 레벨에서는 이미 완성된(컴파일 된) 코드를 변조해야 하기에 인스트럭션 배치 방식과 운영체제 등 여러 가지 환경과 동작 방법을 알아두어야 한다.
All our dreams can come true, if we have the courage to pursue them.
'History > Tales' 카테고리의 다른 글
퇴사를 생각하며..(1) (0) | 2025.03.09 |
---|---|
잡담(2) (0) | 2024.12.29 |
잡담(1) (0) | 2024.12.24 |
VxLang 개발 기록(3) (0) | 2024.12.23 |
VxLang 개발 기록(1) (0) | 2024.12.21 |