- StolenByte란?
말 그대로 훔친 바이트라는 뜻으로,
패킹된 프로그램에서 코드의 일부를 훔치는(숨기는) 것이다.
- StolenByte를 적용하는 이유
Anti-Reverse Engineering의 일환이다.
패킹된 파일을 언패킹할때 OEP(original entry point)를 찾아서 덤프해야 하는데,
만약 StolenByte를 적용하면 OEP 이전에 일부 코드가 들어있음
-> OEP 찾아서 언패킹해도 프로그램이 정상실행되지 않는다.
=> 언패킹 방해할 수 있음
- StolenByte 찾기
프로그램을 디버거에서 분석했을 때 위와 같이 popad 직후에 push되는 값들이 있다면 이것을 StolenByte로 추정할 수 있다.
상자 안의 값들이 StolenByte가 맞는지 확인하기 위해선 저 값들을 원래 위치에 넣어주고 프로그램이 정상 작동하는지 보면 된다. (아래 과정)
- StolenByte 적용 해제 방법(확인 방법)
예제로 사용할 프로그램은 CodeEngn Basic RCE L9의 문제파일이다.
이 프로그램은 upx로 패킹되었으므로 upx.exe로 언패킹한다. 언패킹한 파일을 실행하면, StolenByte로 인해 오류가 발생한다.
언패킹한 파일을 디버거로 열어보면 MessageBox함수를 호출하기 전에 인자값이 들어가야 하는데 nop으로 채워져 있는 것을 볼 수 있다. 아마 이곳이 도난당한 바이트들이 원래 있던 자리일 것이다.
immunity debugger는 더블클릭으로 어셈블리 명령을 수정할 수 있다. 맨 위 nop을 클릭하고 앞에서부터 찾은 StolenByte를 입력하면 된다.
명령어 수정이 끝나면 어셈블리 코드 창에서 우클릭 > copy to executable > all modifications > copy all 선택,
새로운 프로그램 창이 뜨면 우클릭 > save file > 파일 이름 입력 후 저장
StolenByte를 넣어서 패치 한 파일을 실행하니 언패킹 직후와 다르게 정상 실행 된다.
사실 StolenByte라는 개념은 학교 리버싱 수업에서도 배운 적이 없고, 검색해봐도 많은 정보가 나오지 않아 생소한 개념이었지만 어렵지 않으므로 숙지해놓으면 좋을 것이라고 생각한다.
'해킹 공부 > 리버싱' 카테고리의 다른 글
CodeEngn_Basic RCE L9 (StolenByte) (1) | 2022.11.25 |
---|---|
CodeEngn_Basic RCE L16 (CMP, 레지스터값, stack) (0) | 2022.11.24 |
CodeEngn_Basic RCE L15 (CMP, 레지스터값, hex dump) (0) | 2022.11.17 |
CodeEngn_Basic RCE L14 (strings, CMP, EAX/ESI값) (0) | 2022.11.15 |
CodeEngn_Basic RCE L13 (C# 디컴파일) (0) | 2022.11.10 |