pwntools์ ๊ฐ๋จ ์ค๋ช
ํ์ ๋ฐฐ๊ฒฝ๊ณผ ์ค์น ๋ฐฉ๋ฒ
์ง๋ ์๊ฐ์ ํ์ด์ฌ๊ณผ ํ์ดํ(|)๋ฅผ ํตํด ๊ฐ๋จํ ์คํ ์ค๋ฒํ๋ก์ฐ ์ต์คํ๋ก์์ ํ์ฃ
ํ์ด์ฌ์ผ๋ก ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ณ , ํ์ดํ๋ฅผ ํตํด ์ด๋ฅผ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ์ฃ
๊ทธ๋ฌ๋ ์ต์คํ๋ก์์ด ์ข๋ง ๋ณต์กํด๋ ์ ๋ฐฉ๋ฒ์ ์ด์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ํ์ด๋ก๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ณต์กํ ์ฐ์ฐ๊ณผ ํ๋ก์ธ์ค์ ๋ฐ๋ณต์ ๋ฐ์ดํฐ ์ก์์ ์ด ๊ฐ๋ฅํด์ผ์ฃ
๊ทธ๋์ ํด์ปค๋ค์ perl, python c์ธ์ด ๋ฑ์ผ๋ก ์ต์คํ๋ก์ ์คํฌ๋ฆฝํธ, ๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ ์ํด ์ฌ์ฉํ์ฃ
๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ฐ์๋ฉด ๋ผ์
ํ์ด์ฌ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ์ต์คํ๋ก์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค ๋ณด๋ฉด, ์์ฃผ ์ฌ์ฉํ๊ฒ ๋ ํจ์๊ฐ ์์ฃ
์๋ก ๋ฆฌํ ์๋์์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ฐ๊พธ๋ ํจํน ํจ์, ๋๋ ๊ทธ ์ญ์ ์ํํ๋ ์ธํจํน ํจ์ ๋ฑ์ด์ฃ
์ต์คํ๋ก์ ๊ณผ์ ์์ ๊ฑฐ์ ํญ์ ํ์ํ๋ฉฐ ์ง๋ ์ ๋ฆฌ์์ get_shell()์ ํจ์์ ์ฃผ์๋ฅผ
๋ฆฌํ ์๋์์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ด์
์ด๋ฐ ํจ์๋ค์ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ ๊ฒ์ ๋นํจ์จ์ด๊ธฐ์ ์ด๊ฒ์ ์ง๋์ฑํ์ฌ pwntools๋ผ๋ ํ์ด์ฌ ๋ชจ๋ ํ์!
pwntools๋๋ถ์ ์ต์คํ๋ก์์ ํจ์จ ๋ฐ ๋์ด๋ ๋ฑ ์ฌ๋ฌ ์ด์ ์ด ์๊ฒผ์ผ๋๊น ์ด๋ ์ ๋ ์์์ผ์ฃ
PwnTools ์ค์น ๋ฐฉ๋ฒ
pwntools๋ github์ ์คํ ์์ค๋ก ๊ณต๊ฐ๋์ด ์์ผ๋ฉฐ, ํด๋น ํ์ด์ง์ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐ๋ ํด๋ณด์ธ์
pwntools ์ค์น
apt-get update
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
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด pwntools๋ฅผ import ํ์ ๋, ์๋ฌ๊ฐ ์ ๋๋ฉด ๋ผ์
pwntools API ์ค๋ช
๋ค์ํ API ์ ๊ณต์ ๋ํ ๊ธฐ๋ฅ ์ค๋ช
pwntools์ ๊ณต์ ๋งค๋ด์ผ์ ํ์ฌ ๋ฌธ์ํ๊ฐ ์ ๋์ด ์๊ธฐ์ ์์ผ๋ก ์ ์ฌ์ฉ๋ ํจ์๋ค๋ง ๊ฐ๋ตํ ์๊ฐํ๋ฉด โ ๋ฐ์ test๋ ์์์ ๋ฐ์ด๋๋ฆฌ์ด๋ฉฐ, process๊ฐ์ฒด๋ฅผ ๋์์ ์ฌ์ฉํ ๋ชจ๋ ํจ์๋ remote๋ ๊ฐ๋ฅ
process & remote
processํจ์๋ ์ต์คํ๋ก์์ ๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋์ ํ ๋ ์ฌ์ฉํ๋ ํจ์,
remoteํจ์๋ ์๊ฒฉ ์๋ฒ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉํ๋ ํจ์
#!/usr/bin/python3
from pwn import *
#local ๋ฐ์ด๋๋ฆฌ './test'๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ
p = process('./test')
# 'example.com'์ 31337 ํฌํธ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค ๋์์ผ๋ก ํ๋ก์ธ์ค ํ ์ ์์
p = remote('example.com', 31337)
์ ์๋ ๋ณดํต ์ต์คํ๋ก์์ ํ ์คํธํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํด์, ํ์๋ ๋์ ์๋ฒ๋ฅผ ์ค์ ๋ก ๊ณต๊ฒฉํ๊ธฐ ์ํด ์ฌ์ฉ
send
send๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค์ ์ ์กํ๊ธฐ ์ํด ์ฌ์ฉ
#!/usr/bin/python3
from pwn import *
p = process('./test')
# ./test์ 'A'๋ฅผ ์
๋ ฅ
p.send('A')
# ./test์ 'A'+'\n'์ ์
๋ ฅ
p.sendline('A')
# ./test๊ฐ 'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, 'A'๋ฅผ ์
๋ ฅ
p.sendafter('hello', 'A')
# ./test๊ฐ 'hello'๋ฅผ ์ถ๋ ฅํ๋ฉด, 'A'+'\n'์ ์
๋ ฅ
p.sendlineafter('hello', 'A')
pwntools์ ๊ด๋ จ๋ ๋ค์ํ ํจ์๊ฐ ์ ์๋จ
recv
recv๋ ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ํ ํจ์๊ฐ ์ ์๋๋ฉฐ, ๋ฐ์ ์ฃผ์ํด์ ๋ด์ผ ํ ๊ฒ์
recv() ์ recvn()์ ์ฐจ์ด์ ์ด๋ฉฐ, ๋๋จธ์ง๋ ๋ฐ๋ก ์์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
#!/usr/bin/python3
from pwn import *
p = process('./test')
#p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ์ต๋ 1024byte๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recv(1024)
#p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐํ๋ฌธ์๋ฅผ ๋ง๋ ๋๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvline()
#p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ 5byte๋ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvn(5)
#p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ 'hello'๊ฐ ์ถ๋ ฅ๋ ๋๊น์ง ๋ฐ์์ data์ ์ ์ฅ
data = p.recvuntil('hello')
#p๊ฐ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ๋ฐ์์ data์ ์ ์ฅ
data = p.recvall()
recv(n)์ ์ต๋ n ๋ฐ์ดํธ๋ฅผ ๋ฐ๋ ๊ฒ์ด๋ผ, ๊ทธ๋งํผ ๋ชป ๋ฐ์๋ ์๋ฌ X
recvn(n)์ ๊ฒฝ์ฐ ์ ํํ n ๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด ๊ณ์ ๊ธฐ๋ค๋ฆผ
packing & unpacking
์ต์คํ๋ก์์ ์์ฑํ๋ค ๋ณด๋ฉด ์ด๋ค ๊ฐ์ ๋ฆฌํ ์๋์์ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝ ํน์,
๊ทธ ๊ณผ์ ์ ์ญ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ ๋น๋ ↑
#!/usr/bin/python3
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)))
interactive
์ ธ์ ํ๋ํ๊ฑฐ๋, ์ต์คํ๋ก์์ ํน์ ์ํฉ์ ์ง์ ์ ๋ ฅ์ ์ฃผ๋ฉฐ, ๊ฐ์ ํ์ธ ์ ์ฌ์ฉ
ํธ์ถ๋๊ณ ๋๋ฉด ํฐ๋ฏธ๋๋ก ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ , ํ๋ก์ธ์ค์ ์ถ๋ ฅํจ
#!/usr/bin/python3
from pwn import *
p = process('./test')
p.interactive()
ELF
์ต์คํ๋ก์์ ์ฌ์ฉ๋ ๊ฐ์ข ์ ๋ณด๊ฐ ๊ธฐ๋ก๋จ!!
pwntools๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ฐธ์กฐ ๊ฐ๋ฅ ๋ฐ ์ฌ์ง์ plt์ got์ ๋์ค์ ์์ธํ..
#!/usr/bin/python3
from pwn import *
e = ELF('./test')
# ./test์์ puts()์ PLT์ฃผ์๋ฅผ ์ฐพ์์ puts_plt์ ์ ์ฅ
puts_plt = e.plt['plts']
# ./test์์ read()์ GOT์ฃผ์๋ฅผ ์ฐพ์์ rea_got์ ์ ์ฅ
read_got = e.got['read']
context.log
์ต์คํ๋ก์๋ ๋ฒ๊ทธ ๋ฐ์ ์ ๋๋ฒ๊ทธ๋ฅผ ํด์ผ ํ๋ฏ๋ก ์ง์ํ ๋ชจ๋
log๋ฅผ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ณผ ์ ์์
#!/usr/bin/python3
from pwn import *
#์๋ฌ๋ง ์ถ๋ ฅ
context.log_level = 'error'
#๋์ ํ๋ก์ธ์ค์ ์ต์คํ๋ก์๊ฐ์ ์ค๊ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ
context.log_level = 'debug'
#๋น๊ต์ ์ค์ํ ์ ๋ณด๋ค๋ง ์ถ๋ ฅ
context.log_level = 'info'
context.arch
pwntools๋ ์ ธ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋, ์ฝ๋๋ฅผ ์ด์ ๋ธ, ๋์ค์ด์ ๋ธํ๋ ๊ธฐ๋ฅ ๋ฑ์ ์ง๋๋ฉฐ,
์ด๋ค์ ๊ณต๊ฒฉ ๋์์ ์ํคํ ์ฒ์ ์ํฅ์ ๋ฐ์ต๋๋ค.
#!/usr/bin/python3
from pwn import *
# x86-64 ์ํคํ
์ฒ
context.arch = "amd64"
# x86 ์ํคํ
์ฒ
context.arch = "i386"
# arm ์ํคํ
์ฒ
context.arch = "arm"
pwntools๋ ์ํคํ ์ฒ ์ ๋ณด๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํด ์ด ๊ฐ์ ๋ฐ๋ผ ๋ช๋ช ํจ์๋ค์ ๋์ ๋ณํ๋จ
shellcraft
pwntools์๋ ์์ฃผ ์ฌ์ฉ๋๋ ์ ธ ์ฝ๋๋ค์ด ์ ์ฅ๋์ด ์์ด, ๊ณต๊ฒฉ์ ํ์ํ ์ ธ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
๋งค์ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง ์ ์ ์ผ๋ก ์์ฑ๋ ์ ธ ์ฝ๋๋ ์ ธ ์ฝ๋ ์คํ ์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๋ฐ์ X
#!/usr/bin/python3
from pwn import *
#๋์ ์ํคํ
์ฒ x86-64
context.arch = 'amd64'
#์
ธ์ ์คํํ๋ ์
ธ ์ฝ๋
code = shellcraft.sh()
print(code)
๋ํ, ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ ์ ๋ ฅํ ์ ์๋ ์ ธ ์ฝ๋์ ๊ธธ์ด๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฌธ์์ ์ข ๋ฅ ์ ํ์ด ์์ ์ ์์
์ด๋ฐ ์กฐ๊ฑด๋ค๋ก ๋ฐ์ํ๊ธฐ ์ด๋ ต๊ธฐ์ ๋ฐ๋ผ์ ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ๋ ์ํฉ์์๋ ์ง์ ์ ธ ์ฝ๋ ์์ฑ ์ถ์ฒ!
์ฌ๊ธฐ์์ x86-64(x64)๋ฅผ ๋์์ผ๋ก ์์ฑํ ์ ์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ ธ ์ฝ๋ ํ์ํด๋ด์
asm
pwntools๋ ์ด์ ๋ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ด ๊ธฐ๋ฅ๋ ๋์ ์ํคํ ์ฒ๊ฐ ์ค์ํ๋ฏ๋ก ๋ฏธ๋ฆฌ ์ง์ ํด์ผ ํจ
#!/usr/bin/python3
from pwn import *
#์ต์คํ๋ก์ ๋์ ์ํคํ
์ฒ 'x86-64'
context.arch = 'amd64'
#์
ธ์ ์คํํ๋ ์
ธ ์ฝ๋
code = shellcreft.sh()
#์
ธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ด์
๋ธ
code = asm(code)
print(code)
pwntools ์ค์ต
rao ์ต์คํ๋ก์(์์ ์ฝ๋) ์ฐ์ต
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
printf("Input: ");
scanf("%s", buf);
return 0;
}
ํด๋น PC์ ๋ฐ๋ผ ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ์์น๊ฐ ๋น์ฐํ ๋ค๋ฅด๋ฏ๋ก
๊ฐ์ ๋ฐ๋ก ์ฐพ์๋ด์ ๋ฃ์ด์ผ ํจ ๊ณ ๋ก ์์ธํ ๋ด์ฉ์ ๋์ค์ ๋ฃ์๊ฒ์ ใ
๊ฒฐ๊ณผ๋ ๋ฐ์์ฒ๋ผ ๋์ค๋ ๊ฑฐ์์
์์ฝ
pwntools์ ์ฌ์ฉ๋ฒ์ ๊ฐ๋ตํ ์ดํด๋ณด๋ฉฐ, pwntools๋ก rao๋ฅผ ๋ค์ ์ต์คํ๋ก์ํด๋ดค์ด์.
์ ๋ ์ต์ํ์ง ์์ง๋ง ์์ฃผ ํด๋ด์ผ๊ฒ ์ฃ ใ ๋ค์์ ์ ๋ฆฌํ pwntools์ ๊ธฐ๋ฅ์ด์์
- process & remote: ๋ก์ปฌ ํ๋ก์ธ์ค ๋๋ ์๊ฒฉ ์๋ฒ์ ์๋น์ค๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ
- send & recv: ๋ฐ์ดํฐ ์ก์์
- packing & unpacking: ์ ์๋ฅผ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก, ๋๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ ์๋ก ๋ณํ
- interactive: ํ๋ก์ธ์ค ๋๋ ์๋ฒ์ ํฐ๋ฏธ๋๋ก ์ง์ ํต์
- context.arch: ์ต์คํ๋ก์ ๋์์ ์ํคํ ์ฒ
- context.log_level: ์ต์คํ๋ก์ ๊ณผ์ ์์ ์ถ๋ ฅํ ์ ๋ณด์ ์ค์๋
- ELF: ELFํค๋์ ์ฌ๋ฌ ์ค์ ์ ๋ณด ์์ง
- shellcraft: ๋ค์ํ ์ ธ ์ฝ๋๋ฅผ ์ ๊ณต
- asm: ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ด์ ๋ธ
๋ํ pwntools์๋ ์ฌ๊ธฐ์ ์๊ฐํ ๊ธฐ๋ฅ๋ค ์ธ์๋ ์ ์ฉํ ๊ธฐ๋ฅ์ด ๋ฌด์ง ๋ง์์.
์ต์คํ๋ก์์ ์์ฑํ๋ค๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ด ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ค ์๊ฐํ๋ฉด ์ด๋ฏธ ๊ตฌํ๋ ํจ์๊ฐ ์๋์ง ํ์ธ ์ผ์ค
์ฐธ๊ณ ์๋ฃ(๋จ, ์ ๋ถ๋ถ์ ์ ๊ฐ ๋ฐฐ์ด ๋ด์ฉ ์์ฝ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ ๋ด์ฉ๊ณผ ๊ฐ์ต๋๋ค.)
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
shell_basic (0) | 2022.04.19 |
---|---|
Exploit Tech: Shellcode (0) | 2022.04.15 |
Tool: gdb (0) | 2022.03.29 |
Quiz: x86 Assembly (0) | 2022.03.27 |
x86 Assembly: Essential Part (0) | 2022.03.24 |