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

 

 

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

 

 

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