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로 프로그램을 실행시킨다.
음 나머지는 알아서 모르겠다...