리버싱

1부 2장 Hello World! 리버싱(3)

오브의 별 2022. 4. 23. 01:30
반응형

안녕하세요, 오브입니다.

오늘은 디버거를 이용해서 프록램의 내용을 간단히 패치하는 방법에 대해 알아보겠습니다. 

https://staraube.tistory.com/46

 

1부 2장 Hello World! 리버싱(1)

안녕하세요, 오브입니다. 오늘은 HelloWorld.exe 실행 파일을 디버깅하여 어셈블리 언어로 변환된 main() 함수를 찾아보겠습니다. Hello World! 리버싱 2.2.1. 디버깅 목표 main() 함수 찾기 2.2.2. 디버깅 시작

staraube.tistory.com

https://staraube.tistory.com/47

 

1부 2장 Hello World! 리버싱(2)

안녕하세요, 오브입니다. 오늘은 디버거 명령어를 간단하게 알아본 다음 베이스캠프를 설치하는 4가지 방법에 대해 살펴보겠습니다. https://staraube.tistory.com/46 1부 2장 Hello World! 리버싱(1) 안녕하

staraube.tistory.com

 

Hello World! 리버싱

2.5.1. 패치

  • 기존 응용 프로그램의 버그 수정 및 새로운 기능 추가 가능
  • 실습 목표: 메시지 박스의 “HelloWorld!” 문자열을 다른 문자열로 변경
  • 앞에서 MessageBoxW 호출 부분과 문자열 주소를 찾음
  • 방법
    • 디버깅 재실행[Ctrl+F2]
    • main 함수 시작 주소인 401000까지 실행
    • main() 함수에 BP 설정[F2], 실행[F9]

 

2.5.2 문자열을 패치하는 두 가지 방법

1. 문자열 버퍼를 직접 수정

  • 덤프 창에서 [Ctrl+G]으로 4092A0 주소로 가기
  • 4092A0 주소를 마우스로 드래그한 후 [Ctrl+E]하여 Edit 다이얼로그 띄우기
    • “HelloWorld!” 문자열이 차지하는 영역은 4092A0~4092B9.

  • Edit 다이얼로그 ‘유니코드’ 항목에 “Hello Reversing” 문자열 입력
    • 유니코드 문자열은 2바이트 크기의 NULL로 끝나야 함
    • 일반적으로 문자열 뒤쪽에 어떤 의미 있는 데이터가 존재할 수 있기 때문에 원본 문자열 길이를 넘는 문자열로 덮어쓰는건 위험
  • main() 함수 401000를 다시 보면 명령어는 그대로지만 MessageBoxW() 함수에 전달되는 파라미터의 내용은 변경되어 있음

  • [F9]를 눌러 실행시키면 메시지 박스에 패치된 문자열이 나타남
    • 문자열 버퍼 내용을 직접 수정하는 방법은 간단하지만 기존 문자열 버퍼 크기 이상의 문자를 입력하기 어렵다는 제약이 있음
    • 디버거 종료하면 패치했던 내용은 사라짐

=⇒ 파일로 생성

  • dump 창에서 변경된 문자열을 선택하여 마우스 우측 클릭
  • Copy to executable file 클릭
  • Save file 클릭하여 “HelloReversing.exe”로 저장

 

2. 다른 메모리 영역에 새로운 문자열을 생성하여 전달

  • 디버거 재실행[Ctrl+F2]한 후 전진 캠프(main() 함수- 401000)로 감
    • 401007 주소의 PUSH 004092A0 명령은 4092A0 주소의 문자열을 파라미터로 전달함
    • 적당한 메모리 영역에 패치하고자 하는 긴 문자열 적고 MessageBoxW() 함수에게 버퍼 주소를 파라미터로 넘겨줌
  • 방법1에서 수정한 문자열인 4092A0에서 밑으로 내려 NULL padding 영역으로 감(Hex dump 창)
  • 적당한 위치 409F50에 [Ctrl+E] 눌러 패치 문자열 “Hello Reversing World!” 쓰기

  • 코드 창에서 401007 주소에 커서를 놓고 Assemble 명령 [Space] 누름
  • Assemble 창 그림에 ‘PUSH 409F50’ 입력

  • 실행 [F9]하면 메시지 창 확인 가능

반응형