gdb 사용법 익히기
gdb는 리눅스의 대표적인 디버거중 하나!
ELF
- 리눅스 실행 파일 형식
- 크게 헤더와 여러 형식으로 이루어짐
--> ELF 의 헤더에 진입점(EP) 필드 존재 (OS는 ELF를 실행할 때 EP부터 프로그램 실행)
//해당 명령어를 통해 진입점 확인 가능
//entry point address
readelf -h debugee(파일명)

entry point address : 0x1060
gdb에서 start 명령어를 입력하면 진입점 주소를 rip가 가리키고 있는 것을 볼 수 있다.
gdb <실행파일>
(gdb) start
<context>
1. registers : 레지스터의 상태를 보여줌
2. disasm : rip부터 여러줄에 걸쳐 디스어셈블(기계어 -> 어셈블리)된 결과를 보여줌
3. stack : rsp부터 여러줄에 걸쳐 스택의 값들을 보여줌
4. backtrace : 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줌
break & continue
break : 특정 주소에 중단점 설정
continue : 중단된 프로그램을 계속 실행시킴
b *main
+) pwndbg를 사용한다면 u 또는 nearpc 명령어를 통해 깔끔하게 출력 가능
[GDB 명령어 정리]
disas 함수명 : 해당 함수의 어셈블리어를 보여준다. ex) disas main
b *함수명+상수 or b *메모리주소 .. : 해당 영역에 breakpoint
n(next) : 다음 코드 진행
c(continue) : 중단점 올때까지 멈추지않고 진행
ni(next instruction): 어셈블리어 한줄 실행(함수 안으로 x)
si(step into): 어셈블리어 한줄 실행(함수 안으로)
finish : si로 함수안에 들어갔지만 그만 함수를 나오고 싶을 때 함수의 끝으로 이동시켜줌
p $레지스터명 : 값을 프린트함
p/[출력형식] 레지스터or변수 : 계산 결과 확인 가능
x/d 주소 or $레지스터 : 주소 or 레지스터 값을 정수로 보여줌
x/s 주소 or $레지스터 : String으로 보여줌
x/gx 주소 or $레지스터 : 8byte 만큼 보여줌
x/wx 주소 or $레지스터 : 4byte만큼 보여줌
x/10i : 예를 들어 10i 인 경우 rip부터 10줄의 명령어를 어셈블리로 보겠다.
jump 함수 or 행 or 메모리 : 강제 점프
info r : 레지스터 보기(전체)
info r $레지스터 : 특정 레지스터 보기
tele(telescope): 강력한 메모리 덤프 기능 , 특정 주소의 메모리 값 뿐만 아니라 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여준다.
vmmap : 가상 메모리의 레이아웃을 보여준다.
** 입력값이 필요할 때 키보드를 통해 입력 불가능한 값인 경우
ex) 파이썬을 이용해 인자 2개 입력 예시
r $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"')
파이썬 입력이 안먹어서 구글링 결과 해결😭
https://stackoverflow.com/questions/15236832/how-do-i-reinstall-a-directory-in-usr-bin-python
[출처]
dreamhack systemhacking
ARGOS 시스템해킹 자료