티스토리 뷰

리버싱

PIN API에 대해

삼전동해커 2022. 1. 18. 13:18

PIN에서 사용하는 API들에 대해 정리하려고 한다.

먼저 pin은 jit 컴파일 버전임이 중요하다. 이는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 기법이다.

프로그램 전체를 스캔하여 모두 기계어로 번역하는 컴파일러 방식과 프로그램 실행 시 한번에 한 문장만 기계어로 번역하는 인터프리터 방식의 중간 방식이라고 할 수 있다. 실행 시점에 인터프리터 방식으로 기계어로 번역하고 해당 기계어를 캐싱하여 같은 함수가 여러번 불릴 때 다시 기계어가 생성되는걸 방지한다. pin은 이런 방식을 trace instrumentation이라고 부른다.

 

TRACE란

TRACE란 처음 시작 부분부터 끝날 때까지의 BBL들의 연속된 리스트이다. 

예를 들어 main문을 실행하다 다른 함수의 호출을 만나게 되면 pin을 새로운 trace를 생성한다. pin은 trace를 bbl으로 나누는데, bbl은 하나의 입구와 하나의 출구를 가지고 있다. 

 

BBL이란

Basic BLock의 줄임말로 어셈블리어에서 어떤 분기문에 의해 프로그램의 흐름이 바뀌었을 때, 그 한 단락을 의미한다.

switch(i)
{
	case 4: total++;
	case 3: total++;
	case 2: total++;
	case 1: total++;
	case 0:
	default: break;
}

 

위와 같은 코드를  어셈으로 확인해보면 아래와 같다.

.L7:
        addl    $1, -4(%ebp)
.L6:
        addl    $1, -4(%ebp)
.L5:
        addl    $1, -4(%ebp)
.L4:
        addl    $1, -4(%ebp)

각각의 다른 i 값이 들어왔을 때, pin은 4개의 명령어 모두를 포함하는 BBL이나 3개의 명령어를 포함하는 BBL이나.. 여러 경우의 BBL을 만든다. 

BBL과 trace

 

INS란

한 instruction에 대해 검사하는 것.  instruction에 대해 콜백함수를 호출하는 등.

 

IMG란(여기서 img는 exe,dll 파일 등을 이미지라고 부른다.)

IMG는 바이너리에 해당되는 모든 데이터 구조를 의미한다. 공유 라이브러리 또한 IMG의 한 종류이다. IMG API는 내부 쓰레드를 포함해 모든 스레드에서 사용할 수 있다.

EX ) VOID ImageLoad(IMG img, VOID *v)

위처럼 함수를 생성해 IMG가 로드되면 사용할 코드를 구현할 수 있다.

IMG_TYPE_STATIC 정적으로 생성된 IMG 관련 메인 이미지
IMG_TYPE_SHARED 공유 라이브러리에 관련된 메인 이미지
IMG_TYPE_SHAREDLIB pie관련된 공유 라이브러나 메인 이미지
IMG_TYPE_RELOCATEABLE .o 파일 관련 오브젝트
IMG_TYPE_DYNAMIC_CODE 동적 생성된 코드
IMG_TYPE_API_CREATED IMG_CreateAt()으로 생성된 이미지

*pie란 ASLR과 비슷하게 바이너리의 주소가 랜섬하게 지정되는 보호기법.

 

IMG 관련 api

1. PIN_CALLBACK IMG_AddInstrumentFunction(IMAGECALLBACK fun, VOID *v)

- 가져온 이미지에 callback 함수를 붙이기 위해서 사용된다. main문에서 사용.

ex) IMG_AddInstrumentFunction(ImageLoad, 0);

 

인자 fun : callback함수에 전달할 이미지.

인자 *v : 이미지가 로드되었을 때 전달할 값

리턴값 :  PIN_CALLBACK

 

2. PIN_CALLBACK IMG_AddUnloadFunction(IMAGECALLBACK fun, VOID *v)

- 가져오지 못한 이미지에 대해 callback 함수를 붙임. 

 

SEC이란

SEC은 IMG 내의 섹션이 발견되면 모델이 형성된다. 

RTN이란

루틴(함수)단위로 호출.(하나의 함수단위로 호출되는 것)

 

symbols

symbols는 코드 내에 선언된 변수들이 사용자 입력을 통해 값이 초기화될 때, 아직 입력되지 않은 변수들에게 기호를 붙여 어셈블리 내에서 해당 기호를 통해 구분을 할 수 있도록 하는 것.

 

 

INS_Insertcall()

 

 INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END);

insertcall() 명령 위치 설명
IPOINT_BEFORE 명령이나 루틴 전에 콜(함수)을 삽입
IPOINT_AFTER 명령이 실패하거나 리턴값을 내보낸 후에 콜을 삽입
IPOINT_ANYWHERE 콜을 trace나 BBL 내에 삽입
IPOINT_TAKEN_BRANCH  

 

https://software.intel.com/sites/landingpage/pintool/docs/98484/Pin/html/index.html

'리버싱' 카테고리의 다른 글

Opcode에 대해  (0) 2022.02.07
DBI PIN tool 사용하기  (0) 2022.01.18
abex crackme 4  (0) 2021.02.18
abex crackme 3  (0) 2021.02.18
abex crackme 2  (0) 2021.02.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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 29 30
글 보관함