Pwntools 기능 본문

Pwnable/ETC

Pwntools 기능

disso1p1 2020. 7. 8. 22:58

 

 

1. 모듈 가져오기

파이썬에서 pwntools 기능을 사용해 익스플로잇을 작성하려면 파이썬 모듈을 가져와야 한다.

from pwn import *

 

위 코드는 * 을 이용해 pwntools의 모든 기능 가져와 pwntools 에서 제공하는 함수들을 사용할 수 있게 한다.

 

 

2. 연결하기

 

프로세스에 연결하는 세 가지 방법이 있다.

 

1) ssh

ssh 함수는 말 그대로 ssh 리모트를 연결해주는 역할을 한다.

 

 

기본 형태 : 변수명 = ssh("유저명", "IP주소", port ="포트", password="비밀번호")

 

 

ex) p 라는 변수에 'hihi' 라는 유저명, 123.123.0.1 이라는 IP주소, 포트 1234, 비밀번호 '1212' 로 연결하고 싶다면

p = ssh("hihi", "123.123.0.1", port="1234", password="1212")

이런 식으로 코드를 짜면 되겠다.

 

2) remote

remote 함수는 CTF 에서 많이 사용하는 nc 서버에 연결해주는 역할을 한다.

 

기본 형태 : 변수명 = remote("서버주소 or IP주소", "포트") 

 

 

ex) 변수 p 에 IP 주소 123.123.0.1, 포트 1234 로 연결하고 싶다면

p = remote("123.123.0.1", "1234")

이런 식으로 코드를 짜면 되겠다.

 

3) process

process 함수는 내 컴퓨터에 있는 바이너리에 연결해주는 역할을 한다.

 

기본 형태 : 변수명 = process("바이너리 경로")

 

 

ex) 변수 p 에 현재 위치한 폴더에 있는 바이너리 test 에 연결하고 싶다면

p = process("./test")

이런 식으로 코드를 짜면 되겠다.

 

 

3. 데이터 받아오기 & 보내기

3-1. 받아오기

 

1) recv(int)

   int 형으로 넣은 byte 수만큼 받아온다.

   ex) tmp = recv(1024)

 

2) recvline()

   한 줄을 받아온다. ( 개행 문자를 만날 때까지 )

   ex) tmp = recvline()

 

3) recvuntil(str)

    해당 문자열까지 받아온다. ( 자르는 용도 )

    ex) tmp = recvuntil("? : ")

 

3-2. 보내기

1) send(str)

   그냥 해당 문자열만 보낸다. ( 개행 X )

 

2) sendline()

   문자열을 한 줄로 보낸다. ( 개행 O )

 

3-3. 짬뽕

1) sendafter(str, str)

   send와 recvuntil를 합친 함수이다.

   첫 번째 인자의 문자열까지 받아오면 두 번째 인자의 문자열을 보낸다. ( 개행 X )

 

2) sendlineafter(str, str)

   sendline과 recvuntil를 합친 함수이다.

   첫번째 인자의 문자열까지 받아오면 두번째 인자의 문자열을 보낸다. ( 개행 O )

 

4. 패킹 & 언패킹

4-1. Packing

1) p32(int)

   p32 로 받은 수를 32bit 리틀엔디언 방식으로 packing 해준다. ( str 로 )

   ex) p32(0x12345678) == "\x78\x56\x34\x12"

 

2) p64(int)

  p32와 마찬가지지만 64bit 방식으로 packing 해준다. ( str 로 )

  ex) p64(0x12345678) == "\x00\x00\x00\x00\x78\x56\x34\x12"

 

+) 빅엔디언 방식으로 packing 하고 싶으면 

p32(0x12345678, endian="big") 이런 식으로 옵션을 붙여주면 된다.

 

4-2. Unpacking

1) u32(str)

   p32와 정반대로 32bit 리틀엔디언 방식으로 처리해 unpacking 해준다. ( int 로 )

   ex) u32("\x78\x56\x34\x12") == 0x12345678

 

2) u64(str)

  u64 와 마찬가지지만 64bit 방식으로 처리해 unpacking 해준다. ( int 로 )

  ex) u64("\xdd\xcc\xbb\xaa\x78\x56\x34\x12") == 0x12345678aabbccdd

 

5. got & plt 찾기

got와 plt 주소를 찾으려면 ELF 함수부터 알아야 한다.

 

1) ELF()

   ELF 함수는 바이너리에 적용되어 있는 보호 기법을 보여주거나, 바이너리의 elf 정보를 가져올 수 있다.

 

   기본 형태 : 변수명 = ELF("바이너리 경로")

 

2) got 

   puts 함수의 got 를 찾고싶다고 할 때,

e = ELF("./test")
got = e.got['puts']

   이런 식으로 got 를 가져올 수 있다.

 

3) plt

    똑같이 puts 함수의 plt 를 찾고싶다고 할 때,

e = ELF("./test")
plt = e.plt['puts']

   이런 식으로 plt 를 가져올 수 있다.

 

6. 상호작용

1) interactive()

   서버와 직접 상호작용을 하게 해 준다. ( 쉘 느낌 )

 

2) close()

   서버와의 연결을 끊는다.

 

 

 

 

전에 pwntools 처음 공부 했을 때 올렸던 글이 있다.

여기에 pwntools 를 이용한 쉬운 예제가 있으니 한번씩 들어가서 보면 좋겠다.

 

https://disso1p1.tistory.com/13

 

pwntools 연습

많은 분들께서 문제를 풀 때 pwntools 를 많이 사용하시고, 엄청 좋은 도구인 것 같아서 나도 한번 써보고 싶었다. 그래서 간단한 함수들로 예제를 만들어 공부해봤다 .. ㅎ #include #include #include int m

disso1p1.tistory.com

 

hackCTF 에 있는 '달라란 침공' 이라는 문제도 비슷한 문제이다.

'Pwnable > ETC' 카테고리의 다른 글

Incognito CTF 2021 little_register 출제 후기  (0) 2021.09.03
헷갈리는 것들 정리  (0) 2020.03.05
pwntools 연습  (0) 2020.02.21
시작  (0) 2020.01.30
Comments