이번에는 익스할 때 주로 사용하는것을 써볼겁니다
먼저 패킹 관련 함수들 입니다.
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 |