카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/30

gdb tui 기반 디버깅

-g 옵션 사용 컴파일

shell> g++ source.cpp -g

tui 접근
shell> gdb a.out --tui

브레이크 포이트 위치 지정
gdb> break main
gdb> b main
gdb> b *main

실행
gdb> run
gdb> n ---> next
     enter -> 한줄씩 이동

지정한 위치로 브레이크 포인터 이동
gdb> b 30 ---> 브레이크 포인트 설정 여기서 30은 tui 줄 번호
gdb> run ---> 30 라인으로 이동
gdb> q ---> 종료

------------
shell> gdb a.out --tui

브레이크 포인트 위치지정
gdb> b main
gdb> s
gdb> run
gdb> s ---> 추적
gdb> q

테스트 바이너리 다운로드.
https://github.com/LiveOverflow/liveoverflow_youtube/blob/master/0x05_simple_crackme_intro_assembler/license_1

실행
gdb "바이너리" --tui

어셈 블리어 형식 변환
set disassembly-flavor intel

메인 함수 디어셈블
disas main

브레이크 포인트 위치 지정
b 30 30번째 라인에다가 걸기
b *main 메인 함수 브레이크 포인트
b *0x0~~~~ 특정 주소에 브레이크 포인트
b "숫자" rip로부터 상대적 위치에 브레이크 포인트

브레이크 포인트 삭제
delete
delete "번호"

실행하기
run "args" 처음부터 실행
continue 멈춘 부분부터 실행
ni -> Next instance 한 출 씩 실행

정보 확인
info reg 레지스터 확인
info reg "레지스터" 특정 레지스터 확인
info break 브레이크 포인트 확인
x/t "메모리 주소" 2진수로 확인하기
x/o "메모리 주소" 8진수로 확인하기
x/d "메모리 주소" 10진수로 확인하기
x/u "메모리 주소" 부호없는 10진수로 확인하기
x/x "메모리 주소" 16진수로 확인하기
x/c "메모리 주소" char로 확인하기
x/f "메모리 주소" 부동소수점으로 확인하기
x/s "메모리 주소" 스트링으로 확인하기

x/bx $rsp 1바이트씩 확인하기
x/hx $rsp 2바이트씩 확인하기
x/dx $rsp 4바이트씩 확인하기
x/gx $rsp 8바이트씩 확인하기

-g 옵션 사용 컴파일

shell> g++ source.cpp -g

tui 접근
shell> gdb a.out --tui

브레이크 포이트 위치 지정
gdb> break main
gdb> b main
gdb> b *main

실행
gdb> run
gdb> n ---> next
     enter -> 한줄씩 이동

지정한 위치로 브레이크 포인터 이동
gdb> b 30 ---> 브레이크 포인트 설정 여기서 30은 tui 줄 번호
gdb> run ---> 30 라인으로 이동
gdb> q ---> 종료

------------
shell> gdb a.out --tui

브레이크 포인트 위치지정
gdb> b main
gdb> s
gdb> run
gdb> s ---> 추적
gdb> q

테스트 바이너리 다운로드.
https://github.com/LiveOverflow/liveoverflow_youtube/blob/master/0x05_simple_crackme_intro_assembler/license_1

실행
gdb "바이너리" --tui

어셈 블리어 형식 변환
set disassembly-flavor intel

메인 함수 디어셈블
disas main

브레이크 포인트 위치 지정
b 30 30번째 라인에다가 걸기
b *main 메인 함수 브레이크 포인트
b *0x0~~~~ 특정 주소에 브레이크 포인트
b "숫자" rip로부터 상대적 위치에 브레이크 포인트

브레이크 포인트 삭제
delete
delete "번호"

실행하기
run "args" 처음부터 실행
continue 멈춘 부분부터 실행
ni -> Next instance 한 출 씩 실행

정보 확인
info reg 레지스터 확인
info reg "레지스터" 특정 레지스터 확인
info break 브레이크 포인트 확인
x/t "메모리 주소" 2진수로 확인하기
x/o "메모리 주소" 8진수로 확인하기
x/d "메모리 주소" 10진수로 확인하기
x/u "메모리 주소" 부호없는 10진수로 확인하기
x/x "메모리 주소" 16진수로 확인하기
x/c "메모리 주소" char로 확인하기
x/f "메모리 주소" 부동소수점으로 확인하기
x/s "메모리 주소" 스트링으로 확인하기

x/bx $rsp 1바이트씩 확인하기
x/hx $rsp 2바이트씩 확인하기
x/dx $rsp 4바이트씩 확인하기
x/gx $rsp 8바이트씩 확인하기

실행 중인 프로세스에 어태치
gdb "filename" "pid"
gdb" attach
gdb" detach

실행 중인 프로세스에 어태치
gdb "filename" "pid"
gdb" attach
gdb" detach

kali 버전 업데이트

shell> apt update && apt -y full-upgrade

shell> cat /etc/apt/sources.list
deb http://http.kali.org/kali kali-rolling main non-free contrib

shell> grep VERSION /etc/os-release
VERSION="2018.3"
VERSION_ID="2018.3"

shell> reboot

일반 저장소
deb http://http.kali.org/kali kali-rolling main non-free contrib

소스 저장소
deb-src http://http.kali.org/kali kali-rolling main non-free contrib

개발자 저장소
사용자들이 패키지를 만들어 제공, 하지만 나중에 사이트가 없어지는 문제 발생.

일반 저장소만 나두고 업데이트 한다.
deb http://http.kali.org/kali kali-rolling main non-free contrib

전체 설치 
shell> sudo apt-get install kali-linux-full

나중 테스트 해 볼 내용> 
1. 서버 연동 네트워 부팅 
2. 시스템 점검 
2.1 점검 목록 나열 테스트 

Visual Studio 디버깅 단축키

윈도우에서 사용하는 디버깅 창 및 단축키,
비주얼 스튜디오 버전마다 단축키 차이가 있음.

자동/조사식/메모리 창
자동창 생성: 디버그 -> 창 -> 자동
단축키 : ctrl + alt + v, a

조사식창 생성: 디버그 -> 창 -> 조사식 -> 조사식 1~4
단축키 : ctrl + alt + w, 1~4
Shift+F9: 다른 창을 띄워서 변수의 값이 얼마인지 계산할 수있고, 그 자리에서 조사식을 추가 할 수도 있다.

메모리창 생성: 디버그 -> 메모리 -> 메모리 1~4
단축키 : ctrl + alt + m, 1~4
기본 메모리 창 : alt + 6

ctrl + shift + b : 솔루션 빌드
F7 : 프로젝트 빌드
ctrl + F5 : 프로젝트 빌드 후 실행

F9 : 브레이크 포인트 설정 및 해제

전체 브레이크 포인트 해제 : 디버그 -> 모든 중단점 해제
단축키 : Ctrl + Shift + F9

F5 : 디버깅 연결 프로그램과 시작. 브레이크 포인터가 있다면 그 위치까지 실행
Shift + F5 : 디버깅 없이 실행

F10: 디버깅 모드에서 한줄씩 코드를 진행하되, 다른 함수를 호출하게 되는 경우에 그 프로시저를 모두 실행하고 원래 코드로 돌아와서 한줄을 실행하는 기능
Ctrl + F10 : 커서까지 실행, 디버깅 모드에서 커서가 위치한 줄을 만날때 까지 실행하는 기능
Shift + F10 : 프로시저 나가기

F11: 한줄씩 실행
     디버깅 모드일 때, 함수 추적을 한다.
Shift + F11: 프로시저 나가기, 디버깅 모드에서 현재 현재 프로시저의 나머지를 모두 실행하고 나가는 기능

디버깅 공식
1) 중단점을 설정한다.
2) 디버깅 시작
3) F11 을 누르며 한단계씩 코드 실행 or  F10 으로 프로시저 단위 실행
4) 조사식을 추가하여 변수의 변화를 살펴본다.

함수 추적시.
stdio.h, iostream 라이브러리 호출 부분으로 진입시.
Shift + F10 : 프로시저 나가기