PIN 툴 이야기

2010/02/04 15:13
제가 요새 진행하고 있는 작은 코딩은 특정 분기에 도달 가능한 데이터를 생성하는 작업입니다.
PIN 툴에 대해서 잘 모르기 때문에, 프로그램의 커다란 구조를 설계하기가 매우 힘이드네요.
구조를 잡고 코드를 그리다보면, PIN 에서 이미 제공하는 기능이 있다는걸 깨닫고
클래스들을 여러군데 갈아 엎어야 하기 때문입니다.

대학교 소프트웨어 공학에서 배운 UML 그리기 같은 것들은, 간단한 것이 아님을
실감하고 있습니다. ㅋㅋ

제가 깜짝 놀란 핀툴의 기능 중 하나는, IA의 eflags 레지스터에 접근하는 순간을
캐치할 수 있다는 것인데, 사실 eflags 에 국한된 것만이 아니라, 모든 데이터 이동을
인스트럭션 파싱을 하지 않고도 알아낼 수 있습니다.

예를들면 test eax, eax 라는 명령어는 PIN 툴의 가상 명령어 변환계층에서
read eax
read eax
write eflags
라는 세가지의 오퍼레이션으로 변환되며 레지스터 억세스를 프로그래머가 캐치 가능하게 해줍니다.

eflags 에 접근하는 순간을 명령어를 신경쓰지 않고 알아낼 수 있단 것은 매우 중요한 사실인데,
특정 분기점에 대해 사용자의 입력이 분기 평가에 영향을 미치는지 알고 싶은 경우를 상상해 봅니다.

인텔 명령어는 매뉴얼을 펼쳐 보시면 알겠지만, 종류가 ㅈ나 많기 때문에, 처리하기 쉽지않죠.

사용자 입력 소스의 원천 데이터를 P 라고 표기하면 하나의 명령어에서 P 와 관련된
데이터 이동이 일어날 수 있습니다. 그럼 그 데이터들은 이제 P 와 연관이 되는거죠. (Taint analysis)
리커시브하게, 한번 P 와 연관된 데이터들은 P 와 동일하게 처리하면 됩니다.

그리고 이러한 간단한 방식에 따라 eflags 가 P 와 연관이 된다면, eflags 가 P 와 연관된 시점에서
분기를 결정할 수 있게 되는 것입니다.

이 방식의 장점은 PIN 툴에서 제공하는 간단한 api 들을 사용해서 매우 쉽게 특정 분기에서
사용자의 입력이 영향을 미치는 지 알수 있다는 점입니다. 물론 단점 또한 존재하는데,
Instruction 들을 신경쓰지 않고 데이터의 이동에만 집중 하였기 때문에,
분기에 도달했을 시에 정확한 P 와 연계된 자료들은 알 수 없다는 것입니다.

으흠... 코드를 적게 짜면서 좀 더 멋진 방법이 있는지 다시 생각해보아야 겠네요.. ㅋㅋ
게으름은 내 삶의 적이지만, 코드의 질을 개선하는데엔 큰 도움을 주는 것 같습니다.. ㅋㅋ

Posted by 츠피
◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [104] : NEXT ▶

BLOG main image
기왕 달릴꺼면 Ring-0 에서 달려보자!!! by 츠피

공지사항

카테고리

분류 전체보기 (104)
Profile (1)
Concept (27)
Windows Kernel (5)
Hunting (7)
Keyboard Internals (22)
Fun~! (35)
Link (0)

글 보관함

달력

«   2010/02   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28            
Total : 51,792
Today : 1 Yesterday : 46