[드림핵] pwndbg 실습

ShinboTinBBO·2025년 1월 22일

systemhacking

목록 보기
2/4

hackerschool의 FTZ의 레벨별 문제들을 풀어보려고 했으나 level2부터 막혔다.
사람들은 hackerschool에서 공부하면 된다고 하는데 현재로서는 adobe flash가 없어지면서 접근이 어려운거 같다.
그래서 드림핵에서 시스템해킹 로드맵을 공부하고 있다.

pwndbg 사용을 배우고 있어서 이를 정리해보았다.

// Name: debugee.c
// Compile: gcc -o debugee debugee.c -no-pie

#include <stdio.h>
int main(void) {
  int sum = 0;
  int val1 = 1;
  int val2 = 2;

  sum = val1 + val2;

  printf("1 + 2 = %d\n", sum);

  return 0;
}

debugee.c파일을 가상머신을 통해서 linux VM에 생성한다.


컴파일을 하면 바로 elf 파일이 생성된다.

elf파일에 대한 간단한 정보를 readelf 명령문을 통해서 확인할 수 있다.

readelf -h debugee

ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x401050
  Start of program headers:          64 (bytes into file)
  Start of section headers:          13912 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         13
  Size of section headers:           64 (bytes)
  Number of section headers:         31
  Section header string table index: 30

이를 통해서 EP가0x401050임을 알 수 있다.

아래는 pwndbg에서 entry 명령어를 입력한 결과다.

Temporary breakpoint 1 at 0x401050
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Temporary breakpoint 1, 0x0000000000401050 in _start ()
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
─────────────[ REGISTERS / show-flags off / show-compact-regs off ]─────────────
 RAX  0x1c
 RBX  0
 RCX  0x7fffffffdd88 —▸ 0x7fffffffe168 ◂— 'SHELL=/bin/bash'
 RDX  0x7ffff7fc9040 (_dl_fini) ◂— endbr64 
 RDI  0x7ffff7ffe2e0 ◂— 0
 RSI  0x7ffff7ffe888 ◂— 0
 R8   0xff
 R9   0xf
 R10  0x7ffff7fc3860 ◂— 0xd0012000000c1
 R11  0x206
 R12  0x401050 (_start) ◂— endbr64 
 R13  0x7fffffffdd70 ◂— 1
 R14  0
 R15  0
 RBP  0
 RSP  0x7fffffffdd70 ◂— 1
 RIP  0x401050 (_start) ◂— endbr64 
──────────────────────[ DISASM / x86-64 / set emulate on ]──────────────────────
 ► 0x401050 <_start>       endbr64 
   0x401054 <_start+4>     xor    ebp, ebp                    EBP => 0
   0x401056 <_start+6>     mov    r9, rdx                     R9 => 0x7ffff7fc9040 (_dl_fini) ◂— endbr64 
   0x401059 <_start+9>     pop    rsi                         RSI => 1
   0x40105a <_start+10>    mov    rdx, rsp                    RDX => 0x7fffffffdd78 —▸ 0x7fffffffe13f ◂— '/home/shinbo/Desktop/dh/practice/debugee'
   0x40105d <_start+13>    and    rsp, 0xfffffffffffffff0     RSP => 0x7fffffffdd70 (0x7fffffffdd78 & -0x10)
   0x401061 <_start+17>    push   rax
   0x401062 <_start+18>    push   rsp
   0x401063 <_start+19>    xor    r8d, r8d                    R8D => 0
   0x401066 <_start+22>    xor    ecx, ecx                    ECX => 0
   0x401068 <_start+24>    mov    rdi, main                   RDI => 0x401136 (main) ◂— endbr64 
───────────────────────────────────[ STACK ]────────────────────────────────────
00:0000│ r13 rsp 0x7fffffffdd70 ◂— 1
01:0008│         0x7fffffffdd78 —▸ 0x7fffffffe13f ◂— '/home/shinbo/Desktop/dh/practice/debugee'
02:0010│         0x7fffffffdd80 ◂— 0
03:0018│ rcx     0x7fffffffdd88 —▸ 0x7fffffffe168 ◂— 'SHELL=/bin/bash'
04:0020│         0x7fffffffdd90 —▸ 0x7fffffffe178 ◂— 'SESSION_MANAGER=local/shinbo-VirtualBox:@/tmp/.ICE-unix/2744,unix/shinbo-VirtualBox:/tmp/.ICE-unix/2744'
05:0028│         0x7fffffffdd98 —▸ 0x7fffffffe1e0 ◂— 'QT_ACCESSIBILITY=1'
06:0030│         0x7fffffffdda0 —▸ 0x7fffffffe1f3 ◂— 'COLORTERM=truecolor'
07:0038│         0x7fffffffdda8 —▸ 0x7fffffffe207 ◂— 'XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg'
─────────────────────────────────[ BACKTRACE ]──────────────────────────────────
 ► 0         0x401050 _start
────────────────────────────────────────────────────────────────────────────────

DISAM 항목의 기호가 EP를 가리기고 있는 것을 확인할 수 있다.

pwndbg의 실행 결과는 총 4개의 섹션으로 되어 있다.

- REGISTERS : 레지스터의 상태
- DISASM : elf 파일을 디스어셈블한 명령어를 rip부터 나열
- STACK : 스택프레임의 상태
- BACKTRACE : rip 도달하기까지 실행된 함수의 목록
pwndbg> b *main
Breakpoint 2 at 0x401136
pwndbg> c
Continuing.

Breakpoint 2, 0x0000000000401136 in main ()

...

───────────────────────────────────────────────────────────────[ DISASM / x86-64 / set emulate on ]────────────────────────────────────────────────────────────────
 ► 0x401136 <main>       endbr64 
   0x40113a <main+4>     push   rbp
   0x40113b <main+5>     mov    rbp, rsp                       RBP => 0x7fffffffdc60 ◂— 1
   0x40113e <main+8>     sub    rsp, 0x10                      RSP => 0x7fffffffdc50 (0x7fffffffdc60 - 0x10)
   0x401142 <main+12>    mov    dword ptr [rbp - 0xc], 0       [0x7fffffffdc54] <= 0
   0x401149 <main+19>    mov    dword ptr [rbp - 8], 1         [0x7fffffffdc58] <= 1
   0x401150 <main+26>    mov    dword ptr [rbp - 4], 2         [0x7fffffffdc5c] <= 2
   0x401157 <main+33>    mov    edx, dword ptr [rbp - 8]       EDX, [0x7fffffffdc58] => 1
   0x40115a <main+36>    mov    eax, dword ptr [rbp - 4]       EAX, [0x7fffffffdc5c] => 2
   0x40115d <main+39>    add    eax, edx                       EAX => 3 (2 + 1)
   0x40115f <main+41>    mov    dword ptr [rbp - 0xc], eax     [0x7fffffffdc54] <= 3
─────────────────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────────────────
00:0000│ rsp 0x7fffffffdc68 —▸ 0x7ffff7c29d90 (__libc_start_call_main+128) ◂— mov edi, eax
01:0008│     0x7fffffffdc70 ◂— 0
02:0010│     0x7fffffffdc78 —▸ 0x401136 (main) ◂— endbr64 
03:0018│     0x7fffffffdc80 ◂— 0x100000000
04:0020│     0x7fffffffdc88 —▸ 0x7fffffffdd78 —▸ 0x7fffffffe13f ◂— '/home/shinbo/Desktop/dh/practice/debugee'
05:0028│     0x7fffffffdc90 ◂— 0
06:0030│     0x7fffffffdc98 ◂— 0xdc1494a27205ccf
07:0038│     0x7fffffffdca0 —▸ 0x7fffffffdd78 —▸ 0x7fffffffe13f ◂— '/home/shinbo/Desktop/dh/practice/debugee'
───────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────
 ► 0         0x401136 main
   1   0x7ffff7c29d90 __libc_start_call_main+128
   2   0x7ffff7c29e40 __libc_start_main+128
   3         0x401075 _start+37
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 

b로 breakpoint를 설정하고, c로 프로그램을 실행시킨다.

음 나머지는 알아서 모르겠다...

profile
지상 최강의 해적

0개의 댓글