활용강의: 리버싱 이 정도는 알아야지 - 섹션 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로 바꾼다.
- 호출 성공
- DLL 파일이름을 system32 폴더에 있는 파일이름으로 변경한다.
- User32로 이름을 변경한다.
- 호출 성공
3) 코드 수정하기
- 00401021 주소의 EAX 레지스터 값을 0에서 1로 바꾼다.
=> 호출 실패에 대한 리턴 값을 임의로 바꿔서 성공한 것처럼 속임.
- 호출에 실패했을 때, 코드가 동작하도록 조건 점프를 수정한다.
3. 두 번째 문제확인 및 해결
1. Sleep 호출 수정하기
- sleep을 무시하고 바로 코드가 실행되도록 Timeout의 값을 0으로 설정한다.(수정하지 않을 경우 10분동안 기다려야 함.)
- 코드를 실행하면 이상한 문자열 값이 출력된다.
2. 문자열 출력 반복문 수정하기
① 반복문 흐름 파악하기
- 반복문에 문제가 있을 것 같다고 가정한 후 흐름을 파악한다. (문제가 없을 수도 있음.)
- [ESP+ESI+4] 주소에서 1byte 값을 가져온다.
- 여기에 0x2를 더한다.
- 더한 값을 출력한다.
- ESI 값을 1 증가시킨다.
- ESI 값이 8을 초과하지 않으면 반복 동작한다.
② [ESP+ESI+4] 주소에 저장된 값 확인하기
- [ESP+ESI+4] 주소에 “PrintMe” 문자열이 잘 저장되어 있는 것을 확인할 수 있다.
③ 반복문 코드 수정하기
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” 문자열을 변형하는 코드를 수정하거나 삭제한다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2024.03.16] 리버씽씽카 1주차 활동 (0) | 2024.03.16 |
---|---|
[2023.05.20] 씽씽이 활동보고 (0) | 2023.05.26 |
[2023.05.06] 씽씽이 활동보고 (0) | 2023.05.11 |
[2023.04.08] 씽씽이 활동보고 (1) | 2023.04.14 |
[2023.04.01] 씽씽이 활동보고 (0) | 2023.04.06 |