Fascination
article thumbnail

Tool: gdb


# ๋””๋ฒ„๊ฑฐ๋ž€ ๐Ÿ›

- ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋‚˜๊ฐ

- ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ์•„๋ฌด๋ฆฌ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด๋„, ์ฝ”๋“œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋‹ค ๋ณด๋ฉด ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋งˆ๋ จ

- ์ปดํ“จํ„ฐ๊ณผํ•™์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐํ•จ์„ ๋ฒ„๊ทธ(bug)๋ผ๊ณ  ํ•จ

- ์ด๋ฏธ ์™„์„ฑ๋œ ์ฝ”๋“œ์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ค์›€ ๋”ฐ๋ผ์„œ ์–ด๋ ค์›€์„ ํ•ด์†Œํ•˜๊ณ ์ž ๋””๋ฒ„๊ฑฐ(Debugger)๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ๊ฐœ๋ฐœ ๋จ

- ๋””๋ฒ„๊ฑฐ๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ฒ„๊ทธ๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ

- ํ”„๋กœ๊ทธ๋žจ์„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ, ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์คŒ

- ์ž์‹ ์ด ์ถ”์ƒ์ ์œผ๋กœ ์ƒ๊ฐํ•œ ์•„์ด๋””์–ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์„ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋จ

- ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ๋””๋ฒ„๊ฑฐ์˜ ์ด์ ์„ ๊ฐœ๋ฐœ์ž๋งŒ ์–ป๋Š” ๊ฒƒ์€ ์•„๋‹˜

  > ํ•ด์ปค, ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด ๋“ฑ์„ ๋น„๋กฏํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ชจ๋‘๊ฐ€ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

  ํƒ์ƒ‰์˜ ํšจ์œจ์„ ๋†’์ž„

 

 

# gdb & pwndbg

1. ์‹ค์Šต ์˜ˆ์ œ

- ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ๋ถ„์„ํ•˜๋ฉฐ gdb์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜€๋ณผ ๊ฒƒ

- ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผ ํ•จ

// 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;
}

 

- gdb debugee๋กœ ๋””๋ฒ„๊น…์„ ์‹œ์ž‘

 

2. Start ๐Ÿšช

- ๋ฆฌ๋ˆ…์Šค๋Š” ์‹คํ–‰ํŒŒ์ผ์˜ ํ˜•์‹์œผ๋กœ ELF(Executable and Linkable Format)๋ฅผ ๊ทœ์ •ํ•˜๊ณ  ์žˆ์Œ

- ELF๋Š” ํฌ๊ฒŒ ํ—ค๋”์™€ ์—ฌ๋Ÿฌ ์„น์…˜๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ

- ํ—ค๋ฐ์—๋Š” ์‹คํ–‰์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๊ฐ€ ์ ํ˜€ ์žˆ๊ณ , ์„น์…˜๋“ค์—๋Š” ์ปดํŒŒ์ผ๋œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ, ํ”„๋กœ๊ทธ๋žจ ๋ฌธ์ž์—ด์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ

- ELF์˜ ํ—ค๋” ์ค‘์— ์ง„์ž…์ (Entry Point, EP)์ด๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์šด์˜์ฒด์ œ๋Š” ELF๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์ง„์ž…์ ์˜ ๊ฐ’๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰

readelf๋กœ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ, debugee์˜ ์ง„์ž…์ ์€ 0x400400์ž„

 

- gdb์˜ start ๋ช…๋ น์–ด๋Š” ์ง„์ž…์ ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” gdb์˜ ๋ช…๋ น์–ด์ž„

DISASM ์˜์—ญ์˜ ํ™”์‚ดํ‘œ(โ–ถ)๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋Š” ํ˜„์žฌ rip์˜ ๊ฐ’์ธ๋ฐ,

start๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณด๋ฉด 0x400400์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ

์ด๋Š” ์•ž์„œ ์‚ดํŽด๋ณธ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ ์˜ ์ฃผ์†Œ์™€ ์ผ์น˜

 

ํ•˜์ง€๋งŒ Dreamhack ๊ฐ•์˜์—์„œ "0x400400 <_start>"๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ,

"0x4004eb<main+4>"๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Œ

 

์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๋‹ˆ _start๊ฐ€ main ์ด์ „์— ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•จ

readelf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด์ ์ธ ์ง„์ž…์ ์„ ์ฐพ์„ ๋•Œ๋Š” _start์˜ ์ฃผ์†Œ๊ฐ€ ๋‚˜์˜ด

ํ•˜์ง€๋งŒ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ start ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋• ์ง„์ž…์ ์ด ์•„๋‹Œ main ํ•จ์ˆ˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Œ

์ฆ‰, ๋””๋ฒ„๊ฑฐ์—์„œ์˜ start ๋ช…๋ น์–ด๋Š” C์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ํŒŒ์ผ์—์„œ, main ํ•จ์ˆ˜์— ์ค‘๋‹จ์ ์„ ๊ฑธ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž„

์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ Dreamhack๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋ณผ ๊ฒƒ์ž„

 

- start: gdb์˜ ๋ช…๋ น์–ด๋กœ, ์ง„์ž…์ (_start)๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

* ๊ทธ๋Ÿฌ๋‚˜ C์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์ŠคํŒŒ์ผ์—์„œ๋Š”, _start๊ฐ€ ์•„๋‹Œ main ํ•จ์ˆ˜์—์„œ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์คŒ

- Dreamhack๊ณผ ๊ฐ™์€ ์ง„์ž…์ ์—์„œ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค‘๋‹จ์ ์„ _start์— ๊ฑธ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋จ

 

3. context ๐Ÿ“ฝ๏ธ

- ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ

- ๋””๋ฒ„๊ฑฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๊ณผ์ •์„ ์ƒ์„ธํžˆ ๊ด€์ฐฐํ•˜๋ ค๋ฉด ์ปดํ“จํ„ฐ์˜ ๊ฐ์ข… ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Œ

- ๋งฅ๋ฝ(context): pwndbg์—์„œ ์ฃผ์š” ๋ฉ”๋ชจ๋ฆฌ๋“ค์˜ ์ƒํƒœ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋งฅ๋ฝ์ด๋ผ๊ณ  ํ•จ

  > ๋˜ํ•œ ์ด๋ฅผ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์Œ

- context๋Š” ํฌ๊ฒŒ 4๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„

  1. registers: ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์คŒ
  2. disasm: rip๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๋””์Šค์–ด์…ˆ๋ธ”๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ
  3. stack: rsp๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์Šคํƒ์˜ ๊ฐ’๋“ค์„ ๋ณด์—ฌ์คŒ
  4. backtrace: ํ˜„์žฌ rip์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์–ด๋–ค ํ•จ์ˆ˜๋“ค์ด ์ค‘์ฒฉ๋˜์–ด ํ˜ธ์ถœ๋๋Š”์ง€ ๋ณด์—ฌ์คŒ

- ์ด๋“ค์€ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐฑ์‹ ๋˜์–ด ๋ฐฉ๊ธˆ ์‹คํ–‰ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์คฌ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ

context

 

4. break & continue ๐Ÿšฅ

- main ํ•จ์ˆ˜๊ฐ€ ๋ถ„์„์˜ ๋Œ€์ƒ์ด๋ผ๊ณ  ๊ฐ€์ •

- break: ํŠน์ • ์ฃผ์†Œ์— ์ค‘๋‹จ์ (breakpoint)์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ

- continue: ์ค‘๋‹จ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์† ์‹คํ–‰์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ

  > break๋กœ ์›ํ•˜๋Š” ํ•จ์ˆ˜์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์† ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊นŒ์ง€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ 

  ์‹คํ–‰ํ•œ ๋‹ค์Œ ์ค‘๋‹จ๋จ

- ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋‹จ๋œ startํ•จ์ˆ˜๋ถ€ํ„ฐ mainํ•จ์ˆ˜๊นŒ์ง€ ์‹คํ–‰์‹œํ‚ฌ ๊ฒƒ

 

5. run ๐Ÿƒ‍โ™‚๏ธ

- ์•ž์˜ start๊ฐ€ ์ง„์ž…์ ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋™์œผ๋กœ ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ด์คฌ๋‹ค๋ฉด, run์€ ๋‹จ์ˆœํžˆ ์‹คํ–‰๋งŒ ์‹œํ‚ด

- ๋”ฐ๋ผ์„œ ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ด๋†“์ง€ ์•Š์•˜๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋๊นŒ์ง€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์‹คํ–‰๋จ

์ง€๊ธˆ์€ mainํ•จ์ˆ˜์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— run๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋„, mainํ•จ์ˆ˜์—์„œ ์‹คํ–‰์ด ๋ฉˆ์ถค

 

6. ๐Ÿ’ก gdb์˜ ๋ช…๋ น์–ด ์ถ•์•ฝ

  • b: break
  • c: continue
  • r: run
  • si: step into
  • ni: next instruction
  • i: info
  • k: kill
  • pd: pdisas

 

7. disassembly ๐Ÿ—๏ธ

- gdb: ํ”„๋กœ๊ทธ๋žจ์„ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ

- ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฏ€๋กœ, gdb๋Š” ๊ธฐ๊ณ„์–ด๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”(disassemble)ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํƒ‘์žฌ

- disassemble: gdb๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋””์Šค์–ด์…ˆ๋ธ” ๋ช…๋ น์–ด

  > ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ ๊นŒ์ง€ ์ „๋ถ€ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜์—ฌ ๋ณด์—ฌ์คŒ

+ u, nearpc, pdisassemble๋Š” pwndbg์—์„œ ์ œ๊ณตํ•˜๋Š” ๋””์Šค์–ด์…ˆ๋ธ” ๋ช…๋ น์–ด๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ถœ๋ ฅํ•ด์คŒ

๋ช…๋ น์–ด u ์‚ฌ์šฉ
๋ช…๋ น์–ด nearpc ์‚ฌ์šฉ
pdisassemble์˜ ๋ช…๋ น์–ด pd ์‚ฌ์šฉ

 

8. navigate โญ

- ๊ด€์ฐฐํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ค‘๋‹จ์ ์— ๋„๋‹ฌํ–ˆ์œผ๋ฉด, ๊ทธ ์ง€์ ๋ถ€ํ„ฐ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ•œ ์ค„์”ฉ ์ž์„ธํžˆ ๋ถ„์„ํ•ด์•ผ ํ•จ

  > ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ni์™€ si

- ni์™€ si๋Š” ๋ชจ๋‘ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋ฅผ ํ•œ ์ค„ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Œ

  > ๊ทธ๋Ÿฌ๋‚˜ call ๋“ฑ์„ ํ†ตํ•ด ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ni๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์ง€๋งŒ,

     si๋Š” ์„œ๋ธŒ๋ฃจํ‹ด์˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Œ

- ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด mainํ•จ์ˆ˜์—์„œ printfํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ง€์ ๊นŒ์ง€ ์‹คํ–‰ํ•ด ๋ณผ ๊ฒƒ์ž„

 

next instruction

- ni๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด printfํ•จ์ˆ˜ ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ rip๊ฐ€ ์ด๋™ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ’ก ์™œ printf๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์•„๋ฌด ๋ฌธ์ž์—ด๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋‚˜์š”?

- printf๊ฐ€ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์€ stdout์˜ ๋ฒ„ํผ์—์„œ ์ž ์‹œ ๋Œ€๊ธฐํ•œ ๋’ค ์ถœ๋ ฅ๋จ

- ๋ฒ„ํผ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชฉ์ ์ง€๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์ž ์‹œ ์ €์žฅ๋˜๋Š” ์žฅ์†Œ

- stdout ๋ฒ„ํผ๋Š” ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋์„ ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ์ง€๋กœ ์ด๋™์‹œํ‚ค๋Š”๋ฐ, ๊ทธ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  1. ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ
  2. ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ
  3. fllush์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๋ฒ„ํผ๋ฅผ ๋น„์šฐ๋„๋ก ๋ช…์‹œํ–ˆ์„ ๋•Œ
  4. ๊ฐœํ–‰๋ฌธ์ž๊ฐ€ ๋ฒ„ํผ์— ๋“ค์–ด์™”์„ ๋•Œ

- ์œ„์˜ ์˜ˆ์‹œ๋Š” ์œ„ ์กฐ๊ฑด์€ ํ•˜๋‚˜๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ

 

step into

- printfํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ง€์ ๊นŒ์ง€ ๋‹ค์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚จ ๋’ค, si๋ฅผ ์ž…๋ ฅ

- printfํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ rip๊ฐ€ ์ด๋™ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

- contextํ•˜๋‹จ์˜ Backtrace๋ฅผ ๋ณด๋ฉด, mainํ•จ์ˆ˜์—์„œ printf๋ฅผ ํ˜ธ์ถœํ–ˆ์œผ๋ฏ€๋กœ mainํ•จ์ˆ˜ ์œ„์— printfํ•จ์ˆ˜๊ฐ€ ์Œ“์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

 

finish

- step into๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ๋ถ„์„ํ–ˆ๋Š”๋ฐ, ํ•จ์ˆ˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์„œ ni๋กœ๋Š” ์›๋ž˜ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ

- finsh: ํ•จ์ˆ˜์˜ ๋๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์—ฌ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

 

9. examine ๐Ÿ–จ๏ธ

- ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ์ž„์˜ ์ฃผ์†Œ์˜ ๊ฐ’์„ ๊ด€์ฐฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Œ

  > ์ด๋ฅผ ์œ„ํ•ด gdb์—์„œ๋Š” x๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณต

- x: ํŠน์ • ์ฃผ์†Œ์—์„œ ์›ํ•˜๋Š” ๊ธธ์ด๋งŒํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์Œ

- format letters

  • o(octal)
  • x(hex)
  • d(decimal)
  • u(unsigned decimal)
  • t(binary)
  • f(float)
  • a(address)
  • i(instruction)
  • c(char)
  • s(string)
  • z(hex, zero padded on the left)

- size letters

  • b(byte)
  • h(halfword)
  • w(word)
  • h(giant, 8 byte)

โ‘  rsp๋ถ€ํ„ฐ 80๋ฐ”์ดํŠธ๋ฅผ 8๋ฐ”์ดํŠธ์”ฉ hexํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ

rsp๋ถ€ํ„ฐ 80๋ฐ”์ดํŠธ๋ฅผ 8๋ฐ”์ดํŠธ์”ฉ ์ถœ๋ ฅํ•ด๋ด„

"x/10gx $rsp": g๋Š” 8๋ฐ”์ดํŠธ๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์•ž์— 10์„ ์ ์—ˆ์œผ๋ฏ€๋กœ 8๋ฐ”์ดํŠธ์”ฉ 10๋ฒˆ ์ถœ๋ ฅ.

x๋Š” hexํ˜•์‹์„ ์˜๋ฏธํ•˜๋ฉฐ $rsp๋Š” rsp๋ถ€ํ„ฐ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ์˜๋ฏธ

 

โ‘ก rip๋ถ€ํ„ฐ 10์ค„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด ์ถœ๋ ฅ

rip๋ถ€ํ„ฐ 5์ค„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋ฅผ ์ถœ๋ ฅ

"x/5i $rip": i๋Š” instruction์„ ์˜๋ฏธํ•˜๊ณ  ์•ž์— 5๊ฐ€ ์ ํ˜€์žˆ์œผ๋ฏ€๋กœ ๋‹ค์„ฏ ์ค„์„ ์–ด์…ˆ๋ธ”ํ•˜์—ฌ ๋ณด์—ฌ์คŒ

$rip๋Š” rip๋ถ€ํ„ฐ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ์˜๋ฏธ

โ‘ข ํŠน์ • ์ฃผ์†Œ์˜ ๋ฌธ์ž์—ด ์ถœ๋ ฅ

ํŠน์ • ์ฃผ์†Œ, 0x400000์—์„œ์˜ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ด ๋ด„

 

10. telescope ๐Ÿ”ญ

- telescope: pwndbg๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ ๊ธฐ๋Šฅ

- ํŠน์ • ์ฃผ์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์—์„œ ๊ทธ์น˜์ง€ ์•Š๊ณ , ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ ๊ฐ’์„ ๋ณด์—ฌ์คŒ

 

11. vmmap ๐Ÿ—บ๏ธ

- vmmap: ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๋ณด์—ฌ์คŒ

- ์–ด๋–ค ํŒŒ์ผ์— ๋งคํ•‘๋œ ์˜์—ญ์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๊นŒ์ง€ ๋ณด์—ฌ์คŒ

 

12. gdb / python

- gdb๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•  ๋•Œ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์„ ๋•Œ๊ฐ€ ์žˆ์Œ

  ex) ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹Œ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์ด์šฉ์ž๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์œผ๋กœ

  ์ž…๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

- ์˜ˆ์ œ ์ฝ”๋“œ

// Name: debugee2.c
// Compile: gcc -o debugee2 debugee2.c -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
	char name[20];
	if( argc < 2 ) {
		printf("Give me the argv[2]!\n");
		exit(0);
	}
	memset(name, 0, sizeof(name));
	printf("argv[1] %s\n", argv[1]);
	read(0, name, sizeof(name)-1);
	printf("Name: %s\n", name);
	return 0;
}

ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๊ฐ’๊ณผ ์ด์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์ œ

- ๋””๋ฒ„๊น…

 

13. gdb / python argv

- run ๋ช…๋ น์–ด์˜ ์ธ์ž๋กœ $()์™€ ํ•จ๊ป˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

- ๋‹ค์Œ์€ ํŒŒ์ด์ฌ์—์„œ printํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅํ•œ ๊ฐ’์„ run ๋ช…๋ น์–ด์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ช…๋ น์–ด

 

14. gdb / python input

- $()์™€ ํ•จ๊ป˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ’์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Œ

- ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” '<<<' ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉ

- ๋‹ค์Œ์€ ์•ž์„œ ๋ฐฐ์šด argv[1]์— ์ž„์˜์˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ , ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

 

 

# ๋งˆ์น˜๋ฉฐ

- ์ฝ”์Šค ์š”์•ฝ ๐Ÿ“œ

  • start: ์ง„์ž…์ ์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ , ์‹คํ–‰
  • break(b): ์ค‘๋‹จ์  ์‹คํ–‰
  • continue(c): ๊ณ„์† ์‹คํ–‰
  • disassemble: ๋””์Šค์–ด์…ˆ๋ธ” ๊ฒฐ๊ณผ ์ถœ๋ ฅ
  • u, nearpc, pd: ๋””์Šค์–ด์…ˆ๋ธ” ๊ฒฐ๊ณผ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ฒ˜๋ฆฌ
  • x: ๋ฉ”๋ชจ๋ฆฌ ์กฐํšŒ
  • run(r): ํ”„๋กœ๊ทธ๋žจ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰
  • context: ๋ ˆ์ง€์Šคํ„ฐ, ์ฝ”๋“œ, ์Šคํƒ, ๋ฐฑํŠธ๋ ˆ์ด์Šค์˜ ์ƒํƒœ ์ถœ๋ ฅ
  • next(ni): ๋ช…๋ น์–ด ์‹คํ–‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ
  • step into(si): ๋ช…๋ น์–ด ์‹คํ–‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ
  • telescope(tele): ๋ฉ”๋ชจ๋ฆฌ ์กฐํšŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์ด ํฌ์ธํ„ฐ์ผ ๊ฒฝ์šฐ ์žฌ๊ท€์ ์œผ๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๊ฐ’ ์ถœ๋ ฅ
  • vmmap: ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ์ถœ๋ ฅ

'Hacking Tech > System Hacking' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Dreamhack] Exploit Tech: Shellcode  (0) 2022.04.03
[Dreamhack] Tool: pwntools  (0) 2022.03.28
[Dreamhack] x86 Assembly๐Ÿค–: Essential Part(2)  (0) 2022.03.27
[Dreamhack] x86 Assembly๐Ÿค–: Essential Part(1)  (0) 2022.03.26
[Dreamhack] Background: Linux Memory Layout  (0) 2022.03.25
profile

Fascination

@euna-319

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!