https://github.com/Gallopsled/pwntools

https://docs.pwntools.com/en/stable/intro.html

https://docs.pwntools.com/en/stable/globals.html

http://docs.pwntools.com/en/stable/tubes.html


  • 32bit에서도 돌아가기는 하나 정식으로 지원하지는 않음.
  • canary break같은 brute force는 threading이나 asyncio를 사용해야 하는데
    threading의 경우 될 때도 있고 안될 때도 있음. 직접 짠건 잘 되는걸로 보아 시스템 상태에 더 민감하게 반응하는 듯? 그래서 이런 경우 직접 코딩하는게 낫다.
  • debug 기능이 아주 이상하기 때문에 그냥 안쓰는게 낫다.


```python

from pwn import *


def exploit(r):

    r.clean()        # buffer clean 잘 해줄 것.

'''interactive() 직전에 호출하게 되는 recv 계열은 반드시 timeout 지정해주어야 함.

지정 안하면 계속 대기하기 때문에 interactive()가 실행되지 않는다.'''

    r.recvuntil(': ', timeout=1) 

    r.sendline("abcd") # 마지막에 개행 붙는다.

    if r.can_recv():

        pass

    r.interactive()



if len(sys.argv) > 1:

    r = remote(sys.argv[1], int(sys.argv[2]))

else:

    r = process(['./binary'], env={"LD_PRELOAD":"./libc.so.6"})


#pause()

expolit(r)

```


shellcode

```python

>>> print shellcraft.sh()

/* execve(path='/bin///sh', argv=['sh'], envp=0) */...push 0x68...

>>> print enhex(asm(shellcraft.sh()))

6a68682f2f2f73682f62696e89e368010101018134247269010131c9516a045901e15189e131d26a0b58cd80

>>> shellcraft.arm.nop()

u'    orr r1, r1, r1\n'

>>> asm(shellcraft.arm.nop())

직접 assembly를 컴파일해서 기계어를 얻는 방식인 듯 하다.

해서 현재 arch와 일치하지 않는 기계어는 얻을 수 없는 듯.

```

직접 만들 수 없는 경우 그냥 http://shell-storm.org/shellcode/에서 찾는다.


libc symbol 계산

```python

>>> libc = ELF("/lib/x86_64-linux-gnu/libc-2.19.so")

>>> hex(libc.symbols["__free_hook"])

'0x3c0a10'

```


telnetlib의 interact

pwntools 안쓰고 interact하려면, telnetlib을 사용한다.

```python

import telnetlib


t = telnetlib.Telnet()

t.sock = s    # socket object

t.interact()

```

'Security > System Exploit' 카테고리의 다른 글

overlapping chunk  (0) 2017.08.15
one_gadget / libc-database  (0) 2017.08.13
Shellcode  (0) 2017.07.26
UAF, Use After Free  (0) 2017.07.23
[glibc] free_hook, malloc_hook  (0) 2017.07.23