악코분을 하다보면 가끔 CreatRemoteThread()를 호출하여 타겟 프로세스에 스레드로 동작시키게 한다. 그래서 스레드가 동작하는 과정을 x64dbg를 통해 디버깅하는 방법에 대해서 간략하게 소개하려고 한다.
먼저, CreatRemoteThead()와 같이 타겟 프로세스에서 Thread를 동작하게 해주는 프로그램을 동작시킨다.
그리고 x64dbg를 하나 켜주고 [Alt + a]를 눌러서 Attach할 항목을 선택한다. 여기서 나는 타겟 프로세스가 CFF Explorer(pid : 37800)이므로 이거를 선택한다. 참고로 저기 항목에서 안나오는 경우가 있다. 그럴 땐 밑에 [창 찾기]버튼을 눌러서 프로세스 이름을 적어준다.
그리고 F9를 눌러 실행시켜준다.
그러면 다음과 같이
왼쪽에 타겟 프로세스인 CFF Explorer.exe와 오른쪽에 호출 프로세스인 inject.x64.exe 이렇게 2개의 창이 있으며 아직 CreateRemoteThread()를 호출하기 직전인 상태이다.
그리고 호출 프로세스에서 오른쪽 상단에 [설정]에 [스레드 진입점]을 체크해준다. 타겟 프로세스를 디버깅하는 x64dbg도 똑같이 설정해주자
마지막으로 호출 프로세스에서 F9를 눌러서 실행시켜주면 왼쪽에 있는 타겟 프로세스를 디버깅을 할 수 있게 된다.
근데 내가 시행착오를 겪었던 것은 reflective dll injection을 진행하면서 호출 프로세스를 디버깅하는 x64dbg에서 F9를 눌렀는데 타겟 프로세스를 디버깅하는 x64dbg에서 내가 원하는 함수부터 진행하고 싶은데 한참 F8을 누르다가 갑자기 스레드 종료되버리고 그랬다.;;
이럴 땐 나는 내가 디버깅하고 싶은 함수인 ReflectiveLoader()의 코드가 어디에 저장되는지 호출 프로세스에서 찾아 타겟 프로세스를 덤프하고 bp를 걸어서 F9를 누르면 해당 코드로 이동하게 된다.
먼저, 할당된 영역에 dll값이 써져있으니깐 메모리 맵에서 덤프 뜨고 → 0x21e0000
덤프 뜬 곳에 값이 올바르게 있는지 확인하고
아이다 같은 정적 분석 도구를 이용해서 해당 함수의 offset을 통해 그곳으로 마우스를 위치시킨 다음에 우클릭 눌러서 디스어셈블리 눌러준다.
아이다를 통해 확인한 해당 함수의 어셈코드와 디스어셈블리로 확인한 결과 내가 원하는 함수의 시작주소를 찾은 것 같다. 그럼 바로 F2를 눌러 bp를 건다.
마지막으로 F9를 눌러서 실행시켜주면 tada~ 내가 원하는 함수로 이동된다. 여기서부터 디버깅 ㄱㄱ
Uploaded by Notion2Tistory v1.1.0