pwntools ์ฌ์ฉ๋ฒ
1. process & remote
- process : ์ต์คํ๋ก์์ ๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉํ๋ ํจ์ (ํ ์คํธ & ๋๋ฒ๊น ์ฉ)
- remote : ์๊ฒฉ ์๋ฒ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉ (์๋ฒ๋ฅผ ์ค์ ๊ณต๊ฒฉํ๊ธฐ ์ํจ)
from pwn import *
p = process('./test') #๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ 'test'๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ
p = remote('example.com',31337) #'example.com'์ 31337 ํฌํธ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ
2. send
- send : ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค์ ์ ์กํ๊ธฐ์ํด ์ฌ์ฉ
from pwn import *
p = process('./test')
p.send('A') # ./test์ 'A'๋ฅผ ์
๋ ฅ
p.sendline('A') # ./test์ 'A'+'\n'์ ์
๋ ฅ
p.sendafter('hello','A') # ./test๊ฐ 'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, 'A'๋ฅผ ์
๋ ฅ
p.sendlineafter('hello','A') # ./test๊ฐ 'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, 'A' + '\n'์ ์
๋ ฅ
3. recv
- recv : ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
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('hello') #p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ 'hello'๊ฐ ์ถ๋ ฅ๋ ๋๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvall() #p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ๋ฐ์์ data์ ์ ์ฅ
4. packing & unpacking
16์ง์ 2๊ฐ๋น 1byte(8bit)
๋ฆฌํ์๋์์ผ๋ก ๋ฐฐ์ด ์ถ๋ ฅ ์ํ๊ฑฐ๋(u) ๊ทธ ๋ฐ๋(p)์ผ ๋ ์ฌ์ฉ!
u32 : 4byte
u64 : 8byte
ex)
Print u64(“ABCDEFGH”)
5208208757389214273 // ์ด์ ๊ฐ์ด ์ ์๋ก ๋ณํ๋จ
// ์ด๊ฑธ hex ๋ก ๋ณ๊ฒฝํ๋ฉด 0x4142434445464748 (๋ฆฌํ์๋์)
#!/usr/bin/python3
#Name: pup.py
from pwn import *
s32 = 0x41424344
s64 = 0x4142434445464748
print(p32(s32))
print(p64(s64))
s32 = "ABCD"
s64 = "ABCDEFGH"
print(hex(u32(s32)))
print(hex(u64(s64)))
$ python3 pup.py
b'DCBA'
b'HGFEDCBA'
0x44434241
0x4847464544434241
5. interactive
์ต์คํ๋ก์์ ํน์ ์ํฉ์ ์ง์ ์ ๋ ฅ์ ์ฃผ๋ฉด์ ์ถ๋ ฅ์ ํ์ธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํจ์
from pwn import *
p = process('./test')
p.interactive()
6. ELF
ELF ํค๋์๋ ์ต์คํ๋ก์์ ํ์ฉ๋ ์ ์๋ ๊ฐ์ข ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์ด์์
pwntools๋ฅผ ์ด์ฉํด ํด๋น ์ ๋ณด ์ฝ๊ฒ ์ฐธ์กฐ ๊ฐ๋ฅ
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์ ์ ์ฅ
get_shell = elf.symbols["get_shell"] #get_shellํจ์์ ๋ฒ ์ด์ค ์ฃผ์์ offset ์ ์ฅ
7. context.log
์ต์คํ๋ก์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์ต์คํ๋ก์๋ ๋๋ฒ๊น ์ด ํ์
pwntools์ ๋ก๊น ๊ธฐ๋ฅ์ ์ด์ฉ
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์๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ ธ ์ฝ๋๋ค์ด ์ ์ฅ
#!/usr/bin/python3
#Name: shellcraft.py
from pwn import *
context.arch = 'amd64' # ๋์ ์ํคํ
์ฒ x86-64
code = shellcraft.sh() # ์
ธ์ ์คํํ๋ ์
ธ ์ฝ๋
print(code)
$ python3 shellcraft.py
/* execve(path='/bin///sh', argv=['sh'], envp=0) */
/* push b'/bin///sh\x00' */
push 0x68
mov rax, 0x732f2f2f6e69622f
...
syscall
10. asm
์ด์ ๋ธ ๊ธฐ๋ฅ ์ ๊ณต
ํด๋น ๊ธฐ๋ฅ๋ ์ํคํ ์ฒ๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ํคํ ์ฒ๋ฅผ ๋ฏธ๋ฆฌ ์ง์
#!/usr/bin/python3
#Name: asm.py
from pwn import *
context.arch = 'amd64' # ์ต์คํ๋ก์ ๋์ ์ํคํ
์ฒ 'x86-64'
code = shellcraft.sh() # ์
ธ์ ์คํํ๋ ์
ธ ์ฝ๋
code = asm(code) # ์
ธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ด์
๋ธ
print(code)
$ python3 asm.py
b'jhH\xb8/bin///sPH\x89\xe7hri\x01\x01\x814$\x01\x01\x01\x011\xf6Vj\x08^H\x01\xe6VH\x89\xe61\xd2j;X\x0f\x05'
11. ELF
binary = ELF("./ํ์ผ")
puts_plt = binary.plt['puts']
puts_got = binary.got['puts']
[์ถ์ฒ]
dreamhack ์ฌ์ดํธ