이번에는 Pwntools 소개를 한번 해볼까 합니다
왜냐하면 input, 패킹, 언패킹, 바이너리 내부 함수 주소들을 자동으로 가져오는 등의
기능을 제공하여 보다 쉽게 분석이 가능하기 때문입니다.
그럼 이걸왜 이제 소개하냐!
앞으로 진행할 exploit 도 그렇고 아래와 같이 불편하게 input을 넣지 않고
편하게 output을 받아오기 위해서 알아둘 필요가 있다고 생각합니다.
(python -c "print 'A'*0x30 + 'B'*0x8 + '\xa7\x05\x40\x00\x00\x00\x00\x00'";cat)| ./binary
실제 워게임이나 ctf에서도 자주 사용하는 라이브러리 입니다.
위는 scoket 라이브러리 사용 코드 입니다
하지만 이것을 pwntools 라이브러리를 사용하면 훨씬 간결하게 아래와 같이 만들 수 있습니다.
간결 해진것을 볼 수 있습니다.
그럼 이제 pwntools 라이브러리를 로드 해보겠습니다.
설치방법은 아래의 링크를 참고해주시기 바랍니다.
https://juns0208.tistory.com/40
Pwntools- 설치및 사용법1
Pwntools 란? Pwntools는 말 그대로 포너블 툴 킷으로 익스플로잇을 편하게 하기 위해서 사용됩니다. 파이썬으로 작성되어 있으며 from pwn import *을 선언해서 사용할 수 있습니다. Gallopsled라는 팀에 의
juns0208.tistory.com
그러면 이제 local 바이너리를 연결 해보겠습니다
p = process ('./[바이너리 이름]')
연결이 된것을 확인 하였습니다.
그러면 이제 서버 바이너리를 연결 해보도록 하겠습니다.
p = remote('./address',port) #주소 + 포트 번호
연결이 된 것을 확인 할 수 있습니다.
그럼 여기서 연결된 서버 바이너리에 input을 넣고 output을 보겠습니다
먼저 예시 코드를 사용해서 보도록 합시다.
예시 코드
#include <stdip.h>
int main()
{
char arr[100];
scnaf("%s",arr);
printf("hello %s\n",arr);
return 0;
}
단순히 입력을 받으면 해당 입력을 출력하는 c 소스입니다.
여기서 pwntools 라이브러리를 이용해서 input을 보내고
그 input을 받아서 output이 나오는지 확인을 하면 됩니다.
gcc로 컴파일을 해주고 파이썬 소스코드를 제작 해봅시다.
from pwn import*
p = process('./a.out')
p.sendline('AAAA')
p.interactive()
정상적으로 우리가 보낸 입력값이 나오고 있는것을 볼 수 있습니다.
이번에는 output을 받아오겠습니다.
p = process('./a.out')
data = p.recv(13)
a.out이라는 바이너리가 최대 13바이트까지 받아서 data 변수에 저장을 하게 됩니다.
예제 코드
#include<stdio.h>
int main(void)
{
puts("hello pwnalble");
return 0;
}
이제 무슨 코드인지는 대충 알것이라 생각하고 넘어가겠습니다.
Python code
from pwn import*
p = process('./a.out')
data = p.recv(13)
print(data)
p.interactive()
13바이트 만큼 받아서 출력이 됩니다.
이렇게 Pwntools를 알아보았습니다
다음 포스팅에서는 조금더 심화적으로 사용하는 방법을 알아보도록 하겠습니다.
'Theory > Pwnable' 카테고리의 다른 글
Shellcode list (0) | 2021.09.26 |
---|---|
Pwn tools 소개 2 (0) | 2021.09.22 |
찬희의 Pwn 포너블 기초 3주차 2차시 homework2.c (0) | 2021.09.10 |
찬희의 Pwn 포너블 기초 3주차 1차시 homework2.c (0) | 2021.09.09 |
찬희의 Pwn 포너블 기초 3주차 2차시 homework.c (0) | 2021.09.09 |