[Rev] 5. Debugging

KBC·2024년 8월 30일

리버싱

목록 보기
8/11

Debugging

실행파일의 어셈블리를 원하는 단계까지 실행시키며 메모리의 변화를 관찰

정적분석

바이너리를 실행하지 않고 분석(disassemble, IDA분석 등)

동적분석

바이너리를 실행하며 동적으로 변화를 관찰(debugging, emulating)

어떤 분석법이 더 좋나요?

둘 다 해야한다. 두 분석론을 적절히 사용해야 한다.

GDB plugin

GDB 명령어

  • file {filename} : 디버깅 할 실행파일 선택
  • disas {function name} (==disassemble) : 함수 디스어셈블
  • start : 실행파일의 엔트리포인트부터 디버깅 시작
  • r(run) : 처음부터 breakpoint까지 실행
  • c(continue) : 현재부터 다음 breakpoint까지 실행
  • s(step) : 한 줄 실행, 서브루틴을 호출할 경우 함수 내부로 진입
  • n(next) : 한 줄 실행, 서브루틴을 호출할 경우 내부로 진입하지 않고 실행
  • finish : 현재 함수를 마지막까지 실행
  • return : 현재 상황에서 강제 return
  • jump * {addres} : 해당 주소로 강제 분기
  • set{type}[address] = {value} : 특정 주소의 값을 변경(레지스터도 가능)
  • b : 현재 위치에 브레이크포인트 설정
  • b {function name} : 함수 시작부분에 bp 설정
  • b {address} : 특정 주소에 bp설정
  • d {bp num} (delete) : num번째 bp 삭제
  • info locals : 현재 실행중인 함수의 지역변수 출력
  • info variables : 전역변수 모두 출력
  • info registers : 레지스터 값 모두 출력
  • info proc map : 메모리 매핑값 출력
  • p(print) {변수명/$레지스터/*주소} : 값 출력
  • display $변수명 : 실행할 때 마다 변수 값 출력

메모리 출력 방법

  • x/{범위}{출력 형식}{단위} {주소}
    출력 형식 : d(10진수), x(16진수), s(string) 등
    단위 : b(1byte), h(2byte), g(8byte) 등 기본 4byte
profile
AI, Security

0개의 댓글