▣Debug Register
하드웨어 breakpoint를 가능하게 하는 레지스터
[그림 : http://hackability.kr/entry/익스플로잇-개발-12-EMET-52]
DR0~3 : 하드웨어 브레이크포인터의 주소. 해당주소 접근/쓰기/실행 시 INT1발생
DR6(Debug Status Register)
INT1이 발생한 이유를 알려주는 레지스터. 프로세스에 의해 세트되고 사용자가 직접 지워줘야함
- B0~3(Bit0~Bit3) : 어떤 레지스터에 의해 엑세스되어졌는지 나타냄.
- BD(Break for Debug register access,Bit13) : DR7의 GD비트에 의해 디버그레지스터가 잠겨있을 때 디버그 레지스터를 엑세스하면 INT1을 1로 세트되어짐
- BS(Break for Single-step,Bit 14) : EFLAGS레지스터의 TF비트가 세트되어 INT1이 발생
- BT(Break for Task switch,Bit 15) : Task변환시 트레이싱을 가능하게 하는 TSS의 T비트가 셋트되어 INT1이 발생
DR7(Debug Control Register)
4개의 하드웨어브레이크포인터 발동조건을 지정
- L1~3(Local enable, Bit0) : 세트되었을 때에 현재의 태스크 기간동안만 하드웨어 브레이크 포인트(DR0~3)가 작동. 다음 태스크변환때 비트는 자동으로 0
- G0~3(Global Enble,Bit1) : 각 DR0~3에 저장되어있는 주소에 대해 모든 시간동안 bp가 동작.
- LE(Local Exact, Bit8),GE(Global Exact,Bit9) : 비트가 0 일경우 브레이크포인트에 접근시 바로 인터럽트가 걸리지 않고 몇 개의 명령이 실행된이후 인터럽트가 발생. (LE는 하나의 태스크기간 GE는 모든 기간)
- GD(Global Debug Access , Bit13) : 하드웨어 브레이크포인트와 연과없이 디버그 레지스터에 대한 엑세스가 이루어지면 인터럽트가 발생한다. 이후 자동으로 0
- RW0~3(Read/Write access, Bit 16~17) : 말그대로 하드웨어브레이크포인터에 걸린 주소에 접근/쓰기/읽기할 때 발동시킬지 설정하는 비트
RW |
설명 |
00 |
명령어 실행시 |
01 |
쓰기 |
10 |
CR4레지스터에 있는 DE플래그가 1일경우,I/0포트에 대한 읽기 쓰기작업시 |
11 |
모든엑세스시 브레이크포인트 |
- LEN 0 ~3(break-point Length,bit18-19) : 하드웨어 프레이크 포인트주소의 범위, 명령실행시에는 00으로 셋팅, 데이트 엑세스시 다음의 표와 같다.
LEN |
BP유효범위 길이 |
BP시작번지 |
00 |
1byte |
임의 |
01 |
2byte |
짝수번지 |
10 |
3byte |
- |
11 |
4byte |
4 배수 |
'Security > Reversing' 카테고리의 다른 글
[Anti-VM] - 어셈블리 STR편 (0) | 2018.01.14 |
---|---|
PEB구조체 LDR을 이용한 Kernel32.dll주소 찾기. (0) | 2017.12.07 |
Zw API와 Nt API의 차이 (0) | 2017.05.11 |
[AntiVM 탐지 우회] (0) | 2017.03.27 |
※함수호출규약 (0) | 2017.03.15 |
댓글