pwntools
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
```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 |