반응형

0. readelf (이건 리눅스 명령어)

ELF구조로 이루어진 파일 정보를 보여줌
윈도우의 PE View나 CFF Explorer와 비슷

-h는 파일 헤더를 나타내게 하는 옵션


1. start명령어

0번 명령어를 통해 확인한 Entry point address (0x401040)와

화살표의 주소와 같다. 

나는 처음 start를 입력했을때 바로 main함수로 가버려서 확인한 ep에 브레이크 포인트를 걸어서 직접 확인했다.

 

화면에서 영역마다 나타내고 있는 것이 무엇이냐면, 

주요 메모리들의 상태를 프로그램이 실행되고 있는 맥락(Context)이라고 부르며

  1. registers: 레지스터의 상태를 보여줍니다.
  2. disasm: rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줍니다.
  3. stack: rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줍니다.
  4. backtrace: 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줍니다. 

 

2. 브레이크 포인트 설정 및 실행

b *main //메인 함수에 브레이크포인트 설정 (F2)
b *0x00001111 //주소에 브레이크포인트 설정 (F2)
c //브레이크 포인트가 걸린 시점부터 실행 (F9)
r //프로그램을 전부 실행하지만 브레이크포인트에 걸림 (F9)
  • b: break
  • c: continue
  • r: run
  • si: step into
  • ni: next instruction
  • i: info
  • k: kill
  • pd: pdisas

 

3. 디스어셈블(Disassemble)과 가독성이 좋게 출력하기

disassemble 함수명 //메인 함수가 리턴될 때 까지를 디스어셈블하여 출력 (이건 GDB명령어)
u, nearpc // 이 두개의 명령어는 디스어셈블된 코드를 가독성 좋게 출력 (이건 pwndbg명령어)

 

 

5. 구문 한줄씩 실행하기와 함수 탈출하기

ni //한줄씩 실행 서브루틴 내부로 들어가지 않음 (F8)
si //한줄씩 실행 서브루틴 내부로 들어감 (F7)

finish //서브루틴 내부로 들어갔다가 원래 실행흐름으로 돌아가기 위해 함수의 끝까지 가는 명령어(CTRL + F9)

 

 

6. 특정 메모리 주소의 값 관찰하기

이것들은 옵션이고,

o(octal)
x(hex)
d(decimal)
u(unsigned decimal)
t(binary)
f(float)
a(address)
i(instruction)
c(char)
s(string) and z(hex, zero padded on the left)
Size letters are b(byte)
h(halfword)
w(word)
g(giant, 8 bytes)
x/10gx $rsp //rsp부터 80바이트를 8바이트씩 hex형식으로 출력
x/5i $rip //rip부터 10줄의 어셈블리 명령어 출력
x/s 0x400000 //특정 주소의 문자열 출력

필요한 옵션을 가져다 쓰면 되겠다.

 

 

7. 메모리 덤프 뜨기

tele //메모리가 참조하고 있는 주소를 재귀적으로 보여줌

 

 

8. 가상 메모리 레이아웃 보기

vmmap //가상 메모리의 레이아웃을 보여줌
//어떤 파일이 매핑된 영역일 경우, 해당 파일의 경로까지 보여줌

 

번외)

python으로 사용자가 입력할 수 없는 값 입력하기

pwndbg> r $(python -c 'print "\xff"*100') //argv1 전달
r $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"') //argv1과 사용자입력 전달
반응형