https://github.com/Gallopsled/pwntools
pwntools๋ ํ์ด์ฌ์ผ๋ก ์ต์คํ๋ก์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ๋ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ ํจ์๋ค์ ๋ชจ์๋ ๊ฒ์ด๋ค.
(ex. ์ ์๋ฅผ ๋ฆฌํ ์๋์ธ์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ฐ๊พธ๋ ํจํน ํจ์, ๊ทธ ์ญ์ ์ํํ๋ ์ธํจํน ํจ์ ๋ฑ
์ค์น ๋ฐฉ๋ฒ์ ๊นํ๋ธ์ ๊ฐ์ด๋๋๋ก ์งํํ๋ฉด ๋๋ค.
sudo apt-get update
sudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools
ํ์ด์ฌ์ ์คํํ ๋ค from pwn import * ๋ฅผ ํ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ฉด ์ ๋๋ก ์ค์น๋ ๊ฒ์ด๋ค.
pwntools์ ๊ณต์ ๋ฌธ์๋ ์๋๋งํฌ์์ ํ์ธํ ์ ์๋ค.
https://docs.pwntools.com/en/latest/
1. process & remote
process ํจ์๋ ์ต์คํ๋ก์์ ๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉํ๋ ํจ์์ด๊ณ , remote ํจ์๋ ์๊ฒฉ ์๋ฒ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค. ์ ์๋ ๋ณดํต ์ต์คํ๋ก์์ ํ ์คํธํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํด, ๊ทธ๋ฆฌ๊ณ ํ์๋ ๋์ ์๋ฒ๋ฅผ ์ค์ ๋ก ๊ณต๊ฒฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
2. send
send ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค์ ์ ์กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์ด๋ b'๋ฅผ ์์ ์ฐ๋ ๊ฒ์ ๋ฌธ์์ด์ ๋ฐ์ดํธ ๋ฌธ์์ด๋ก ํ์ํ๊ธฐ ์ํด์์ด๋ค. ํ์ด์ฌ์์๋ ๋ฌธ์์ด์ ์ผ๋ฐ์ ์ผ๋ก str ํ์ ์ผ๋ก ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋ํ๋ด์ง๋ง, ๋คํธ์ํฌ ํต์ , ํ์ผ ์ ์ถ๋ ฅ ๋ฑ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ๋ฐ์ดํธ ๋จ์๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
from pwn import *
p = process('./test')
p.send(b'A') # ./test์ b'A'๋ฅผ ์
๋ ฅ
p.sendline(b'A') # ./test์ b'A' + b'\n'์ ์
๋ ฅ
p.sendafter(b'hello', b'A') # ./test๊ฐ b'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, b'A'๋ฅผ ์
๋ ฅ
p.sendlineafter(b'hello', b'A') # ./test๊ฐ b'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, b'A' + b'\n'์ ์
๋ ฅ
3. recv
recv๋ ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
recv(n)์ ์ต๋ n ๋ฐ์ดํธ๋ฅผ ๋ฐ๋ ๊ฒ์ด๋ฏ๋ก, ๊ทธ๋งํผ์ ๋ฐ์ง ๋ชปํด๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ง๋ง, recvn(n)์ ๊ฒฝ์ฐ ์ ํํ n ๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด ๊ณ์ ๊ธฐ๋ค๋ฆฐ๋ค.
from pwn import *
p = process('./test')
data = p.recv(1024) # p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ์ต๋ 1024๋ฐ์ดํธ๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvline() # p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐํ๋ฌธ์๋ฅผ ๋ง๋ ๋๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvn(5) # p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ 5๋ฐ์ดํธ๋ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvuntil(b'hello') # p๊ฐ b'hello'๋ฅผ ์ถ๋ ฅํ ๋๊น์ง ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ data์ ์ ์ฅ
data = p.recvall() # p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ๋ฐ์์ data์ ์ ์ฅ
4. packing & unpacking
์ต์คํ๋ก์์ ์์ฑํ๋ค ๋ณด๋ฉด ์ด๋ค ๊ฐ์ ๋ฆฌํ ์๋์ธ์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํ๊ฑฐ๋, ๋๋ ์ญ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ฃผ ์๋ค. pwntools์๋ ๊ด๋ จ๋ ํจ์๋ค์ด ์ ์๋์ด ์๋ค.
#!/usr/bin/env python3
# Name: pup.py
from pwn import *
s32 = 0x41424344 #ABCD
s64 = 0x4142434445464748 #ABCDEFGH
#16์ง์ -> ๋ฆฌํ ์๋์ธ ํ์์ ๋ฐ์ดํธ ๋ฌธ์์ด๋ก ๋ณํ
print(p32(s32))
print(p64(s64))
s32 = b"ABCD"
s64 = b"ABCDEFGH"
# ๋ฐ์ดํธ ๋ฌธ์์ด -> ๊ฐ๊ฐ 32๋นํธ ๋ฐ 64๋นํธ ์ ์๋ก ๋ค์ ๋ณํํ ํ 16์ง์๋ก ๋ณํ
print(hex(u32(s32)))
print(hex(u64(s64)))
5. interactive
์ ธ์ ํ๋ํ๊ฑฐ๋, ์ต์คํ๋ก์์ ํน์ ์ํฉ์ ์ง์ ์ ๋ ฅ์ ์ฃผ๋ฉด์ ์ถ๋ ฅ์ ํ์ธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํจ์dl๋ค.
ํธ์ถํ๊ณ ๋๋ฉด ํฐ๋ฏธ๋๋ก ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ , ํ๋ก์ธ์ค์ ์ถ๋ ฅ์ ํ์ธํ ์ ์๋ค.
from pwn import *
p = process('./test')
p.interactive()
6. ELF
ELF ํค๋์๋ ์ต์คํ๋ก์์ ์ฌ์ฉ๋ ์ ์๋ ๊ฐ์ข ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์ด ์๋ค.
from pwn import *
e = ELF('./test')
puts_plt = e.plt['puts'] # ./test์์ puts()์ PLT์ฃผ์๋ฅผ ์ฐพ์์ puts_plt์ ์ ์ฅ
read_got = e.got['read'] # ./test์์ read()์ GOT์ฃผ์๋ฅผ ์ฐพ์์ read_got์ ์ ์ฅ
7. context.log
์ต์คํ๋ก์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ฉด ์ต์คํ๋ก์๋ ๋๋ฒ๊น ํด์ผ ํ๋ค.
pwntools์๋ ๋๋ฒ๊ทธ์ ํธ์๋ฅผ ๋๋ ๋ก๊น ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ, ๋ก๊ทธ ๋ ๋ฒจ์ context.log_level ๋ณ์๋ก ์กฐ์ ํ ์ ์๋ค.
from pwn import *
context.log_level = 'error' # ์๋ฌ๋ง ์ถ๋ ฅ
context.log_level = 'debug' # ๋์ ํ๋ก์ธ์ค์ ์ต์คํ๋ก์๊ฐ์ ์ค๊ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ
context.log_level = 'info' # ๋น๊ต์ ์ค์ํ ์ ๋ณด๋ค๋ง ์ถ๋ ฅ
8. context.arch
pwntools๋ ์ ธ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋, ์ฝ๋๋ฅผ ์ด์ ๋ธ, ๋์ค์ด์ ๋ธํ๋ ๊ธฐ๋ฅ ๋ฑ์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ค์ ๊ณต๊ฒฉ ๋์์ ์ํคํ ์ฒ์ ์ํฅ์ ๋ฐ๋๋ค. ๊ทธ๋์ pwntools๋ ์ํคํ ์ฒ ์ ๋ณด๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํ ์ ์๊ฒ ํ๋ฉฐ, ์ด ๊ฐ์ ๋ฐ๋ผ ๋ช๋ช ํจ์๋ค์ ๋์์ด ๋ฌ๋ผ๋ค.
from pwn import *
context.arch = "amd64" # x86-64 ์ํคํ
์ฒ
context.arch = "i386" # x86 ์ํคํ
์ฒ
context.arch = "arm" # arm ์ํคํ
์ฒ
9. shellcraft
pwntools์๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ ธ ์ฝ๋๋ค์ด ์ ์ฅ๋์ด ์์ด์, ๊ณต๊ฒฉ์ ํ์ํ ์ ธ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊บผ๋ด ์ธ ์ ์๊ฒ ํด์ค๋ค.
๋งค์ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง ์ ์ ์ผ๋ก ์์ฑ๋ ์ ธ ์ฝ๋๋ ์ ธ ์ฝ๋๊ฐ ์คํ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๋ฐ์ํ์ง ๋ชปํ๋ค. ๋ํ, ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ ์ ๋ ฅํ ์ ์๋ ์ ธ ์ฝ๋์ ๊ธธ์ด๋, ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฌธ์์ ์ข ๋ฅ์ ์ ํ์ด ์์ ์ ์๋๋ฐ, ์ด๋ฐ ์กฐ๊ฑด๋ค๋ ๋ฐ์ํ๊ธฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ๋ ์ํฉ์์๋ ์ง์ ์ ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
์ฌ๊ธฐ์์ x86-64๋ฅผ ๋์์ผ๋ก ์์ฑํ ์ ์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ ธ ์ฝ๋๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค.
10. asm
pwntools๋ ์ด์ ๋ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฅ๋ ๋์ ์ํคํ ์ฒ๊ฐ ์ค์ํ๋ฏ๋ก, ์ํคํ ์ฒ๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํด์ผ ํ๋ค.
#!/usr/bin/env python3
# Name: asm.py
from pwn import *
context.arch = 'amd64' # ์ต์คํ๋ก์ ๋์ ์ํคํ
์ฒ 'x86-64'
code = shellcraft.sh() # ์
ธ์ ์คํํ๋ ์
ธ ์ฝ๋
code = asm(code) # ์
ธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ด์
๋ธ
print(code)
[์ฐธ๊ณ ] https://learn.dreamhack.io/59