1. pwndbg ์ค์น (ubuntu 22.04)
https://github.com/pwndbg/pwndbg
2. ๋๋ฒ๊น
(1) ํ์ผ ์์ฑ
// 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;
}
(2) ์ํธ๋ฆฌ ์ฐพ๊ธฐ - readelf
ELF(Executable and Linkable Format) ํ์ผ์ ํค๋ ์ ๋ณด ํ์ธ
- EP ๊ฐ์ ํ์ธํ๋ฉด ์ํธ๋ฆฌ ์ฆ, ์ง์ ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ ์๋ค. = 0x401050
- ์ด์์ฒด์ ๋ ELF๋ฅผ ์คํํ ๋, ์ง์ ์ ์ ๊ฐ๋ถํฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
(3) gdb์ entry๋ช ๋ น์ด
entry๋ ์ง์ ์ ๋ถํฐ ํ๋ก๊ทธ๋จ์ ๋ถ์ํ ์ ์๊ฒ ํด์ฃผ๋ gdb์ ๋ช ๋ น์ด์ด๋ค.
DISASM์์ญ์ ํ์ดํ(โบ)๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ ํ์ฌ rip์ ๊ฐ์ธ๋ฐ, entry ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ๋ณด๋ฉด ์ํธ๋ฆฌ ์ฃผ์์ธ 0x401050์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
ํ๋ก๊ทธ๋จ์ ์คํ๋๋ฉด์ ๋ ์ง์คํฐ๋ฅผ ๋น๋กฏํ ์ฌ๋ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ค.
๋ฐ๋ผ์ ๋๋ฒ๊ฑฐ๋ฅผ ์ด์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํ ๊ณผ์ ์ ์์ธํ ๊ด์ฐฐํ๋ ค๋ฉด ์ปดํจํฐ์ ๊ฐ์ข ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋์ ํ์ ํ ์ ์๋ ๊ฒ์ด ์ข๋ค. pwndbg๋ ์ฃผ์ ๋ฉ๋ชจ๋ฆฌ๋ค์ ์ํ๋ฅผ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ์๋ Context๋ฅผ ๊ฐ๋ ์ฑ ์๊ฒ ํํํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ถ๊ณ ์๋ค.
context๋ ํฌ๊ฒ 4๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋๋ค. (ํ๋ฉด์ ๋ณด์ด๋ ์์๋๋ก)
- REGISTERS: ๋ ์ง์คํฐ์ ์ํ
- DISASM: ๋์ค์ด์ ๋ธ๋ ๊ฐ (rip ~)
- STACK: ์คํ์ ๊ฐ (rsp ~)
- BACKTRACE: ํ์ฌ rip์ ๋๋ฌํ ๋๊น์ง ์ด๋ค ํจ์๋ค์ด ์ค์ฒฉ๋์ด ํธ์ถ๋๋์ง ๋ณด์ฌ์ค๋ค.
(4) break & continue & run
์ด ๋, ๋๋ฒ๊ฑฐ์๋ break์ continue๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค.
break๋ ํน์ ์ฃผ์์ ์ค๋จ์ (breakpoint)์ ์ค์ ํ๋ ๊ธฐ๋ฅ์ด๊ณ , continue๋ ์ค๋จ๋ ํ๋ก๊ทธ๋จ์ ๊ณ์ ์คํ์ํค๋ ๊ธฐ๋ฅ์ด๋ค. break๋ก ์ํ๋ ํจ์์ ์ค๋จ์ ์ ์ค์ ํ๊ณ , ํ๋ก๊ทธ๋จ์ ๊ณ์ ์คํํ๋ฉด ํด๋น ํจ์๊น์ง ๋ฉ์ถ์ง ์๊ณ ์คํํ ๋ค์ ์ค๋จ๋๋ค.
run์ ๋จ์ํ ์คํ ์ํค๋ ๋ช ๋ น์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ค๊ฐ์ run์ ์ ๋ ฅํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ฌ์์๋์ด ์คํ๋๋ค. (continue๋ ๋ฉ์ถ ๋ถ๋ถ์์๋ถํฐ ์คํ์ ์ด์ด๋๊ฐ๋ค.)
- mainํจ์์ breakpoint ๊ฑธ๊ณ c ํด์ฃผ๊ธฐ
r(run)ํด์ฃผ๋ฉด ๋ค์ ์คํ๋จ //b๋ ๊ทธ๋๋ก ์ ์ง๋์ด main์์ ์คํ ๋ฉ์ถค
(5) disassembly
disassemble(disass)์ gdb๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋์ค์ด์ ๋ธ ๋ช ๋ น์ด์ด๋ค.
ํจ์ ์ด๋ฆ์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ํด๋น ํจ์๊ฐ ๋ฐํ๋ ๋ ๊น์ง ๋์ค์ด์ ๋ธํ์ฌ ๋ณด์ฌ์ค๋ค.
(6) navigate
๊ด์ฐฐํ๊ณ ์ ํ๋ ํจ์์ ๋๋ฌํ๋ฉด, ๊ทธ ์ง์ ๋ถํฐ๋ ๋ช ๋ น์ด๋ฅผ ํ ์ค์ฉ ์์ธํ ๋ถ์ํด์ผ ํ๋ค.
์ด๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ก ni(next into)์ si(step into)๊ฐ ์๋ค.
- next : ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ํ ์ค ์คํํ๋ค. ํจ์ ์คํ ์ ๋ด๋ถ๋ก ์ง์
X
- ni: ์ด์ ๋ธ๋ฆฌ ์์ค์์ ํ ๋ช ๋ น์ด์ฉ ์คํ //ํ์ฌ ๋ช ๋ น์ด๊ฐ ํจ์ ํธ์ถ์ผ ๊ฒฝ์ฐ ํจ์์ ์ ์ฒด ์คํ์ ์๋ฃํ ํ ๋ค์ ๋ช ๋ น์ด๋ก ์ด๋
- step : ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ํ ์ค ์คํํ๋ค. ํจ์ ์คํ ์ ๋ด๋ถ๋ก ์ง์
- si: ์ด์ ๋ธ๋ฆฌ ์์ค์์ ํ ๋ช ๋ น์ด์ฉ ์คํ //ํ์ฌ ๋ช ๋ น์ด๊ฐ ํจ์ ํธ์ถ์ผ ๊ฒฝ์ฐ ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ
- main ํจ์์์ printf ํจ์๋ฅผ ํธ์ถํ๋ ์ง์ ๊น์ง ์คํ
- ni ์คํ ๊ฒฐ๊ณผ: printf()ํจ์๋ก ๋ค์ด๊ฐ์ง ์๊ณ , ๋ฐ๋ก ๊ทธ ๋ค์ ๋ช ๋ น์ด๋ก ๋์ด๊ฐ (printf ํจ์ ๋ฐ๋ก ๋ค์์ผ๋ก rip๊ฐ ์ด๋)
- si ์คํ ๊ฒฐ๊ณผ: printf ํจ์ ๋ด๋ถ๋ก rip๊ฐ ์ด๋
(7) finish
ํจ์ ๋ด๋ถ์ ๋ค์ด๊ฐ์ ํ์ํ ๋ถ๋ถ์ ๋ชจ๋ ๋ถ์ํ์ ๊ฒฝ์ฐ finish๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ๋๊น์ง ํ ๋ฒ์ ์คํํ ์ ์๋ค.
(8) examine
gdb์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ x๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํตํด ํน์ ์ฃผ์์์ ์ํ๋ ๊ธธ์ด๋งํผ์ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํ์์ผ๋ก ์ธ์ฝ๋ฉํ์ฌ ๋ณผ์ ์๋ค.
- x/10gx $rsp : ์คํ์ ์์ 10๊ฐ์ ํญ๋ชฉ
- ํ์ฌ ์คํ ํฌ์ธํฐ($rsp)๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์์ ์์ํ์ฌ 8๋ฐ์ดํธ(64๋นํธ)์ฉ 10๊ฐ์ ๊ฐ์ 16์ง์๋ก ์ถ๋ ฅ
- x/5i $rip : rip๋ถํฐ 5์ค์ ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด ์ถ๋ ฅ
- x/s 0x400000 : ํน์ ์ฃผ์(0x400000)์ ๋ฌธ์์ด ์ถ๋ ฅ
- x/s 0x400000 ๋ช ๋ น์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 0x400000์์ ์์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ํด์ํ์ฌ ์ถ๋ ฅํ๋ค.
- ์ด ๋ช ๋ น์ด๋ ํด๋น ์ฃผ์์์ ์์ํ๋ ๋ฌธ์์ด์ C ์คํ์ผ(null ๋ฌธ์๋ก ๋๋๋)๋ก ์ถ๋ ฅํ๋ฏ๋ก, ์ฃผ๋ก ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋ ๋ฌธ์์ด์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
(9) telescope
telescope์ pwndbg๊ฐ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ๋ฉ๋ชจ๋ฆฌ ๋คํ ๊ธฐ๋ฅ์ด๋ค.
ํน์ ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ๋ค์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์์ ๊ทธ์น์ง ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํ์ฌ ๊ฐ์ ๋ณด์ฌ์ค๋ค. (๋ํดํธ: rsp, tele [address] ํ์ )
(10) vmmap
vmmap์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด์ด๋ค.
vmmap์ ํน์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํ์ผ์ ๋งคํ๋์ด ์๋ค๋ฉด, ํด๋น ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ํจ๊ป ์ถ๋ ฅํ๋ค. ์๋ฅผ ๋ค์ด, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋ ๊ฒฝ์ฐ, ๊ทธ ํ์ผ์ ๊ฒฝ๋ก๊ฐ ํ์๋๋ค.
๋ํ, ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ์ฌ๊ธฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์์ ๋ ์ฃผ์, ์ ๊ทผ ๊ถํ(์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ ๊ฐ๋ฅ ์ฌ๋ถ), ์์ญ์ ํฌ๊ธฐ, ์คํ์ , ํ์ผ ๋งคํ ์ฌ๋ถ ๋ฑ์ด ํฌํจ๋๋ค.
์ด๋ค ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ ๊ฒ์ ํ์ผ ๋งคํ์ด๋ผ๊ณ ํ๋ค.
์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์์ /home/mnzy/pwn/debugee์ /usr/lib/x86_64-linux-gnu/libc.so.6, /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2๊ฐ ๋งคํ๋ ํ์ผ๋ค์ด๋ค. ๋ฆฌ๋ ์ค์์๋ ELF๋ฅผ ์คํํ ๋, ๋จผ์ ELF์ ์ฝ๋์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ๊ณ , ํด๋น ELF์ ๋งํฌ๋ ๊ณต์ ์ค๋ธ์ ํธ(Shared Object, so)๋ฅผ ์ถ๊ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ๋ค.
๊ณต์ ์ค๋ธ์ ํธ๋ ์๋์ฐ์ DLL๊ณผ ๋์๋๋ ๊ฐ๋ ์ผ๋ก, ์์ฃผ ์ฌ์ฉ๋๋ ํจ์๋ค์ ๋ฏธ๋ฆฌ ์ปดํ์ผํด๋ ๊ฒ์ด๋ค. C์ธ์ด์ printf, scanf ๋ฑ์ด ๋ฆฌ๋ ์ค์์๋ libc(library C)์ ๊ตฌํ๋์ด ์๋ค. ๊ณต์ ์ค๋ธ์ ํธ์ ์ด๋ฏธ ๊ตฌํ๋ ํจ์๋ฅผ ํธ์ถํ ๋๋ ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ํจ์๋ฅผ ๋์ ํธ์ถํ๋ค.
(11) gdb / python
gdb๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ ๋, ํค๋ณด๋๋ก ์ง์ ํ์ดํํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ๊ฐ์ ์ ๋ ฅํ๊ณ ์ถ์ ์๊ฐ์ด ์๋ค.
์๋ฅผ ๋ค์ด, ์ซ์๋ ์๋๊ณ , ์ํ๋ฒณ๋ ์๋๋ฉฐ, ํน์ ๋ฌธ์๋ ์๋ ๊ฐ์ ์ ๋ ฅํ๋ ์ํฉ์ด๋ค.
์ด๋ฌํ ๊ฐ์ ์ด์ฉ์๊ฐ ์ง์ ์ ๋ ฅํ ์ ์๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ฌ์ผ๋ก ์ ๋ ฅ๊ฐ์ ์์ฑํ๊ณ , ์ด๋ฅผ ํ๋ก๊ทธ๋จ ์ ๋ ฅ์ผ๋ก ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ค.
[์์] ํ๋ก๊ทธ๋จ์ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ๊ณผ ์ด์ฉ์๋ก๋ถํฐ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์ถ๋ ฅ
// 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[1]!\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;
}
run ๋ช
๋ น์ด์ ์ธ์๋ก $() ์ ํจ๊ป ํ์ด์ฌ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ฉด ๊ฐ์ ์ ๋ฌํ ์ ์๋ค.
ํ์ด์ฌ์์ print ํจ์๋ฅผ ํตํด ์ถ๋ ฅํ ๊ฐ์ run(r) ๋ช ๋ น์ด์ ์ธ์๋ก ์ ๋ฌํ๋ ๋ช ๋ น์ด์ด๋ค.
๋ํ ํ์ด์ฌ ์ฝ๋๋ฅผ ํตํด ๊ฐ์ ์ ๋ ฅํ ์๋ ์๋ค.
์ ๋ ฅ๊ฐ์ผ๋ก ์ ๋ฌํ๊ธฐ ์ํด์๋ <<< ๋ฅผ ์ฌ์ฉํ๋ค.
์๋๋ argv[1]์ ์์์ ๊ฐ์ ์ ๋ฌํ๊ณ , ๊ฐ์ ์ ๋ ฅํ๋ ๋ช ๋ น์ด์ด๋ค.
[์ฐธ๊ณ ] https://learn.dreamhack.io/55