본문 바로가기
HACKING/SYSTEM

pwntools 기본 명령어

by pharmerci 2021. 9. 24.
728x90

pwntools는 리눅스 환경에서 exploit코드 작성을 쉽게 해주는 파이썬 라이브러리이다. exploit 실습에서 불편하게 input을 주지 않고 편리하게 input과 output을 받아오기 위해서 사용한다.


우분투에서 파이썬에 접속한 후 from pwn import*를 입력해주면 pwntools library에 로드가 가능하다.

 

p=process('./바이너리명') 명령어를 입력하면 로컬 바이너리에 연결할 수 있다.

p=remote('./주소', 포트번호) 명령어를 입력하면 원격 서버 바이너리에 연결할 수 있다.

 

이렇게 연결을 하고나서 바이너리에 input을 넣자!

p.send('문자') 입력하면 된다. 이 명령어는 개행문자는 포함하지 않는다.

p.sendline('문자') 이 명령어는 개행문자까지 포함되어 input할 수 있다.

 

p.interactive()는 쉘과 직접적으로 명령 전송 및 수신을 하는 명령어이다.

 

이번에는 output을 받아오자

p.recv(0바이트) 연결한 바이너리가 출력하는 데이터를 최대 0바이트까지 받아오겠다는 의미이다.

p.recvline()은 개행문자를 만날때까지 받아서 변수에 저장하겠다는 의미이다.

p.recvuntil('문자')는 바이너리가 출력하는 데이터를 문자가 출력될때까지 받아서 변수에 저장하겠다는 의미이다.

받아온 데이터를 저장할 공간이 필요하니 변수명= 을 앞에 꼭 입력해주어야 한다.

 

 print(변수명) 해주면 그 데이터가 출력될 것이다.

 


리틀엔디안 바이트 값으로 패킹

 

p32, p64를 통해서 각각 4바이트, 8바이트 데이터를 리틀엔디언 데이터로 변환할 수 있다.

예를 들어서 변수이름 = 0x41424344 (=ABCD)를 p32를 통해서 패킹한다면

리틀엔디안 형태로 DCBA가 출력된다.

 

이를 눈으로 확인하기 위해서는 print(p32(변수이름)) 이렇게 코드를 작성해주면 된다.

 

리틀엔디안 바이트 값 언패킹

 

u32, u64를 통해서 각각 4바이트, 8바이트 리틀 엔디안 데이터를 언패킹할 수 있다.

예를 들어서 변수이름 = "ABCDEFGH" (=0x4142434445464748)를 u64를 통해서 언패킹한다면

리틀엔디안 형태로 HGFEDCBA가 출력된다.

 

만약에 이 언패킹값을 16진수로 보고싶다면 print(hex(u32(변수이름))) 이렇게 코드를 작성해주면 된다.

 

 


바이너리 내부 got, plt, 사용자 정의 함수 주소 가져오기

 

리눅스에서 작동하는 실행파일에서 ELF에 각종 정보가 기록되어있다. 대표적인 젖ㅇ보가 plt와 got이다.

 

e=ELF(./test') 이런식으로 라이브러리를 불러오고

 

puts_plt=e.plt['puts'] -> ELF ./test에서 puts의 PLT주소를 찾아서 변수에 넣는다는 뜻이다.

read_got=e.got['read'] -> ELF ./test에서 read의 GOT주소를 찾아서 변수에 넣는다는 뜻이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90