pwntool 기본 사용법 정리
1. NC 연결
remote(IP, PORT) 형식으로 연결.
IP는 str이고 port는 int형임에 주의
p = remote("localhost",1234)
2. Local
nc 다음으로 많이 쓰는 local 경우에는 process("PATH") 식으로 연결
PATH도 마찬가지로 str
p = process("./test")
3. ssh
젤 많이 안쓰이지만 pwnable.kr 쓸 경우 많이 나옴 ssh(username, IP, PORT, PASSWORD) 꼴로 연결, USERNAME, IP, PASSWORD 는 str PORT는 int
PORT와 PASSWORD는 각각 앞에 port=, password= 를 붙힘.
p = ssh("test", "localhost", post=1234,password="test")
p2 = p.run("/bin/sh")
ssh 는 run이라는 함수가 있는데 이를 이용하여 쉘을 띄어주고 해결해줌
--------------------------------------------------------------------------
recv와 send 에 대해서 알아보자
recv_send.c
이런식으로 일반적인 인간의 손으로 풀 수 없는 문제가 있을 때
폰툴을 이용하여 쓱삭 가능함.
먼저 recv를 통해 passcode를 받아옵니다.
recvline
이름처럼 하나의 줄을 받아옴
tmp= p.recvline()
recvuntill(str)
str 까지만 받아옴
recv(int)
int 만큼 받아옴
p.recvuntill('passcode : ')
passcode - p.recv(2048)
-------------------------------------------------------------------------
패킹 관련 함수들
p32
32bitt 리틀 엔디언으로 패킹 해주는 함수
p32(0x12345678) => \x78\x56\x34\x12
여기서 p32(0x12345678, endian='big')을 해주면 big endian 으로 packing해줌
p64
p32와 같지만 64비트로 패킹해줌
p64(0x12345678) => \x00\x00\x00\x00\x78\x56\x34\x12
페이로드 짤 때
bss = 0x601090 이런 식으로 지정을 해주고
payload = .......
payload += p64(bss)
이런 식으로 사용
p64(bss+8)
이런식으로 주소를 더해서 사용하는 경우도 종종 잇음
offset으로 libc를 leak 하는 경우도 있으니 자주 사용하는 함수임
-------------------------------------------------------------------------
unpacking
32bit little endian을 unpack해주는 함수
u32("\x78\x56\x34\x12")=> 305419896(0x12345678)
이 함수도 endian='big'을 해주면 big endian으로 처리를 해줌
u64 - u32랑 같지만 64bit로 unpack해줌.
etc
interactive
단어 뜻 그대로 상호작용 할 수 있게 해주는 함수
주로 사용하는 곳은 쉘을 딴 후에 그 쉘과 쉽게 상호작용 하기 위해서임.
-------------------------------------------------------------------------
libc
e = ELF("./test")
-> 아키텍처나 보호기법등을 보여줌
매핑된 시작 주소르 확인하고 싶으면 hex(e.address)
를 이용하면 됌
hex(e.symbols['puts'])
-> elf의 심볼
hex(e.plt['puts'])
->plt
hex(e.got['puts'])
->got
특정 섹션의 주소를 알고 싶으면
hex(e.get_setion_by_name('.bss').header.sh_addr)
이런 식으로 사용하지만
bss는 hex(e.bss())
로 바로 확인 할 수 있음
특정 문자열을 찾아 주소를 가져 오고 싶을때는
hex(next(e.search('lib.so.6')))
다시 보호기법을 확인하고 싶을때는 print e.checksec()
하면 볼 수 있음