인공지능 개발일지

[리버싱] CodeEngn RCE Basic L04 Writeup 본문

보안/리버싱

[리버싱] CodeEngn RCE Basic L04 Writeup

Prcnsi 2021. 12. 29. 15:26
728x90

요즘 들어 미뤄왔던 것들을 하나씩 하고 있다. 11월에는 좀 열심히 했는데 요즘은 좀 풀린 것 같아서 조금 더 분발해야 할 것 같다. 그리고 이번 방학에는 프로젝트보다는 인공지능이랑 알고리즘 공부로 기본기를 좀 쌓아야겠다. 

 

조만간 11월에 한 프로젝트(를 가장한 셀프피드백) 정리 포스트를 올리겠습니다:)

 


1. 문제 분석

4번 문제를 들어가면 3번 문제와 비슷하게 디버거 탐지 "함수명을 물어보는" 문제이다.

ㅍ               

 04.exe 프로그램에는 디버깅을 탐지하는 기능이 있어서 실제로 그냥 실행시켜 보면 아래와 같이 정상이라고 출력되고 Ollydbg 같은 디버깅 툴로 열어 보면 디버깅당함이라고 뜬다.

 

 

 

 

 

 

여기서 문제는 어셈블리 코드 중에서 디버거 프로그램을 탐지하는 함수를 찾고 추가적으로 디버깅 툴로 열어도 정상이라고 뜨게 하는 것이다. 디버거 없이 그냥 프로그램을 실행시키니 CMD 창 같은 게 뜨면서 정상이란 말이 반복적으로 출력된다.

 

이를 통해 알 수 있는 것은 문제 프로그램에 디버거를 탐지하는 기능(함수)이 있고 이것이 있는 이유는 실제 프로그램에서 디버거로 분석당할 때를 방지하여 디버거로 열었을 때 원래 프로그램을 동작시키지 않고(이를 여기서는 디버깅당함으로 표현) 그냥 열었을 때는 원래 프로그램(정상으로 표현)을 보여주는 그런 보안 기능을 리버싱으로 뚫기 위해 이러한 문제를 낸 거 같다. 

 

 

 

그래서 그냥 열었을 땐 위와 같이 정상이란 문구와 함께 아래 프로그램이 잘 동작함을 볼 수 있다. 

그리고 그냥 실행시킬 땐 보이지 않던 Assemble 창이 떴다.

 

 

 

 

이건 언제 뜬 건지 모르겠는데 디버깅이 당했다는 창이 하나 더 떠있다. 왜지? 뭘 건드려서 그런 거지?하는 생각을 하며 디버거로 열어봤다.

 

코드를 보면 가장 먼저 IsDebuggerPresent 함수와 디버깅당함과 정상이라는 문자열이 보인다. 

위 함수는 인자를 2개 받고 두 인자를 비교해서 디버깅을 당하고 있으면 1을 아니면 0을 리턴한다. 디버깅 탐지를 우회하기 위해 EAX0으로 바꾸면 풀리는 문제이다.

 

 

 

 

 

 

2. 문제 풀이

따라서 아래 코드를 보면 mov esi, esp로 IsDebuggerPresent에 값을 입력하고 이를 cmp esi, esp로 비교해서 문자열을 출력한다. (Mov 명령어는 레지스터에 직접 값을 입력할 수 있는 명령어)

 

 

 

 

 

그리고 아래에서 우측 상단을 보면 eax에  1이 있어서 0으로 바꿔주면 된다. 

 

다음으로 아래와 같이 값을 조정해준다.

 

 

그러면 아래와 같이 NOP(0)으로 값들이 채워져서 디버거로 열어도 아니라고 인식할 것이다.

 

 

다시 프로그램을 실행시켜 보면 아래와 같이 디버거로 열어도 정상이라고 출력되는 것을 볼 수 있다.

 

 

 

3. 결론

이를 제출하면 아래와 같이 성공 메시지가 뜬다.

 


 

 

오늘도 읽어주셔서 감사합니다!

728x90