๐ ์ง๋ ์ฐจ์
1. ์ฐ์ต๋ฌธ์ ํ์ด & ๋ณต์ต
๊ฒฐ๊ณผ ํ์ธ ๋ฐฉ๋ฒ => nasm, gdb
sudo apt-get install nasm
vi ex1.asm
nasm -f elf64 ex1.asm -o ex1.o && ld ex1.o -o ex1.elf
./ex1.elf
pwndbg, Pwngdb ์ฌ์ฉ ๋ฐฉ๋ฒ:
git clone ํด์ ๋ค์ด ๋ฐ๋๋ค => pwndbg/ ๋ค์ด๊ฐ์ ./setup.sh ํด์ค๋ค => .gdbinit ํ์ผ ์์ ํด์ค๋ค. => gdb ์คํํด๋ณด๊ธฐ
source ~/pwndbg/gdbinit.py
source ~/Pwngdb/pwngdb.py
source ~/Pwngdb/angelheap/gdbinit.py
define hook-run
python
import angelheap
angelheap.init_angelheap()
end
#1. esi = 0x12345678, eax = 0x87654321์ผ๋ mov eax, DWORD PTR[esi]; $eax์ ๊ฐ์?
e๋ก ์์ํ๋ฉด 32๋นํธ ๋ ์ง์คํฐ ! 4๋ฐ์ดํธ
esi : ์ถ๋ฐ์ง ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ ์ง์คํฐ (์ธ๋ฑ์ค ๋ ์ง์คํฐ)
eax : ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํจ์ ๋ฐํ ๊ฐ์ ๋ด๋ ๋ ์ง์คํฐ (๋ฐ์ดํฐ ๋ ์ง์คํฐ)
mov [Destination] [Source] : Source์ ์๋ ๋ฐ์ดํฐ๋ฅผ Destination์ผ๋ก ์ฎ๊ธฐ๋ ๋ช ๋ น์ด
DWORD PTR[esi] : esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 4๋ฐ์ดํธ ๋งํผ ์ฐธ์กฐํ๋ค.
=> esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 4๋ฐ์ดํธ๋งํผ ์ฐธ์กฐํด์ eax ๋ ์ง์คํฐ๋ก ์ฎ๊ธด๋ค.
=> eax์๋ esi์ ์ฃผ์๊ฐ์ธ 0x12345678์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ ๋ต : 0x12345678
#2. esi = 0x12345678, eax = 0x87654321์ผ๋ mov ax, WORD PTR[esi]; $eax์ ๊ฐ์?
e๋ก ์์ํ๋ฉด 32๋นํธ ๋ ์ง์คํฐ ! 4๋ฐ์ดํธ
esi : ์ถ๋ฐ์ง ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ ์ง์คํฐ (์ธ๋ฑ์ค ๋ ์ง์คํฐ)
eax : ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํจ์ ๋ฐํ ๊ฐ์ ๋ด๋ ๋ ์ง์คํฐ (๋ฐ์ดํฐ ๋ ์ง์คํฐ)
32bit EAX > 16bit AX > 8bit AH + 8bit AL
mov [Destination] [Source] : Source์ ์๋ ๋ฐ์ดํฐ๋ฅผ Destination์ผ๋ก ์ฎ๊ธฐ๋ ๋ช ๋ น์ด
WORD PTR[esi] : esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 2๋ฐ์ดํธ ๋งํผ ์ฐธ์กฐํ๋ค.
=> esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 2๋ฐ์ดํธ๋งํผ ์ฐธ์กฐํด์ ax๋ก ์ฎ๊ธด๋ค.
=> ax์๋ esi ํฌ์ธํฐ์ ์ฃผ์๊ฐ์ธ 0x12345678์์ 2๋ฐ์ดํธ๋งํผ์ธ 0x5678์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
=> ๊ทธ๋ผ eax๋ 0x87655678๊ฐ ๋๋ค.
์ ๋ต : 0x87655678
#3. esi = 0x12345678, eax = 0x87654321์ผ๋ mov ah, BYTE PTR[esi]; $eax์ ๊ฐ์?
e๋ก ์์ํ๋ฉด 32๋นํธ ๋ ์ง์คํฐ ! 4๋ฐ์ดํธ
esi : ์ถ๋ฐ์ง ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ ์ง์คํฐ (์ธ๋ฑ์ค ๋ ์ง์คํฐ)
eax : ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํจ์ ๋ฐํ ๊ฐ์ ๋ด๋ ๋ ์ง์คํฐ (๋ฐ์ดํฐ ๋ ์ง์คํฐ)
32bit EAX > 16bit AX > 8bit AH + 8bit AL
mov [Destination] [Source] : Source์ ์๋ ๋ฐ์ดํฐ๋ฅผ Destination์ผ๋ก ์ฎ๊ธฐ๋ ๋ช ๋ น์ด
BYTE PTR[esi] : esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 1๋ฐ์ดํธ ๋งํผ ์ฐธ์กฐํ๋ค.
=> esi ํฌ์ธํฐ ์ฃผ์๊ฐ์ 1๋ฐ์ดํธ๋งํผ ์ฐธ์กฐํด์ ah๋ก ์ฎ๊ธด๋ค.
=> ah์๋ esi ํฌ์ธํฐ์ ์ฃผ์๊ฐ์ธ 0x12345678์์ 1๋ฐ์ดํธ๋งํผ์ธ 0x78์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
=> ๊ทธ๋ผ eax๋ 0x87657821๊ฐ ๋๋ค.
์ ๋ต : 0x87657821
#4. MOV AL, 100; ADD AL, 100; CMP AX, 200; ๋ช ๋ น์ ์ํ ํ ์ํ ๋ ์ง์คํฐ์ ๊ฒฐ๊ณผ๋? CF=?, ZF=?
mov [Destination] [Source] : Source์ ์๋ ๋ฐ์ดํฐ๋ฅผ Destination์ผ๋ก ์ฎ๊ธฐ๋ ๋ช ๋ น์ด
add [OPR1] [OPR2] : OPR2์ ๊ฐ์ OPR1 ๊ฐ์ ๋ํด OPR1์ ์ ์ฅcmp [VAR1] [VAR2] : VAR1๊ณผ VAR2๋ฅผ ๋น๊ตํ๋ค.CF๋ ์ฌ๋ฆผ ๋น๋ฆผ ๋ฐ์์ 1, ZF๋ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด 1VAR1 < VAR2 : CF=1, ZF=0
VAR1==VAR2 : CF=0, ZF=1
VAR1 > VAR2 : CF=0, ZF=0
32bit EAX > 16bit AX > 8bit AH + 8bit AL
=> al์ 100์ ๋ฃ๊ณ , al์ 100์ ๋ํด์ ์ ์ฅํ๋ฉด al์ 200์ด ๋๋ค.
=> al์ 8๋นํธ์ด๊ณ , 200์ 2์ง์๋ก ํํํ๋ฉด 1011 0010 ์ด๋ค.
CF ์ฌ๋ฆผ์ด ๋ฐ์ํ์ง ์๋๋ค. CF=0
๋ง์ฝ add al, 200; ์ด๋ผ๊ณ ํด๋ณด์.
al์ 300์ด ๋์ด 8๋นํธ๋ก ํํํ ์ ์๋ ์ต๋๊ฐ 255๋ฅผ ์ด๊ณผํ๊ฒ ๋๋ค.
255 : 1111 1111
300 : 0001 0010 1100
์ด๋ด ๊ฒฝ์ฐ CF ์ฌ๋ฆผ์ด ๋ฐ์ํ์ฌ CF๋ 1๋ก ์ค์ ๋๋ค.
=> ax๋ 16๋นํธ์ด๊ณ , ax๋ 200์ด๋ค.
=> cmp ax, 200 ํ๋ฉด ax์์ 200์ ๋นผ์ ๋น๊ตํ๊ฒ ๋๋๋ฐ 200-200=0์ด๋ฏ๋ก ZF๊ฐ 1๋ก ์ค์ ๋๋ค.
์ ๋ต : CF=0, ZF=1
2. GDB ์ฌ์ฉ๋ฒ
- ๋๋ฒ๊น (debugging)์ด๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ค์ ๋ฐ์ํ๋ ์์คํ ์ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ ๋น์ ์์ ์ฐ์ฐ์ ์ฐพ์๋ด๊ณ ๊ทธ ์์ธ์ ๋ฐํ๊ณ ์์ ํ๋ ์์ ๊ณผ์ ์ด๋ค.
- ๋๋ฒ๊ฑฐ๋ ๋์ ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ณ Debugํ๋๋ฐ ์ฐ์ด๋ ๋๊ตฌ(ํ๋ก๊ทธ๋จ)
ํ์ผ ์คํ
: gdb -q "ํ์ผ๋ช "
ํจ์ ๋์ค์ด์ ๋ธ
: disassemble main ( mainํจ์์ ๊ธฐ๊ณ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฐ๊พผ๋ค. )
AT&T -> intel
: set disassembly-flavor intel
๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ธฐ
: b*main ( ์ฌ๋ณผ์ด ์์ ๋ )
: b*0x04005bd ( ํน์ ์ฃผ์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ธฐ )
๋ธ๋ ์ดํฌ ํฌ์ธํธ ์ญ์
: delete
: delete "๋ฒํธ"
์คํํ๊ธฐ
: r
: r arg1 arg2 ... ( ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ )
: continue ( ๋ค์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๊น์ง ์คํ )
: ni (ํ ์คํ ์ฉ ์คํ step over)
: si ( step into ) ํจ์๋ฅผ ๋ง๋๋ฉด ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ
์ข ๋ฃํ๊ธฐ
: q or k
์ ๋ณดํ์ธ
: info reg ( ๋ ์ง์คํฐ ์ ๋ณด ํ์ธ )
: info break ( ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑด ์์น ํ์ธ )
์คํ์ค์ธ ํ๋ก์ธ์ค gdb์ ๋ถ์ด๋ ๋ฒ
: at
๊ธฐํ ๊ฟํ
: finish ( ํ์ฌ ํจ์ ์ข ๋ฃ )
: stack [์ซ์] ( ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ฐ ํ์ธ ๊ฐ๋ฅ )
: libc, pie, ld, heap, code, got
: vmmap ( ๋ฉ๋ชจ๋ฆฌ๋งต ํ์ธ )
: p [name], p [register] ( printํด์ค, ๋ ์ง์คํฐ์๋ $๋ฅผ ๋ถ์ฌ์ ์ฐ๊ธฐ )
: bt ( back trace, ์ด์ ์ ์คํ๋ ํจ์๋ค ์ถ์ )
: set [ํ์ ] [์ฃผ์] ( ๊ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํน์ ์ฃผ์์ ๊ฐ ์ ์ฅ ๊ฐ๋ฅ )
: magic ( ํจ์ ์คํ์ ํ์ธ ๊ฐ๋ฅ )
3. IDA
IDA๊ฐ ์ด์ ๋ธ๋ฆฌ๋ฅผ C ์ฝ๋๋ก ๋ฐ๊ฟ์ค๋ค.
1. ์ค์น
IDA Freeware
IDA Freeware The free binary code analysis tool to kickstart your reverse engineering experience.
hex-rays.com
2. ์ฌ์ฉ๋ฒ
๋ํ์ ๋จ์ถํค
F5 : Hey-ray ๋์ปดํ์ผ
x : ํธ์ถ๋๋ ํจ์๋ค ํ์ธ ๊ฐ๋ฅ
Shift + F12 : ๋ฌธ์์ด ๊ฒ์ ์ฐฝ
n : ํจ์๋ ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ ๊ฐ๋ฅ
g : ํน์ ์ฃผ์๋ก ์ด๋
4. Pwntools
Python2,3 Module
CTF์ ์ต์คํ๋ก์ ๊ฐ๋ฐ์ ์ํ ํ๋ ์์ํฌ, ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊นํ๋ธ - GitHub - Gallopsled/pwntools: CTF framework and exploit development library
๊ณต์๋ฌธ์ - pwntools — pwntools 4.8.0 documentation
์ฌ์ฉ๋ฐฉ๋ฒ - 4. pwntools ์ ๋ฆฌ : ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ (naver.com)
์ฌ์ฉ์ด์ )
- ๋ง์ ์์ ์ ์ถ๋ ฅ ๋์์ ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์
- Unprintable ASCII ๋ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์
- Exploit์ ๋์๋๋ Util๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด
์ฌ์ฉ๋ฐฉ๋ฒ )
from pwn import *
๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ๋ฒ์ ๊ตฌ๊ธ๋ง์ ํตํด ์์๋ณด์ !
๋ฌธ์ ํ์ด : using_pwntools1
๋ค์๊ณผ ๊ฐ์ด a,b ์ฐ์ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ ๋ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค. a, b ๊ฐ์ ์๋์ผ๋ก ๊ฐ์ ธ์์ ๊ณ์ฐํ์ฌ ๊ฐ์ ๋ฃ์ด์ค์ผํ๋ค.
pwntools๋ฅผ ์ด์ฉํ์ฌ ์๋ํ ํด๋ณด์.
from pwn import *
context.log_level='debug'
p = remote('141.164.39.45', 18733)
p.recvuntil(b'a=')
a = int(p.recvline().strip())
print('a : {}'.format(a))
p.recvuntil(b'b=')
b = int(p.recvline().strip())
print('b : {}'.format(b))
p.interactive()
a, b ๊ฐ์ ์์๋๋ค. ์ด์ ๋ถํธ๋ฅผ ์์๋ด์ ์ฐ์ฐํ๋ ์ต์ข ์ต์คํ๋ก์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
from pwn import *
context.log_level = 'debug'
p = remote('sung.pw',13332)
try:
for i in range(100):
p.recvuntil(b'a=')
a = int(p.recvline().strip())
print('a : {}'.format(a))
p.recvuntil(b'b=')
b = int(p.recvline().strip())
print('b : {}'.format(b))
p.recvuntil(b'a ')
cal = p.recv(1) # + -
print(cal)
if cal == b'+':
p.sendlineafter(b'= ', str(a + b).encode())
elif cal == b'-':
p.sendlineafter(b'= ', str(a - b).encode())
except:
p.interactive()
p.interactive()
๋ฌธ์ ํ์ด : using_pwntools2
์ฐ์ฐ์ด ๋ ๋ค์ํด์ก๊ณ , a, b๋ณ์๊ฐ ์ฌ๋ผ์ก๋ค.
python์ eval()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋ณด์.
eval("2+3") = 5
eval() ํจ์์์ ํํ์์ ๋ฃ์ผ๋ฉด ์ฐ์ฐํด์ฃผ๋ ํจ์์ด๋ค.
' = ' ์ ๊น์ง ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด ์ ์ฒด๋ฅผ eval()์ ๋ฃ์ด์ ๊ณ์ฐํ์.
from pwn import *
context.log_level='debug'
p = remote('141.164.39.45', 18734)
p.recvline()
p.recvline()
try:
for i in range(100):
p.recvline()
s = p.recvuntil(b' = ').strip().strip(b'=')
print('s : {}'.format(s))
code = compile(s,'', 'eval')
out = eval(code)
print('out : {}'.format(out))
p.sendline(str(out).encode())
except:
p.interactive()
p.interactive()
์ ๊ฒฝ์จ์ผ ํ ๋ถ๋ถ์ python3 ํน์ง์ด binary ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ผํ๋ค๋ ๊ฒ์ด๋ค.
out์ด intํ์ด๋ผ์ p.sendline(out) ์ด๋ ๊ฒ ๊ณ์ ๋ณด๋ด๋ค๊ฐ str(out).encode()ํด์ฃผ๋๊น ์ ์ ๋ฌ๋๋ค.
โญ๊ณต๋ถํ ๊ฒ๋ค
1. IDA ์ฌ์ฉ๋ฒ
2. pwntools ์ฌ์ฉ๋ฒ