码迷,mamicode.com
首页 > 其他好文 > 详细

RCTF2015 PWN400 分析

时间:2016-05-19 00:09:36      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:

和上一个一样,记录一下做题的思路。

int sub_80487F7()
{
  puts("Your Address:");
  sub_804865D(0, (int)&unk_804B1E0, 256, 10);
  puts("Your Phone number:");
  sub_804865D(0, (int)&unk_804B0C0, 256, 10);
  return puts("Thank you.");
}

程序一开头就是这个,往bss段里写,因为ZCTF有一道题就是利用的这个地方,所以我留意了一下这个地方。

  puts("1.WO YAO DIAN CAI");
  puts("2.Submit");
  puts("3.I want Receipt");
  puts("4.Review");
  puts("5.Exit");
  puts("choose:");

又是熟悉的菜单,又是熟悉的笔记本功能。

一猜又是堆的问题。

惯例,先看创建函数的情况,

int sub_80488AF()
{
  int v0; // ebx@2
  int result; // eax@2
  int v2; // [sp+1Ch] [bp-Ch]@1

  v2 = dword_804B1C0;
  puts("CHI SHEN ME?");
  puts("1.Banmian");
  puts("2.Bianrou");
  puts("3.Qingtangmian");
  puts("4.Jianbao");
  puts("5.Jianjiao");
  dword_804B1C0 = (int)malloc(40u);
  if ( dword_804B1C0 )
  {
    *(_DWORD *)(dword_804B1C0 + 36) = v2;
    sub_804865D(0, dword_804B1C0 + 4, 60, 10);
    puts("How many?");
    v0 = dword_804B1C0;
    *(_DWORD *)v0 = sub_80486CD();
    puts("Add to GOUWUCHE");
    result = dword_804B2E0++ + 1;
  }
  else
  {
    result = puts("Error");
  }
  return result;
}

通过函数得出数据结构为

 struct note
  {
    DWORD many;
    byte buffer[32];
    DWORD 上个块的指针;
  }

单个块的大小为定值40byte。并且很明显函数有漏洞,我还以为F5又出错了呢,去看了一遍汇编结果确实是漏洞,给的真的很明显。

往buffer里读入时可以最大读入60byte

 

RCTF2015 PWN400 分析

标签:

原文地址:http://www.cnblogs.com/Ox9A82/p/5507053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!