BreakPoint
1. 브레이크포인트
▶ 브레이크포인트에는 하드웨어 브레이크포인트와 소프트웨어 브레이크포인트가 있다.
1) 소프트웨어 브레이크포인트
[1] 정의
▶ 실행동작에 브레이크포인트를 설정하는 것을 말한다.
▶ 기계어 'CC'로 표현하며 명령어는 'int 3'으로 표현한다.
▶ 브레이크포인트를 설정한 명령어의 앞 1바이트가 'CC'로 대체된다.
▶ 순차적으로 실행하다가 명령어 앞의 바이트가 'CC'로 되어있으면 인터럽트를 발생시킨다.
▶ 이 때 운영체제는 실행에 대한 제어권을 인터럽트 핸들러에 넘긴다.
▶ 인터럽트 핸들러는 인터럽트를 설정할 때 같이 등록한 인터럽트 서브루틴을 호출한다.
▶ 보통 올리디버거나 이뮤니티디버거에서는 F2로 브레이크포인트를 설정할 수 있다.
▶ 우리가 흔히 알고 사용하는 브레이크포인트가 소프트웨어 브레이크포인트이다.
2) 하드웨어 브레이크포인트
[1] 정의
▶ 소프트웨어 브레이크포인트와 달리 명령어가 변경되는 것이 아니다.
▶ 프로세서에서 디버거를 위해 제공하는 특별한 레지스터가 있다.
▶ 이것이 디버거 레지스터(DR0 ~ DR7)이다.
▶ 이 중에서 DR0~DR3가 하드웨어 브레이크포인트에 사용된다.
▶ 디버거 레지스터에 브레이크포인트를 설정할 주소를 입력한다.
▶ 실제로 하드웨어 브레이크포인트를 걸어놓으면 그 주소가 호출되서 사용될 때 브레이크포인트가 걸린다.
3) 시연
▶ 시연은 lenatutorial20으로 진행하려고 한다.
▶ 사전에 확인한 내용은 이 프로그램은 ezip으로 패킹되었다.
[1] 시작
▶ 시작 후 점프해서 보이는 이곳은 함수의 프롤로그로 보인다.
▶ 이 부분을 브레이크포인트로 잡은 이유는 함수의 프롤로그이기 때문이다.
▶ Packing되어있다는 것은 어디선가 메모리 내에 Unpacking할 것이라는 것이 내포되어 있다.
▶ 그렇다면 함수가 시작되었고 Unpacking할 것이고 어디선가 함수가 종료될 것이다.
▶ Unpacking 후 OEP로 점프할 것 같다.
▶ 패커를 잘 모르기 때문에 직접 풀어보면서 OEP를 찾아야 새로 덤프를 생성할 수 있다.
▶ 에필로그에서 다시 스택을 정리할 것이다..
▶ 그렇다면 우리는 스택포인터에 하드웨어 브레이크포인트를 걸어보면 좋을 듯 싶다.
▶ 함수 종료 시점에서 멈출 것이고 jmp문을 살펴보면 OEP로 예상되는 것을 찾을 수 있기 때문이다.
[2] 스택포인터의 위치
▶ 현재 스택포인터의 위치는 0x0019FF80이다.
[3] 이동
▶ 메모리덤프에서 [Ctrl+G]를 누른다.
[4] 이동위치 확인
▶ 스택포인터의 위치를 적고 그 곳으로 이동한다.
[5] 하드웨어 브레이크포인트
▶ 0x19FF80에서 [우클릭 - 브레이크포인트 - 하드웨어]를 선택한다.
[6] 하드웨어 브레이크포인트 설정
▶ 한 바이트를 해도 좋지만 주소이기 때문에 4바이트를 Access할 경우로 선택해도 좋다.
[7] 실행
▶ F9를 누르면 다음 브레이크포인트까지 실행된다.
▶ [JMP EAX]가 보인다.
▶ 이 때 EAX의 내용을 확인해보니 0x4271B0이다.
[8] 이동
▶ [Ctrl+G]를 누르고 EAX에 있는 0x4271B0를 적고 이동한다.
[9] OEP확인
▶ 실제로 여기부분이 OEP로 확인된다.
[10] 덤프생성
▶ OllyDumpEx 플러그인을 설치 후 실행한다.
[11] OEP 작성
▶ EP 새로 작성 후 Dump를 눌러서 생성한다.
'Try Attack > Reverse Engineering[basic]' 카테고리의 다른 글
[codegate_2017] angrybird (0) | 2019.04.08 |
---|---|
[csaw CTF 2015] wyvern (0) | 2019.04.08 |
Packing/Unpacking (0) | 2018.12.19 |
Code Caving (0) | 2018.12.18 |
[crackme5] abex' 5th crackme 풀이 및 복원 (0) | 2018.11.16 |
댓글