티스토리 뷰




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()

하면 볼 수 있음



Comments