본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2023.05.13] 씽씽이 활동보고

활용강의: 리버싱 이 정도는 알아야지 - 섹션 4

 

 

1. 도전 과제

- 도전문제

: Challenge 02.exe“PrintMe"를 출력하게 만들어보세요.

 

 

2. 첫 번째 문제확인 및 해결

 

1. main() 함수 찾기

- 메인호출을 찾는다.

- 메인호출 안으로 들어간다. (F7)

 

 

2. main() 함수 분석하기

 

- LoadLibrary를 호출한다.

- EAX 레지스터에 리턴값이 저장된다.

- 리턴값을 확인한다.

- 조건점프를 한다.

 

 

3. LoadLibrary 정의

 

4. 첫 번째 문제 확인

- Challenge2의 경우 라이브러리 이름을 입력하는 방식을 사용했다.
- “LoadMe.dll” 파일은 존재하지 않기 때문에 호출에 실패하는 것이다.

 

 

5. 문제 해결 방법


1) DLL 파일 만들기

 

- 시스템 파일을 복사해 이름을 변경하는 방식으로 실습을 진행한다.

- system32 폴더에서 시스템 라이브러리를 바탕화면에 복사한다.

 

- 파일 이름을 LoadMe.dll로 바꾼다.

 

- 호출 성공

 
2) 라이브러리 이름 바꾸기
 

- DLL 파일이름을 system32 폴더에 있는 파일이름으로 변경한다.
- User32로 이름을 변경한다.

- 호출 성공

 

3) 코드 수정하기

- 00401021 주소의 EAX 레지스터 값을 0에서 1로 바꾼다.

=> 호출 실패에 대한 리턴 값을 임의로 바꿔서 성공한 것처럼 속임.

 

- 호출에 실패했을 때, 코드가 동작하도록 조건 점프를 수정한다.

- 00401023 주소의 [JNZ SHORT Challeng.00401029]를 [JZ SHORT Challeng.00401029]으로 수정한다.

 

3. 두 번째 문제확인 및 해결

 

1. Sleep 호출 수정하기

- 0040102F 주소에서 Sleep을 호출하는 것을 확인할 수 있다.  
 

- sleep을 무시하고 바로 코드가 실행되도록 Timeout의 값을 0으로 설정한다.(수정하지 않을 경우 10분동안 기다려야 함.)

 

- 코드를 실행하면 이상한 문자열 값이 출력된다.

 

2. 문자열 출력 반복문 수정하기

반복문 흐름 파악하기

 

- 반복문에 문제가 있을 것 같다고 가정한 후 흐름을 파악한다. (문제가 없을 수도 있음.)

- [ESP+ESI+4] 주소에서 1byte 값을 가져온다.

- 여기에 0x2를 더한다.

- 더한 값을 출력한다.

- ESI 값을 1 증가시킨다.

- ESI 값이 8을 초과하지 않으면 반복 동작한다.

 

[ESP+ESI+4] 주소에 저장된 값 확인하기

 

- [ESP+ESI+4] 주소에 “PrintMe” 문자열이 잘 저장되어 있는 것을 확인할 수 있다.

 

반복문 코드 수정하기

 

- 반복문을 확인하면 바로 출력하지 않고 원래 문자열에 0x2의 값을 더해 문자열을 출력하고 있다는 것을 알 수 있다.
  (ADD DL, 2)
- 이 코드를 없애거나 수정하면 될 것 같다.
 
 

- 0x2가 아닌 0으로 값을 변경한다.

 

 
3. 출력 완료

 
 
4. 전체 흐름 확인하기
 

 

1. LoadME.dll을 존재하는 DLL 이름으로 변경한다
2. “PrintMe” 문자열을 변형하는 코드를 수정하거나 삭제한다.

 

 

LoadMe.dll을 실행한다. 이때, 파일 실행에 성공하면 Sleep을 호출하고, 실패하면 프로그램을 종료한다.

Sleep() 함수를 호출해 10분 동안 프로그램의 실행을 멈춘다.

“PrintMe” 문자열을 출력한다.

프로그램을 종료한다.

 

2. Challenge 02.exe 문제점

LoadMe.dll 파일이 존재하지 않았다.

“PirntMe” 문자열 값에 0x2의 값을 더해 다른 문자열이 출력되었다.

 

3. Challenge 02.exe 문제 해결

LoadMe.dll을 생성하거나, 기존에 존재하는 파일이름으로 변경한다.

“PrintMe” 문자열을 변형하는 코드를 수정하거나 삭제한다.