Profile

머리정리하는곳

c2w2m2

Pwntools 기본적인 사용법 - 2

이번에는 익스할 때 주로 사용하는것을 써볼겁니다




먼저 패킹 관련 함수들 입니다.


1. packing


1-1. p32


32bit little endian 으로 packing 해주는 함수입니다.


p32(int) / return str


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


여기서 p32(0x12345678, endian='big') 을 해주면 big endian 으로 packing 해줍니다


1-2. p64


p32이랑 같지만 64bit 패킹해줍니다


p64(int) / return str


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


이것도 마찬가지로 p64(0x12345678, endian='big') 해주시면 big endian 이 됩니다.



이 함수들은 많이 쓰이는데, 예를 들면 bss 영역의 주소를 0x601090 라 하면은


bss = 0x601090 식으로 변수 지정을 해주고 payload 를 짤때


pay = ....

....

pay += p64(bss)


이런 식으로 사용하게 됩니다. 이거만 보면 그냥 \x90\x10\x60 으로 직접 packing 하면 안되나? 하실 수 있지만, 가독성을 챙길수 있으며


pay += p64(bss)

...

pay += p64(bss+8)


이런식으로 주소를 더해서 사용하는 경우도 종종있고, 추후 offset 으로 libc 를 leak 하는 경우도 있으니 많이 유용하고 자주쓰이는 함수들입니다.





2. unpacking


2-1. u32


32bit little endian 을 unpack 해주는 함수입니다.


u32(str) / return int


str 에 들어갈 변수 혹은 string 은 packing 된 string 이여야 합니다.


여기서 주의할 점은 32bit 주소는 4byte 를 사용함으로 \x78\x56\x34\x12 같은 4byte packing 된 str를 넣어주셔야 합니다.


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


이 함수도 p32와 같이 u32("\x78\x56\x34\x12", endian = 'big') 으로 해주면 big endian 으로 처리해줍니다.


2-2. u64


u32 랑 같지만 64bit 로 unpack 해줍니다.


u64(str) / return int


str에 들어갈것은 u32와 같지만 64bit 주소는 8byte 를 사용함으로 \x00\x00\x00\x00\x78\x56\x34\x12 과 같은


8byte packing 된 str를 넣어주셔야 합니다.



이 함수들은 주로 leak을 하여 받은 주소를 unpack 하는데 사용합니다.


payload = p32(write_plt) + p32(pppr) + p32(1) + p32(read_got) + p32(4)


p.sendline(payload)


이런 방식으로 read_got의 주소를 leak 했을경우 이를 받아야 합니다.


이때 받기만 하면 packing 된 주소를 받아오는데 이를 unpacking 해줄때 사용합니다.


leak_tmp = p.recv(4)[0:]


leak_read_got = u32(leak_tmp)


같은 식으로 사용합니다.


그리고 u64같은 경우는 64비트에서 주로 사용하는데, 64bit에서 사용되는 주소는 6byte만 사용됩니다. 


따라서 leak 하면 6byte만 릭되는데, 이거때문에 u64(p.recv(6).ljust(8,'\x00')) 같이 ljust랑 같이 사용합니다.





3. ETC


3-1. interactive()


단어 뜻 그대로 상호작용 할 수 있게해주는 함수입니다. 이 함수는 remote 혹은 process 로 생성한 연결에 대해 쉽게 상호작용을 할 수 있게 해줍니다. 


ex )


p = remote("108.61.161.168" ,12341234123)


....


p.interactive()


위와 같은 식으로 사용합니다. 주로 사용하는 곳은 쉘을 딴 후에 그 쉘과 쉽게 상호작용하기 위해서 사용하게 됩니다. 







여기까지가 이번 (2) 에서 살펴볼 내용이였습니다. 


여기있는 함수 전부 exploit 을 짤때 거의 꼭 들어가는 것들이니 익히셔야 합니다.


마지막으로 예제하나를 던지고 갑니다.




다음 (3) 에서는 libc 와 rop 관련 함수를 알아보겠습니다.



'Analysis' 카테고리의 다른 글

Pwntools 기본적인 사용법 - 3  (1) 2017.10.20
Full Relro 우회법  (0) 2017.10.15
PPR 없이 ROP  (0) 2017.09.28
Pwntools 기본적인 사용법 - 1  (1) 2017.09.22
SROP  (0) 2017.08.25