1. ìë¡
ëë²ê±°
컎íší°ê³Œíììëì€ìë¡ ë°ìí íë¡ê·žëšì ê²°íšì ë²ê·ž(bug)ëŒê³ íëë°, ìŽë¯ž ìì±ë ìœëìì ë²ê·žë¥Œ ì°Ÿë ê²ì ìŽë µìµëë€. ê·žëì ìŽë° ìŽë €ìì íŽìíê³ ì ëë²ê±°(Debugger)ëŒë ëêµ¬ê° ê°ë°ëììµëë€.
ëë²ê±°ë 묞ì ê·žëë¡ ë²ê·žë¥Œ ìì êž° ìíŽ ì¬ì©íë ë구ì ëë€. íë¡ê·žëšì ìŽì ëžëЬ ìœë ëšìë¡ ì€íí멎ì, ì€í 결곌륌 ì¬ì©ììê² ë³Žì¬ì€ëë€.
ê·žë¬ë ìŽë¬í ëë²ê±°ì íšì©ì ê°ë°ìë§ ì»ë ê²ì ìëëë€. íŽì»€, 늬ë²ì€ ìì§ëìŽ ë±ì ë¹ë¡¯íì¬ ìíížìšìŽìì ë²ê·žë¥Œ ì°Ÿê³ ì íë 몚ëê° ìŽ ë구륌 ì¬ì©íì¬ ë²ê·žë¥Œ íšìšì ìŒë¡ íìí ì ììµëë€.
ìŽë²ìë 늬ë ì€ì ëíì ìž ëë²ê±° ì€ íëìž gdbì êž°ë¥ë€ì ëíŽ ë°°ì°ê³ , ì€ìµì íµíŽ ì¬ì©ë²ì ìµíë³Žê² ìµëë€.
2. gdb & pwndbg
gdb
gdb(GNU debugger)ë 늬ë ì€ì ëíì ìž ëë²ê±°ì ëë€. ì€í ìì€ë¡ ê°ë°ëìŽ ë¬Žë£ë¡ ì€ì¹í ì ììŒë©°, ì€ëëë§íŒ ë€ìí íë¬ê·žìžë€ìŽ ê°ë°ëìŽ ììµëë€. ì°ëŠ¬ê° ì¬ì©íë Ubuntu 18.04ìë Ʞ볞ì ìŒë¡ ì€ì¹ëìŽ ììµëë€.
gdbì íë¬ê·žìž ì€ìì ë°ìŽë늬 ë¶ì ì©ëë¡ ë늬 ì¬ì©ëë íë¬ê·žìžë€ì ë€ì곌 ê°ìµëë€.
GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy
Exploit Development and Reverse Engineering with GDB Made Easy - GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy
github.com
ì€ì¹ë¥Œ ë§ì¹ í, í°ë¯žëì gdb륌 ì ë ¥íì ë, ìëì ê°ì ì€í ê²°ê³Œê° ëì€ë©Ž ì€ì¹ì ì±ê³µí ê²ì ëë€.
$ gdb
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
Find the GDB manual and other documentation resources online at:
For help, type "help".
Type "apropos word" to search for commands related to "word".
pwndbg: loaded 193 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
pwndbg>
ì€ìµ ìì
ê°ëší ìœë륌 ìì±íê³ , ìŽë¥Œ ë¶ìíë©° 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ë¡ ëë²ê¹ ì ììí©ëë€.
$ gcc -o debugee debugee.c
$ gdb debugee
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
pwndbg: loaded 193 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Reading symbols from debugee...(no debugging symbols found)...done.
pwndbg>
start
늬ë ì€ë ì€ííìŒì íììŒë¡ ELF(Executable and Linkable Format)륌 ê·ì íê³ ììµëë€. ELFë í¬ê² í€ëì ì¬ë¬ ì¹ì ë€ë¡ 구ì±ëìŽ ììµëë€. í€ëìë ì€íì íìí ì¬ë¬ ì ë³Žê° ì í ìê³ , ì¹ì ë€ìë 컎íìŒë êž°ê³ìŽ ìœë, íë¡ê·žëš 묞ììŽì ë¹ë¡¯í ì¬ë¬ ë°ìŽí°ê° í¬íšëìŽ ììµëë€.
ELFì í€ë ì€ì ì§ì ì (Entry Point, EP)ìŽëŒë íëê° ìëë°, ìŽì첎ì ë ELF륌 ì€íí ë, ì§ì ì ì ê°ë¶í° íë¡ê·žëšì ì€íí©ëë€. readelfë¡ íìžíŽë³ž 결곌, debugeeì ì§ì ì ì 0x400400ì ëë€.
$ 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: 0x400400
Start of program headers: 64 (bytes into file)
Start of section headers: 6376 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 29
Section header string table index: 28
gdbì start ëª ë ¹ìŽë ì§ì ì ë¶í° íë¡ê·žëšì ë¶ìí ì ìê² íŽì£Œë gdbì ëª ë ¹ìŽì ëë€. DISASMììì íìŽí(âº)ê° ê°ëЬí€ë 죌ìë íì¬ ripì ê°ìžë°, startëª ë ¹ìŽë¥Œ ì€ííê³ ë³Žë©Ž 0x400400ì ê°ëЬí€ê³ ììµëë€. ìŽë ìì ìŽíŽë³ž íë¡ê·žëš ì§ì ì ì 죌ìì ìŒì¹í©ëë€.
pwndbg> start
Temporary breakpoint 1 at 0x400400
Temporary breakpoint 1, 0x0000000000400400 in _start ()
[ì€ëµ]
âââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââ
⺠0x400400 <_start> xor ebp, ebp
0x400402 <_start+2> mov r9, rdx
0x400405 <_start+5> pop rsi
0x400406 <_start+6> mov rdx, rsp
0x400409 <_start+9> and rsp, 0xfffffffffffffff0
0x40040d <_start+13> push rax
0x40040e <_start+14> push rsp
0x40040f <_start+15> mov r8, __libc_csu_fini <0x4005a0>
0x400416 <_start+22> mov rcx, __libc_csu_init <0x400530>
0x40041d <_start+29> mov rdi, main <0x4004e7>
0x400424 <_start+36> call qword ptr [rip + 0x200bc6] <__libc_start_main>
[ì€ëµ]
pwndbg>
context
íë¡ê·žëšì ì€íë멎ì ë ì§ì€í°ë¥Œ ë¹ë¡¯í ì¬ë¬ ë©ëªšëЬì ì ê·Œí©ëë€. ë°ëŒì ëë²ê±°ë¥Œ ìŽì©íì¬ íë¡ê·žëšì ì€í 곌ì ì ììží êŽì°°íë €ë©Ž 컎íší°ì ê°ì¢ ë©ëªšëŠ¬ë¥Œ íëì íì í ì ìë ê²ìŽ ì¢ìµëë€. pwndbgë 죌ì ë©ëªšëЬë€ì ìí륌 íë¡ê·žëšìŽ ì€íëê³ ìë ë§¥ëœ(Context)ìŽëŒê³ ë¶ë¥Žë©°, ìŽë¥Œ ê°ë ì± ìê² ííí ì ìë ìží°íìŽì€ë¥Œ ê°ì¶ê³ ììµëë€.
contextë í¬ê² 4ê°ì ìììŒë¡ 구ë¶ë©ëë€.
- registers: ë ì§ì€í°ì ìí륌 볎ì¬ì€ëë€.
- disasm: ripë¶í° ì¬ë¬ ì€ì ê±žì³ ëì€ìŽì ëžë 결곌륌 볎ì¬ì€ëë€.
- stack: rspë¶í° ì¬ë¬ ì€ì ê±žì³ ì€íì ê°ë€ì 볎ì¬ì€ëë€.
- backtrace: íì¬ ripì ëë¬í ëê¹ì§ ìŽë€ íšìë€ìŽ ì€ì²©ëìŽ ížì¶ëëì§ ë³Žì¬ì€ëë€. ê³§ ìì륌 ë€ìŽ ë ììží ì€ëª íê² ìµëë€.
ìŽë€ì ìŽì ëžëŠ¬ë¥Œ ì€íí ëë§ë€ ê°±ì ëìŽ ë°©êž ì€íí ìŽì ëžëЬ ëª ë ¹ìŽê° ë©ëªšëЬì ìŽë€ ìí¥ì 쀬ëì§ ìœê² íì í ì ìê² ëìµëë€.

break & continue
gdb륌 ìŽì©íì¬ íë¡ê·žëšì ë¶ìí ë, ìŒë°ì ìŒë¡ ì 첎 íë¡ê·žëš ì€ ì죌 ìŒë¶ë¶ì ëììë§ êŽì¬ìŽ ììµëë€. ìŽ ìì ìì main íšìê° ë¶ìì ëììŽëŒê³ ê°ì íê² ìµëë€. ìŽë° ìí©ìì, ì§ì ì ë¶í° main íšìê¹ì§ ìœë륌 í ì€ì© ì€íììŒê°ë©° main íšìì ëë¬íŽìŒ íë€ë©Ž, ëë²ê¹ ìŽ íšìšì ìŽì§ ììµëë€.
ê·žëì ë§ì ëë²ê±°ìë breakì continueëŒë êž°ë¥ìŽ ììµëë€. breakë í¹ì 죌ìì ì€ëšì (breakpoint)ì ì€ì íë êž°ë¥ìŽê³ , continueë ì€ëšë íë¡ê·žëšì ê³ì ì€íìí€ë êž°ë¥ì ëë€. breakë¡ ìíë íšìì ì€ëšì ì ì€ì íê³ , íë¡ê·žëšì ê³ì ì€íí멎 íŽë¹ íšìê¹ì§ ë©ì¶ì§ ìê³ ì€íí ë€ì ì€ëšë©ëë€. ê·žë¬ë©Ž ì€ëšë ì§ì ë¶í° ë€ì ìžë°íê² ë¶ìí ì ììµëë€.
ìŽë€ì íì©íì¬ íì¬ ì€ëšë start íšìë¶í° main íšìê¹ì§ ì€íìí€ê² ìµëë€.
pwndbg> b *main
Breakpoint 2 at 0x4004e7
pwndbg> c
Continuing.
Breakpoint 2, 0x00000000004004e7 in main ()
[ì€ëµ]
ââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââ
⺠0x4004e7 <main> push rbp <0x400530>
0x4004e8 <main+1> mov rbp, rsp
0x4004eb <main+4> sub rsp, 0x10
0x4004ef <main+8> mov dword ptr [rbp - 0xc], 0
0x4004f6 <main+15> mov dword ptr [rbp - 8], 1
0x4004fd <main+22> mov dword ptr [rbp - 4], 2
0x400504 <main+29> mov edx, dword ptr [rbp - 8]
0x400507 <main+32> mov eax, dword ptr [rbp - 4]
0x40050a <main+35> add eax, edx
0x40050c <main+37> mov dword ptr [rbp - 0xc], eax
0x40050f <main+40> mov eax, dword ptr [rbp - 0xc]
ââââââââââââââââââââââââââ[ STACK ]âââââââââââââââââââââââââââ
[ìëµ]
run
ìì startê° ì§ì ì ë¶í° íë¡ê·žëšì ë¶ìí ì ìëë¡ ìëìŒë¡ ì€ëšì ì ì€ì íŽì€¬ë€ë©Ž, runì ëšìí ì€íë§ ìíµëë€. ë°ëŒì ì€ëšì ì ì€ì íŽëì§ ììë€ë©Ž íë¡ê·žëšìŽ ëê¹ì§ ë©ì¶ì§ ìê³ ì€íë©ëë€. ì§êžì main íšìì ì€ëšì ì ì€ì íŽëšêž° ë묞ì runëª ë ¹ìŽë¥Œ ì€ííŽë, main íšììì ì€íìŽ ë©ì¶¥ëë€.
pwndbg>r
Starting program: /home/dreamhack/debugee
Breakpoint 2, 0x00000000004004e7 in main ()
gdbë íë¥í ëª
ë ¹ìŽ ì¶ìœ êž°ë¥ì ì ê³µí©ëë€. ìŽë€ ëª
ë ¹ìŽë¥Œ í¹ì í ì ìë ìµìíì 묞ììŽë§ ì
ë ¥í멎 ìëìŒë¡ ëª
ë ¹ìŽë¥Œ ì°Ÿì ì€ííŽì€ëë€. ëªëª ëíì ìž ëª
ë ¹ìŽë€(break, continue, run ë±)ì í¹ì í ì ìëëŒë ì°ì ìŒë¡ ì€ííŽì€ëë€. ë€ìì ì죌 ì¬ì©ëë ëª
ë ¹ìŽë€ì ëšì¶í€ ìì
ëë€.
|
disassembly
gdbë íë¡ê·žëšì ìŽì ëžëЬ ìœë ëšìë¡ ì€ííê³ , 결곌륌 볎ì¬ì€ëë€. íë¡ê·žëšì ìœëë êž°ê³ìŽë¡ ìŽë£šìŽì ž ììŒë¯ë¡, gdbë êž°ê³ìŽë¥Œ ëì€ìŽì ëž(Disassemble)íë êž°ë¥ì Ʞ볞ì ìŒë¡ íì¬íê³ ììµëë€. ì¶ê°ë¡, pwndbgìë ëì€ìŽì ëžë 결곌륌 ê°ë ì± ì¢ê² ì¶ë ¥íŽì£Œë êž°ë¥ìŽ ììµëë€. ê°ê°ì ìŽíŽë³Žê² ìµëë€.
disassembleì gdbê° êž°ë³žì ìŒë¡ ì ê³µíë ëì€ìŽì ëž ëª ë ¹ìŽì ëë€. ìëì ê°ìŽ íšì ìŽëŠì ìžìë¡ ì ë¬í멎 íŽë¹ íšìê° ë°íë ë ê¹ì§ ì ë¶ ëì€ìŽì ëžíì¬ ë³Žì¬ì€ëë€.
gdb disassembly

u, nearpc, pdisassembleë pwndbgìì ì ê³µíë ëì€ìŽì ëž ëª ë ¹ìŽì ëë€. ëì€ìŽì ëžë ìœë륌 ê°ë ì± ì¢ê² ì¶ë ¥íŽì€ëë€.
pwndbg disassembly

navigate
êŽì°°íê³ ì íë íšìì ì€ëšì ì ëë¬íìŒë©Ž, ê·ž ì§ì ë¶í°ë ëª ë ¹ìŽë¥Œ í ì€ì© ììží ë¶ìíŽìŒ í©ëë€. ìŽë ì¬ì©íë ëª ë ¹ìŽë¡ niì siê° ììµëë€.
niì sië 몚ë ìŽì ëžëЬ ëª ë ¹ìŽë¥Œ í ì€ ì€ííë€ë ê³µíµì ìŽ ììµëë€. ê·žë¬ë ë§ìœ call ë±ì íµíŽ ìëžë£šíŽì ížì¶íë ê²œì° nië ìëžë£šíŽì ëŽë¶ë¡ ë€ìŽê°ì§ ìì§ë§, sië ìëžë£šíŽì ëŽë¶ë¡ ë€ìŽê°ë€ë ì°šìŽì ìŽ ììµëë€. ìŽë¥Œ íìžíêž° ìíŽ ìŒëš main íšììì printf íšì륌 ížì¶íë ì§ì ê¹ì§ ì€ííê² ìµëë€.
pwndbg> b *main+57
Breakpoint 2 at 0x400520
pwndbg> c
Continuing.
Breakpoint 3, 0x0000000000400520 in main ()
...
ââââââââââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââââââââ
0x40050c <main+37> mov dword ptr [rbp - 0xc], eax
0x40050f <main+40> mov eax, dword ptr [rbp - 0xc]
0x400512 <main+43> mov esi, eax
0x400514 <main+45> lea rdi, [rip + 0x99]
0x40051b <main+52> mov eax, 0
⺠0x400520 <main+57> call printf@plt <printf@plt>
format: 0x4005b4 â— '1 + 2 = %d\\n'
vararg: 0x3
0x400525 <main+62> mov eax, 0
0x40052a <main+67> leave
0x40052b <main+68> ret
0x40052c nop dword ptr [rax]
0x400530 <__libc_csu_init> push r15
...
next instruction
ni륌 ì ë ¥í멎, ìëì ê°ìŽ printf íšì ë°ë¡ ë€ììŒë¡ ripê° ìŽëí ê²ì íìží ì ììµëë€.
pwndbg> ni
0x0000000000400525 in main ()
...
ââââââââââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââââââââ
0x40050f <main+40> mov eax, dword ptr [rbp - 0xc]
0x400512 <main+43> mov esi, eax
0x400514 <main+45> lea rdi, [rip + 0x99]
0x40051b <main+52> mov eax, 0
0x400520 <main+57> call printf@plt <printf@plt>
⺠0x400525 <main+62> mov eax, 0
0x40052a <main+67> leave
0x40052b <main+68> ret
↓
0x7ffff7a05b97 <__libc_start_main+231> mov edi, eax
0x7ffff7a05b99 <__libc_start_main+233> call exit <exit>
0x7ffff7a05b9e <__libc_start_main+238> mov rax, qword ptr [rip + 0x3ced23] <0x7ffff7dd48c8>
...
printfê° ì¶ë ¥íê³ ì íë 묞ììŽì stdoutì ë²íŒìì ì ì ëêž°í ë€ ì¶ë ¥ë©ëë€. ì¬êž°ì ë²íŒë 'ë°ìŽí°ê° 목ì ì§ë¡ ìŽëíêž° ì ì ì ì ì ì¥ëë ì¥ì'ëŒë ì믞ì
ëë€. stdoutë²íŒë í¹ì ì¡°ê±ŽìŽ ë§ì¡±ëì ëë§ ë°ìŽí°ë¥Œ 목ì ì§ë¡ ìŽëìí€ëë°, ê·ž 조걎ì ë€ì곌 ê°ìµëë€.
|
step into
printf íšì륌 ížì¶íë ì§ì ê¹ì§ ë€ì íë¡ê·žëšì ì€íìíš ë€, si륌 ì ë ¥í멎 ìëì ê°ìŽ printf íšì ëŽë¶ë¡ ripê° ìŽëí ê²ì íìží ì ììµëë€. íë¡ê·žëšì ë¶ìíë€ê°, ìŽë€ íšìì ëŽë¶ê¹ì§ ê¶êží ëë si륌, ê·žë ì§ ìì ëë ni륌 ì¬ì©í©ëë€. ì¬êž°ì ì ì contextíëšì Backtrace륌 볎멎, main íšììì printf륌 ížì¶íìŒë¯ë¡ main íšì ìì printf íšìê° ììž ê²ì 볌 ì ììµëë€.
pwndbg> si
0x00000000004003f0 in printf@plt ()
...
ââââââââââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââââââââ
⺠0x4003f0 <printf@plt> jmp qword ptr [rip + 0x200c22] <0x601018>
0x4003f6 <printf@plt+6> push 0
0x4003fb <printf@plt+11> jmp 0x4003e0 <0x4003e0>
↓
0x4003e0 push qword ptr [rip + 0x200c22] <0x601008>
0x4003e6 jmp qword ptr [rip + 0x200c24] <_dl_runtime_resolve_xsavec>
↓
0x7ffff7dec7a0 <_dl_runtime_resolve_xsavec> push rbx
0x7ffff7dec7a1 <_dl_runtime_resolve_xsavec+1> mov rbx, rsp
0x7ffff7dec7a4 <_dl_runtime_resolve_xsavec+4> and rsp, 0xffffffffffffffc0
0x7ffff7dec7a8 <_dl_runtime_resolve_xsavec+8> sub rsp, qword ptr [rip + 0x210059] <0x7ffff7ffc808>
0x7ffff7dec7af <_dl_runtime_resolve_xsavec+15> mov qword ptr [rsp], rax
0x7ffff7dec7b3 <_dl_runtime_resolve_xsavec+19> mov qword ptr [rsp + 8], rcx
...
ââââââââââââââââââââââââââââââââââ[ BACKTRACE ]âââââââââââââââââââââââââââââââââââ
⺠f 0 4003f0 printf@plt
f 1 400525 main+62
f 2 7ffff7a05b97 __libc_start_main+231
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
pwndbg>
finish
step intoë¡ íšì ëŽë¶ì ë€ìŽê°ì íìí ë¶ë¶ì 몚ë ë¶ìíëë°, íšìì ê·ëªšê° 컀ì nië¡ë ìë ì€í íëŠìŒë¡ ëìê°êž° ìŽë €ìž ì ììµëë€. ìŽëŽ ëë finishëŒë ëª ë ¹ìŽë¥Œ ì¬ì©íì¬ íšìì ëê¹ì§ í ë²ì ì€íí ì ììµëë€.
pwndbg> finish
Run till exit from #0 0x00000000004003f0 in printf@plt ()
0x0000000000400525 in main ()
...
âââââââââââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââââââââ
0x400520 <main+57> call printf@plt <printf@plt>
⺠0x400525 <main+62> mov eax, 0
0x40052a <main+67> leave
0x40052b <main+68> ret
↓
0x7ffff7a05b97 <__libc_start_main+231> mov edi, eax
0x7ffff7a05b99 <__libc_start_main+233> call exit <exit>
0x7ffff7a05b9e <__libc_start_main+238> mov rax, qword ptr [rip + 0x3ced23] <0x7ffff7dd48c8>
0x7ffff7a05ba5 <__libc_start_main+245> ror rax, 0x11
0x7ffff7a05ba9 <__libc_start_main+249> xor rax, qword ptr fs:[0x30]
0x7ffff7a05bb2 <__libc_start_main+258> call rax
0x7ffff7a05bb4 <__libc_start_main+260> mov rax, qword ptr [rip + 0x3cecfd] <0x7ffff7dd48b8>
âââââââââââââââââââââââââââââââââââ[ STACK ]ââââââââââââââââââââââââââââââââââââ
[ìëµ]
pwndbg> finishRun till exit from #0 0x00000000004003f0 in printf@plt ()0x0000000000400525 in main ()...âââââââââââââââââââââââââââââââââââ[ DISASM ]âââââââââââââââââââââââââââââââââââ 0x400520 <main+57> call printf@plt <printf@plt> ⺠0x400525 <main+62> mov eax, 0 0x40052a <main+67> leave 0x40052b <main+68> ret ↓ 0x7ffff7a05b97 <__libc_start_main+231> mov edi, eax 0x7ffff7a05b99 <__libc_start_main+233> call exit <exit> 0x7ffff7a05b9e <__libc_start_main+238> mov rax, qword ptr [rip + 0x3ced23] <0x7ffff7dd48c8> 0x7ffff7a05ba5 <__libc_start_main+245> ror rax, 0x11 0x7ffff7a05ba9 <__libc_start_main+249> xor rax, qword ptr fs:[0x30] 0x7ffff7a05bb2 <__libc_start_main+258> call rax 0x7ffff7a05bb4 <__libc_start_main+260> mov rax, qword ptr [rip + 0x3cecfd] <0x7ffff7dd48b8>âââââââââââââââââââââââââââââââââââ[ STACK ]ââââââââââââââââââââââââââââââââââââ[ìëµ]
examine
íë¡ê·žëšì ë¶ìíë€ ë³Žë©Ž ê°ì ë©ëªšëЬì 졎ì¬íë ìì 죌ìì ê°ì êŽì°°íŽìŒí ëê° ììµëë€. ìŽë¥Œ ìíŽ gdbììë Ʞ볞ì ìŒë¡ xëŒë ëª ë ¹ìŽë¥Œ ì ê³µí©ëë€. x륌 ìŽì©í멎 í¹ì 죌ììì ìíë êžžìŽë§íŒì ë°ìŽí°ë¥Œ ìíë íììŒë¡ ìžìœë©íì¬ ë³Œì ììµëë€.
Format letters are 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).
ìëë ììì ëë€.
1. rspë¶í° 80ë°ìŽížë¥Œ 8ë°ìŽížì© hexíììŒë¡ ì¶ë ¥
pwndbg> x/10gx $rsp
0x7fffffffc228: 0x00007ffff7a05b97 0x0000000000000001
0x7fffffffc238: 0x00007fffffffc308 0x0000000100008000
0x7fffffffc248: 0x00000000004004e7 0x0000000000000000
0x7fffffffc258: 0x71eb993d1f26e436 0x0000000000400400
0x7fffffffc268: 0x00007fffffffc300 0x0000000000000000
2. ripë¶í° 5ì€ì ìŽì ëžëЬ ëª ë ¹ìŽ ì¶ë ¥
pwndbg> x/5i $rip
=> 0x4004e7 <main>: push rbp
0x4004e8 <main+1>: mov rbp,rsp
0x4004eb <main+4>: sub rsp,0x10
0x4004ef <main+8>: mov DWORD PTR [rbp-0xc],0x0
0x4004f6 <main+15>: mov DWORD PTR [rbp-0x8],0x1
3. í¹ì 죌ìì 묞ììŽ ì¶ë ¥
pwndbg> x/s 0x400000
0x400000: "\177ELF\002\001\001"
gdb / python argv
run ëª ë ¹ìŽì ìžìë¡ $()ì íšê» íìŽì¬ ìœë륌 ì ë ¥í멎 ê°ì ì ë¬í ì ììµëë€. ë€ìì íìŽì¬ìì print íšì륌 íµíŽ ì¶ë ¥í ê°ì run ëª ë ¹ìŽì ìžìë¡ ì ë¬íë ëª ë ¹ìŽì ëë€.
pwndbg> tele
00:0000â rsp 0x7fffffffc228 —âž 0x7ffff7a05b97 (__libc_start_main+231) â— mov edi, eax
01:0008â 0x7fffffffc230 â— 0x1
02:0010â 0x7fffffffc238 —âž 0x7fffffffc308 —âž 0x7fffffffc557 â— '/home/dreamhack/debugee'
03:0018â 0x7fffffffc240 â— 0x100008000
04:0020â 0x7fffffffc248 —âž 0x4004e7 (main) â— push rbp
05:0028â 0x7fffffffc250 â— 0x0
06:0030â 0x7fffffffc258 â— 0x71eb993d1f26e436
07:0038â 0x7fffffffc260 —âž 0x400400 (_start) â— xor ebp, ebp
gdb / python input
ìŽì 곌 ê°ìŽ $()ì íšê» íìŽì¬ ìœë륌 ì ë ¥í멎 ê°ì ì ë ¥í ì ììµëë€. ì ë ¥ê°ìŒë¡ ì ë¬íêž° ìíŽìë '<<<' 묞ì륌 ì¬ì©í©ëë€. ë€ìì ìì ë°°ìŽ argv[1]ì ììì ê°ì ì ë¬íê³ , ê°ì ì ë ¥íë ëª ë ¹ìŽì ëë€.
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
0x400000 0x401000 r-xp 1000 0 /home/dreamhack/debugee
0x600000 0x601000 r--p 1000 0 /home/dreamhack/debugee
0x601000 0x602000 rw-p 1000 1000 /home/dreamhack/debugee
0x7ffff79e4000 0x7ffff7bcb000 r-xp 1e7000 0 /lib/x86_64-linux-gnu/libc-2.27.so
0x7ffff7bcb000 0x7ffff7dcb000 ---p 200000 1e7000 /lib/x86_64-linux-gnu/libc-2.27.so
0x7ffff7dcb000 0x7ffff7dcf000 r--p 4000 1e7000 /lib/x86_64-linux-gnu/libc-2.27.so
0x7ffff7dcf000 0x7ffff7dd1000 rw-p 2000 1eb000 /lib/x86_64-linux-gnu/libc-2.27.so
0x7ffff7dd1000 0x7ffff7dd5000 rw-p 4000 0
0x7ffff7dd5000 0x7ffff7dfc000 r-xp 27000 0 /lib/x86_64-linux-gnu/ld-2.27.so
0x7ffff7dd5000 0x7ffff7dfc000 rwxp 27000 0 <explored>
0x7ffff7fe3000 0x7ffff7fe5000 rw-p 2000 0
0x7ffff7ff7000 0x7ffff7ffa000 r--p 3000 0 [vvar]
0x7ffff7ffa000 0x7ffff7ffc000 r-xp 2000 0 [vdso]
0x7ffff7ffc000 0x7ffff7ffd000 r--p 1000 27000 /lib/x86_64-linux-gnu/ld-2.27.so
0x7ffff7ffd000 0x7ffff7ffe000 rw-p 1000 28000 /lib/x86_64-linux-gnu/ld-2.27.so
0x7ffff7ffe000 0x7ffff7fff000 rw-p 1000 0
0x7ffffffdc000 0x7ffffffff000 rw-p 23000 0 [stack]
pwndbg>
ð¡ íìŒ ë§€íìŽë?
| ìŽë€ íìŒì ë©ëªšëЬì ì ì¬íë ê²ì íìŒ ë§€íìŽëŒê³ í©ëë€. (ì ë©ëªšëЬ ë ìŽìììì /home/dreamhack/debugeeì /lib/x86_64-linux-gnu/libc-2.27.so, /lib/x86_64-linux-gnu/ld-2.27.soê° ë§€íë íìŒë€ì
ëë€.) 늬ë ì€ììë ELF륌 ì€íí ë, 뚌ì ELFì ìœëì ì¬ë¬ ë°ìŽí°ë¥Œ ê°ì ë©ëªšëЬì ë§€ííê³ , íŽë¹ ELFì ë§í¬ë ê³µì ì€ëžì íž(Shared Object, so)륌 ì¶ê°ë¡ ë©ëªšëЬì ë§€íí©ëë€. ê³µì ì€ëžì ížë ìëì°ì DLL곌 ëìëë ê°ë ìŒë¡, ì죌 ì¬ì©ëë íšìë€ì 믞늬 컎íìŒíŽë ê²ì ëë€. CìžìŽì printf, scanf ë±ìŽ ëŠ¬ë ì€ììë libc(library C)ì 구íëìŽ ììµëë€. ê³µì ì€ëžì ížì ìŽë¯ž 구íë íšì륌 ížì¶í ëë ë§€íë ë©ëªšëЬì 졎ì¬íë íšì륌 ëì ížì¶í©ëë€. |
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[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;
}
ê·ž ë€, gdb debugee2ë¡ ëë²ê¹ ì ììí©ëë€.
$ gcc -o debugee2 debugee2.c
$ gdb debugee2
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
pwndbg: loaded 193 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Reading symbols from debugee...(no debugging symbols found)...done.
pwndbg>
gdb / python argv
run ëª ë ¹ìŽì ìžìë¡ $()ì íšê» íìŽì¬ ìœë륌 ì ë ¥í멎 ê°ì ì ë¬í ì ììµëë€. ë€ìì íìŽì¬ìì print íšì륌 íµíŽ ì¶ë ¥í ê°ì run ëª ë ¹ìŽì ìžìë¡ ì ë¬íë ëª ë ¹ìŽì ëë€.
pwndbg> r $(python -c 'print "\xff"*100')
Starting program: /home/s0ngsari/a $(python -c 'print "\xff"*100')
argv[1] ????????????????????????????????????????????????????????????????????????????????????????????????????
gdb / python input
ìŽì 곌 ê°ìŽ $()ì íšê» íìŽì¬ ìœë륌 ì ë ¥í멎 ê°ì ì ë ¥í ì ììµëë€. ì ë ¥ê°ìŒë¡ ì ë¬íêž° ìíŽìë '<<<' 묞ì륌 ì¬ì©í©ëë€. ë€ìì ìì ë°°ìŽ argv[1]ì ììì ê°ì ì ë¬íê³ , ê°ì ì ë ¥íë ëª ë ¹ìŽì ëë€.
r $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"')
Starting program: /home/s0ngsari/a $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"')
argv[1] ????????????????????????????????????????????????????????????????????????????????????????????????????
Name: dreamhack
3. ììœ
ëª ë ¹ìŽ
- start: ì§ì ì ì ì€ëšì ì ì€ì íê³ , ì€í
- break(b): ì€ëšì ì€ì
- continue(c): ê³ì ì€í
- disassemble: ëì€ìŽì ëž ê²°ê³Œ ì¶ë ¥
- u, nearpc, pd: ëì€ìŽì ëž ê²°ê³Œ ê°ë ì± ì¢ê² ì¶ë ¥
- x: ë©ëªšëЬ ì¡°í
- run(r): íë¡ê·žëš ì²ìë¶í° ì€í
- context: ë ì§ì€í°, ìœë, ì€í, ë°±ížë ìŽì€ì ìí ì¶ë ¥
- nexti(ni): ëª ë ¹ìŽ ì€í, íšì ëŽë¶ë¡ë ë€ìŽê°ì§ ìì
- stepi(si): ëª ë ¹ìŽ ì€í, íšì ëŽë¶ë¡ ë€ìŽê°
- telescope(tele): ë©ëªšëЬ ì¡°í, ë©ëªšëЬê°ìŽ í¬ìží°ìŒ ê²œì° ì¬ê·ì ìŒë¡ ë°ëŒê°ë©° 몚ë ë©ëªšëŠ¬ê° ì¶ë ¥
- vmmap: ë©ëªšëЬ ë ìŽìì ì¶ë ¥
'ð 볎ì·췚ìœì > ðžìì€í ·ìŽì첎ì ' 칎í ê³ ëŠ¬ì ë€ë¥ž êž
| File Descriptor (0) | 2022.08.12 |
|---|---|
| [ubuntu] pwntools ì¬ì© ì€ìµ (0) | 2022.08.11 |
| quiz íìŒ íìŽ (0) | 2022.08.11 |
| [dreamhack] Background: Linux Memory Layout (0) | 2022.07.28 |
| [dreamhack] x86 assembly (0) | 2022.07.09 |