[모각코]해킹맛보기(리버스 엔지니어링 3.7 ~ 끝)
08-14
패치
Options > Debugging options Events 탭에서 Entry point of main module을 선택하면
처음으로 프로그램을 정지시킬 부분을 설정하는 것
Entry Point는 운영체제가 프로그램을 실행시킬 때 가장 먼저 실행되는 프로그램의
코드 위치로 이해하면 됨
원하는 코드 위치 찾기
-
어셈블리어 코드를 한 줄씩 실행
어셈블리어 코드를 한 줄씩 실행시켜 출력 상태를 보면서 찾는 것
Step Into(F7), Step Over(F8)를 이용해 출력 상태를 확인 -
문자열 검색
코드에서 우클릭을 통해 Search for > All referenced text strings 선택
-
함수 검색
코드에서 우클릭을 통해 Search for > All intermodular calls 선택
메모리 패치
덤프 영역에서 Go to > Expression (Ctrl + G)를 통해 Hex를 클릭하면
8바이트에서 16바이트로 바뀌어 출력됨
원하는 문자열로 수정하려면 문자열을 드래그한 후 마우스 우클릭 Bianry > Edit 을 통해 수정 C는 항상 문자열이 널(\x00)로 끝나기 때문에 나머지 부분은 널로 채워야함
코드 패치
덤프 영역에 문자열을 입력하고, 코드 패치
마우스 우 클릭 Bianry > Edit 메뉴 선택 (Ctrl + E), 어셈블리 코드 더블 클릭
코드 패치 명령어 입력창에서 Fill with NOP’s 체크박스가 존재하는데
NOP는 아무것도 하지 않는다는 명령어로 체크박스를 표시하면 원할한 동작을 위해
불필요한 부분을 NOP로 채움
파일 저장
문자열을 드래그 한 후 마우스 우클릭 Copy to executable file 메뉴 클릭
File 창에서 Save file을 통해 저장
비밀번호
디버깅에서 브레이크 포인트는 특정 값을 살펴보거나 수정하기 위해 임의의 지점에서
프로그램을 멈추는 기능 제공
올리디버거에서 16진수로 된 기계어 코드를 더블 클릭하거나 해당 명령어에 커서를 놓고 F2를
누르면 소프트웨어 브레이크 포인트가 설정됨
소프트웨어 브레이크 포인트는 무한히 설정할 수 있지만, 속도가 느리고 명령어 실행에 대해서만
브레이크 포인트를 설정할 수 있다는 단점 존재
하드웨어 브레이크 포인트는 속도가 빠르고, 실행뿐만 아니라 메모리 읽기/쓰기에 대해서도
브레이크 포인트 설정이 가능
단점으로 하드웨어로 구현되어 4개의 주소에 대해서만 브레이크 포인트 설정이 가능함
이를 통해 비밀번호를 우회할 수 있음
비밀번호 우회
- 제로 플래그 수정
- 점프 명령어 수정
- NOP로 명령어 수정
비밀번호 분석
비밀번호를 검사하는 함수의 주소를 찾아 제로 플래그를 설정하여
브레이크 포인트를 설정하고 비밀번호와 입력한 값을 비교
시리얼
시리얼 프로그램에 비밀번호 분석과 같은 방식을 통해 시리얼 검사 함수를 찾아
브레이크 포인트를 설정하고 실행시키면 함수 인자로 입력값을 입력하여 리턴값을
설정하는 부분을 찾아 제로 플래그를 재설정
네트워크 통신
OTP를 입력했을 시 반환되는 문자열로는 루틴을 찾을 수 없어
서버와 클라이언트라는 특징을 이용해 함수 검색을 통해 프로그램 분석
서버와 클라이언트는 소켓을 이용해 서로 통신하고 이는 recv()함수를 통해 수신하기 때문에
recv()함수에 브레이크 포인트를 걸어 분석을 진행함
출처
- 해킹 맛보기