카테고리 없음

55. 디버깅 실습2-Self Creation

yenas0 2025. 3. 6. 17:29
반응형

Self-Creation이란?

프로세스가 자기 자신을 자식 프로세스로 실행시키는 것

부모로 실행될 때랑 자식으로 실행될 때의 동작이 다르면 의미가 있음(하나의 실행 파일에 두 가지실행 경로가 존재하도록 꾸미는 것) 

 

동작원리

간단하게는 부모 프로세스가 자식 프로세스를 서스펜드 모드로 생성하고 실행 주소를 조작해서 원하는 코드 실행을 유도하는 방식

1. 자식 프로세스 생성(suspend 모드)

- 자식 프로세스는 suspend 상태로 생성되며 import DLL들은 로딩되지만 메일 스레드는 멈춰서 EP코드가 실행이 안됨

2. EIP 변경

- 부모 프로세스는 디버깅 API를 활용해 자식 프로세스의 메인 스레트 context를 가져와 컨텍스트의 EIP를 원하는 코드 주소로 변경한다.

3. 메인 스레드 재개(resume Main thread)

- 변경된 EIP를 적용한 후, 멈춰있었던 자식 프로세스의 메인 스레드를 다시 실행함

- 이렇게 하면 자식 프로세스는 부모 프로세스가 지정한 코드부터 실행하게 된다.

 

실습!!!

고려해야될거는 디버깅 중에 생로 생기는 자식 프로세스를 어떻게 시작 지점부터 디버깅하냐는 것.. 그러려먼 먼저 부모 프로세스를 디버깅해서 자식 프로세스의 EP가 어느 주소로 변경되는 지를 알아야한다. 무한루프 설치해도 되고 JIT(Just-In-Time)방법 써도댐

 

*참고: 자식 프로세스 생길때 디버거에 어태치 하는건 안된다.(디버거가 suspend 프로세스 attach를 못함..)

 

아무튼 JIT 디버깅으로 실습..

 

JIT란?

실행 중인 프로세스에 예외가 발생했을 때 운영체제에서 자동으로 지정된 디버거를 실행해 해당 프로세스에 attach해주는 것

 

먼저 JIT 디버거를 설정해야된당

올리디버거를 JIT로 설정하기 위해서 위에처럼 해준다.

아래처럼 뜨는데 맨위에 메이크 어쩌구 누르면 됨.

 

 

그러고 나서 레지스트리 편집기에서 확인도 해볼 수 있다.

 

 

 

 

실습은 아래 파일로 진행했다

https://github.com/reversecore/book/blob/master/%EC%8B%A4%EC%8A%B5%EC%98%88%EC%A0%9C/08_%EB%94%94%EB%B2%84%EA%B9%85_%EC%8B%A4%EC%8A%B5/55_%EB%94%94%EB%B2%84%EA%B9%85%EC%8B%A4%EC%8A%B5_2_Self_Creation/bin/DebugMe2.exe

 

book/실습예제/08_디버깅_실습/55_디버깅실습_2_Self_Creation/bin/DebugMe2.exe at master · reversecore/book

리버싱 핵심원리 - 소스 코드 및 실습 예제. Contribute to reversecore/book development by creating an account on GitHub.

github.com

 

 

먼저 부모 프로세스를 디버깅해야되니 main()함수를 찾아오면 된다. 

 

그리고 그 아래 따라가다보면 CreateProcess()API 호출 코드도 보이게됨 이걸 실행하면 SUSPEND 모드의 자식이 생기는 것

 

 

그러고나서 줄줄 내리다보면 자식 프로세스의 메인 스레드 컨텍스트 구조체를 구해서 CONTEXT.Eip값을 ChildProc() 주소로 변경하는 코드임 (GetTHreadContext()/SetThreadContext() API 호출코드 부분..)

이렇게 확인하면 401000이 ChildProc()의 시작 주소인거를 확인할 수 있당

 

 

 

이제 자식 프로세스를 디버깅 해야됨 Stud_PE 켜서 위에서 찾은 401000주소를 넣으면 파일 오프셋으로 변환된 400값을 구할 수 있다.

 

오프셋을 알았으니 HxD에서 여기 바이트를 수정해준다.

근데 여기서 또!!! 수정이 안됐음;; 근데 실습파일에 수정본도 주길래 그걸로 했다.

이렇게 CC코드로 고치면 EXCEPTION_BREAKPOINT 예외가 발생한다. 그래서 파일 실행시키면 작동이 중지되었다는 오류가 뜨게됨 (근데 난 또 여기서 안떠서 실패함..)

 

 

아무튼 JIT로 설정된 디버거로 오류창에서 연결해서 들어가면 예외가 발생한 코드가 이렇게 아래처럼 아까 hxd에서 수정된부분에서 멈추게되고

 

그걸 다시 원본코드에 있던대로 6A로 고치면된다.

반응형