감자 텃밭

Pwntools 사용법 본문

System/Tips

Pwntools 사용법

g2h 2021. 11. 23. 22:27

포너블(시스템 해킹)을 하면서

많은 기능을 제공해주는 Pwntools는 엄청 많은 도움이 되며, 정말 Exploit에 큰 도움이 된다.

 

pip를 통해 설치후에

Exploit 파일인 .py 내에서 사용이 가능하며, 불러오기 위해

제일 상단에 

from pwn import * 로 해당 모듈을 불러올 수 있다.


from pwn import *

1.연결

1. 원격 접속 - 공격서버에 공격을하기위해 원격으로 붙기위해 사용 (nc)
remote("ip",port)
ex) r = remote("192.168.10.101", 8080)

2. 로컬 접속 - 공격서버에 원격으로 붙기전에 로컬에서 우선 Exploit코드를 실행시켜보기 위해 사용
process("파일")
ex) p = process("./test")

3. ssh 접속 - ssh접속을 할때 사용
ssh(username, ip, port, password)
ex) s = ssh("test", "192.168.1.101", port=8080, password="pswd")

2. 문자열, 데이터 받아오기

1. recv(int) - int형으로 문자열을 받아올 때 사용, 보통 서버에서 주소값을 던져줄때 받기위해 사용
ex) int(r.recv(10),16) - 출력되는 문자열을 int형으로 10바이트를 16진수로 받아온다.

2. recvline() - 출력되는 문자열 한 줄을 받아온다. 
ex) a = r.recvine()

3. recvuntil("string") - 출력되는 문자열중 원하는 위치까지 받아온다.
ex) r.recvuntil("input : ") - 이와같이 사용 후 전송을 할 수 있으며,
ex2) r.recvuntil("output : ") 
      r.recv(1024) 와 같이 한쌍으로 사용할 수 있음.

3. 데이터 및 문자열 전송

1. send(value) - 데이터  전송
ex) r.send(value)

2. sendline(value) - 데이터를 한줄로 전송 \n(개행)이 마지막에 추가됨
ex) r.sendline(value)

3. sendlineafter("string",value) - 특정 문자열까지 받은 후 데이터 전송
ex) r.sendlineafter("intput : ",payload)

4. Packing

1. p32(value) - 값을 32bit 리틀엔디안 방식으로 packing
ex)p32(0x138a56fd) - 0xfd568a13

2. p64(value) - 값을 64bit 리틀엔디안 방식으로 packing
ex)p64(0x138a56fd) - 0xfd568a13

5. Unpacking

1. u32(string) - 값을 32bit 리틀엔디안 방식으로 unpacking
ex) u32(0x138a56fd)

2. u64(string) - 값을 64bit 리틀엔디안 방식으로 unpacking
ex) u64(0x138a56fd)

6. 쉘 획득 후 쉘 유지 및 상호작용

1. interactive()
ex) r.interactive()
 - Exploit 코드 맨 마지막에 삽입
 - 쉘이 획득 되면 서버와의 상호작용 및 명령어를 전달한다.

7. ELF

ELF란 - ELF헤더는 바이너리파일에 존재하는 각종 정보들이 존재
ex) e = ELF('./test') - 라이브러리 연결
1. e.plt['func']
ex) puts = e.plt['puts'] - puts함수의 plt 주소를 가져옴

2. e.got['func']
ex) puts = e.got['puts'] - puts함수의 got 주소를 가져옴

3. e.symbols['func']
ex) puts = e.symbols['puts'] - puts함수의 offset주소를 가져옴, 함수,전역변수주소 포함

8. Context.log

Exploit 과정에서 버그가 발생시 디버깅을 하기위한 기능
1. context.log_level = 'error' - 에러만 출력

2. context.log_level = 'debug' - 대상 프로세스와 익스플로잇간에 오가는 모든 데이터를 화면에 출력

3. context.log_level = 'info' - 비교적 중요한 정보들만 출력

9. Context.arch

Pwntools에서 제공하는 ShellCode,어셈블리어,디스어셈블등의 기능을 대상아키텍처에 맞게 지정
1. context.arch = "amd64" - x86-64 아키텍처

2. context.arch = "i386" - x86 아키텍처

3. context.arch = "arm" - arm 아키텍처

10. fmtstr

1. fmtstr_payload(offset, {기존 함수 주소 : 덮어쓸 함수 주소}) - 포멧스트링을 편리하게 해줌

 - 지정한 위치에 기존 함수 주소를 다른 주소로 덮어 쓰는 payload를 자동으로 생성해줌

11. ShellCode

shellcode = asm(shellcraft.execve("/bin/sh",0,0)) - execve("/bin/sh")를 호출하는 쉘코드

asm('mov rax, 0') - 어셈블리를 바이너리로 변환

disam(b'\xba\x00\x00\x00') - 바이너리를 어셈블리로 변환

12. ROP

e = ELF('./libc.so.6')
r = ROP(e) - ROP를 위한 객체 호출

poprdi = (r.fine_gadget(['pop rdi', 'ret']))[0] - 해당 바이너리파일에 존재하는 pop rdi; ret 가젯의 주소를 구함

이 외에도 Pwntools에는 많은 기능을 제공하며 Exploit과정에서 

유용하게 쓰인다.

참고자료
https://dreamhack.io/
https://studyit312.tistory.com/216
https://whitel0tus.tistory.com/18

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.

'System > Tips' 카테고리의 다른 글

[시스템] vi편집기에서 자동 줄 맞춤  (1) 2021.12.05
[시스템] pwntools에서 send  (1) 2021.12.01
프로그램 섹션 헤더 보는 명령어  (0) 2021.11.14
ASLR 적용시 우회법  (0) 2021.11.11
RTL이란?  (0) 2021.05.29