Reverse engineering
Reverse engineering:
리버스 엔지니어링은 시스템, 소프트웨어, 하드웨어의 안에서 작동하는 것을 분석하고 이해하는 과정이다.
즉, 외부의 동일한 기능을 구현하기 위해 내부를 뜯어 분석하는 행위인 것.
효율적이고 정확한 분석을 위해서는 다양한 지식을 알고 있어야 한다: 커널, 프로세스, 어셈블리어
정보 수집: 문서, 프로그래밍 언어, 라이브러리, 컴파일러 등등
방법에는 2가지 방법이 있다.
- 정적 분석: 디컴파일러를 사용해 실행 바이너리로부터 소스를 역추출하는 방법 등이 있다.
도구를 사용하면 쉬운편
도구: IDA pro, Ghidra, Radate2, 등등
- 동적 분석: 정적 분석만으로는 런타임에 결정되는 컨트롤 플로우를 따라가기 어렵다는 단점이 있다. 그래서 디버거를 물려놓고 프로그램을 실행시켜 어떤 값이 어떤 명령어와 함께 실행되는지 관찰한다.
디버거: WinDBG, GDB 등등
Debugging:디버깅은 프로그램내에서 버그나 에러들을 식별하고 분석하고 해결하는 과정이다. 버그 재생산하기, 버그 분석하기, 근본 원인 식별하기, 버그 고치고 실험하기
GNU Debugger (GDB)실습
GDB는 소프트웨어 개발자들을 위한 강력한 디버깅 도구이다. 명령어 줄 인터페이스를 제공하고 다양한 디버깅 특성들을 지원한다.
특성: breakpoint 설정, 단계별 코드 진행, 변수들 exam, 메모리 모방
소스코드 컴파일(ex: main.c)
$ gcc [flags] -o <output file> <source files>
// example
$ gcc -g -no-pie -o main main.c
' -g '는 "debug option"으로 알려져 있다.
컴파일러는 소스코드에서 추가 정보(줄 번호, 변수명)를 포함시킨다.
gdb를 실행가능하게 작동시킴
$ gdb -q main
gdb는 상호작용하는 쉘을 같고 있어서 하나는 디버깅하는데 줄 수 있다.
프로그램이 작동중이거나 아니거나 식별가능한 정보는 다를 수 있다.
실행 가능한 모든 기능들 리스트
(gdb) info functions
로드된 모든 공유된 라이브러리들 리스트
(gdb) info sharedlibrary
이 명령어는 타겟 프로그램은 실행되어 있어야 한다.
BP 설정
(gdb) b(reak) <function>
(gdb) b(reak) *<addr>
// examples
(gdb) b main
(gdb) b *0x401136
BP: 브레이크 포인트: 중간에서 실행가능하기 위해 프로그램을 멈추는데 사용된다.
모든 BP 리스트
(gdb) i(nfo) b(reakpoints)
BP 비활성화
(gdb) disable [bp number]
// example
(gdb) disable 1
이것을 영구적으로 지우지 않는 한 이것은 지속적으로 BP를 비활성화시킨다.
BP 삭제
(gdb) d(elete) [bp number]
// example
(gdb) delete 1
이것은 영구적으로 내 디버깅 세션에서 BP를 지워준다.
하드웨어 BP
이것은 특정 표현, 변수 또는 메모리 위치에 대한 watchpoint를 설정하는 데 사용된다.
watchpoint은 BP의 종류로 특정된 식의 값이 변경될 때 프로그램의 실행을 일시 중지하는 일종의 중단점이다.
(gdb) watch [expression]
// example
(gdb) watch cnt
(gdb) watch *(int*) 0x7fffffffde88
프로그램 실행
BP가 설정이 되어 있다면, 프로그램은 BP에서 실행을 멈춘다.
(gdb) r(un)
(gdb) r(run) <arg1> <arg2> …
// examples
(gdb) run
(gdb) r -i inputs/ -o outputs/
c
하나는 다음에 있는 BP에 접근할 수 있다.
- 주의: 'run'을 다시 입력 시 아예 처음부터 프로그램이 시작될 수 있다.
(gdb) c(ontinue)
다음 단계(step into = si).
하나는 싱글-스텝 (다음 줄의 코드를 실행) 을 밟을 수 있다.
(gdb) step
(gdb) si
next instruction(다음 진행)
'step'과 비슷한 'next'는 sigle-steps를 명령어로 갖고 있지만 하위 루틴의 각각의 줄을 실행시키지 않는다.
(gdb) next
(gdb) ni
finish: 최근 함수를 끝낸다.
최근 함수가 완료되어 돌아올 때까지 프로그램을 계속 실행하는 데 사용된다.
(gdb) finish
스택 프레임 표기
최근의 스택 프레임에 대한 디테일한 정보를 표시하는데 사용된다.
(gdb) i(nfo) f(frame)
콜 스택 표기
현재 콜 스택 또는 백트랙에 대한 정보를 표시하는 데 사용된다.
(gdb) i(nfo) s(tack) <limit>
(gdb) backtrace
(gdb) bt
// example
(gdb) info stack
(gdb) i s 2
(gdb) backtrace
상징 출력
이거는 식이나 변수 등의 값을 평가하고 표기하는데 사용된다.
(gdb) p(rint)(/x) [expression]
// example
(gdb) p cnt
(gdb) p/x 127 + 128
(gdb) p func
(gdb) p/x *(int*)0x7fffffffde88
메모리 검사
특정 주소 또는 주소 범위에서 메모리 내용을 검사하는 데 사용된다.
(gdb) x/[repeat count][format] [address]
// example
(gdb) x/10gx 0x402004
(gdb) x/s 0x402004
(gdb) x/5i &func
'시스템 > 시스템보안' 카테고리의 다른 글
(1-2) OS (1) | 2024.07.05 |
---|---|
(1-1) OS (0) | 2024.06.24 |
중간(7~8 선택과 집중) (0) | 2024.04.24 |
중간 access control (0) | 2024.04.20 |
중간 password cracking (0) | 2024.04.19 |