뇌
Pwntools 기능 본문
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 |