Jastes 2022. 4. 4. 17:31

pwntools์˜ ๊ฐ„๋‹จ ์„ค๋ช…

ํƒ„์ƒ ๋ฐฐ๊ฒฝ๊ณผ ์„ค์น˜ ๋ฐฉ๋ฒ•

์ง€๋‚œ ์‹œ๊ฐ„์— ํŒŒ์ด์ฌ๊ณผ ํŒŒ์ดํ”„(|)๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ต์Šคํ”Œ๋กœ์ž‡์„ ํ–ˆ์ฃ 

ํŒŒ์ด์ฌ์œผ๋กœ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ–ˆ์ฃ 

ํŒŒ์ด์ฌ๊ณผ ํŒŒ์ดํ”„๋ฅผ ์ด์šฉํ•œ ์ต์Šคํ”Œ๋กœ์ž‡

๊ทธ๋Ÿฌ๋‚˜ ์ต์Šคํ”Œ๋กœ์ž‡์ด ์ข€๋งŒ ๋ณต์žกํ•ด๋„ ์œ„ ๋ฐฉ๋ฒ•์€ ์ด์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์žกํ•œ ์—ฐ์‚ฐ๊ณผ ํ”„๋กœ์„ธ์Šค์™€ ๋ฐ˜๋ณต์  ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์ด ๊ฐ€๋Šฅํ•ด์•ผ์ฃ 

๊ทธ๋ž˜์„œ ํ•ด์ปค๋“ค์€ perl, python c์–ธ์–ด ๋“ฑ์œผ๋กœ ์ต์Šคํ”Œ๋กœ์ž‡ ์Šคํฌ๋ฆฝํŠธ, ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ์ž‘ํ•ด ์‚ฌ์šฉํ–ˆ์ฃ 

๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ์‹œ๋ฉด ๋ผ์š”

๊ธฐ์ดˆ ํŒŒ์ด์ฌ ์ต์Šคํ”Œ๋กœ์ž‡ ์Šคํฌ๋ฆฝํŠธ

ํŒŒ์ด์ฌ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ต์Šคํ”Œ๋กœ์ž‡ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด, ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ํ•จ์ˆ˜๊ฐ€ ์žˆ์ฃ 

์˜ˆ๋กœ ๋ฆฌํ‹€ ์—”๋””์•ˆ์˜ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ฐ”๊พธ๋Š” ํŒจํ‚น ํ•จ์ˆ˜, ๋˜๋Š” ๊ทธ ์—ญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ธํŒจํ‚น ํ•จ์ˆ˜ ๋“ฑ์ด์ฃ 

์ต์Šคํ”Œ๋กœ์ž‡ ๊ณผ์ •์—์„œ ๊ฑฐ์˜ ํ•ญ์ƒ ํ•„์š”ํ•˜๋ฉฐ ์ง€๋‚œ ์ •๋ฆฌ์—์„œ get_shell()์˜ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ

๋ฆฌํ‹€ ์—”๋””์•ˆ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ์  ์žˆ์–ด์š”

 

์ด๋Ÿฐ ํ•จ์ˆ˜๋“ค์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ด๊ธฐ์— ์ด๊ฒƒ์„ ์ง‘๋Œ€์„ฑํ•˜์—ฌ pwntools๋ผ๋Š” ํŒŒ์ด์ฌ ๋ชจ๋“ˆ ํƒ„์ƒ!

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์—๋Š” ์—ฌ๊ธฐ์„œ ์†Œ๊ฐœํ•œ ๊ธฐ๋Šฅ๋“ค ์™ธ์—๋„ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋ฌด์ง€ ๋งŽ์•„์š”.

์ต์Šคํ”Œ๋กœ์ž‡์„ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค ์ƒ๊ฐํ•˜๋ฉด ์ด๋ฏธ ๊ตฌํ˜„๋œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ์„ผ์Šค

 


์ฐธ๊ณ  ์ž๋ฃŒ(๋‹จ, ์œ„ ๋ถ€๋ถ„์€ ์ œ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ ์š”์•ฝ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์œ„ ๋‚ด์šฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

 

 

Tool: pwntools

pwntools๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ํ†ตํ•ด ์‚ฌ์šฉ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค.

dreamhack.io

 

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ HOWTO — Python 3.10.4 ๋ฌธ์„œ

INET (์ฆ‰, IPv4) ์†Œ์ผ“์— ๊ด€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ด์ง€๋งŒ, ์‚ฌ์šฉ ์ค‘์ธ ์†Œ์ผ“์˜ 99% ์ด์ƒ์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, STREAM (์ฆ‰, TCP) ์†Œ์ผ“์— ๊ด€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค - ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •๋ง๋กœ ์•Œ๊ณ 

docs.python.org

 

GitHub - Gallopsled/pwntools: CTF framework and exploit development library

CTF framework and exploit development library. Contribute to Gallopsled/pwntools development by creating an account on GitHub.

github.com

 

pwntools — pwntools 4.9.0dev documentation

© Copyright 2016, Gallopsled et al. Revision ef698d45.

docs.pwntools.com

 

pwnlib.shellcraft.amd64 — Shellcode for AMD64 — pwntools 4.7.0 documentation

Parameters: key (int,str) – XOR key either as a 8-byte integer, If a string, length must be a power of two, and not longer than 8 bytes. Alternately, may be a register. address (int) – Address of the data (e.g. 0xdead0000, ‘esp’) count (int) – Nu

docs.pwntools.com

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

 

Tool: pwntools

pwntools๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ํ†ตํ•ด ์‚ฌ์šฉ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค.

dreamhack.io

 

Flaticon

Flaticon

www.flaticon.com