RCTF2015 PWN400 分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RCTF2015 PWN400 分析相关的知识,希望对你有一定的参考价值。

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

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; // [email protected]
  int result; // [email protected]
  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 分析的主要内容,如果未能解决你的问题,请参考以下文章

[RCTF2015]EasySQL

Buuctf——[RCTF2015]EasySQL

Buuctf——[RCTF2015]EasySQL

BUU-WEB-[RCTF2015]EasySQL

SCTF2014_pwn400 writeup

[rctf](web)rcdn 解题分析,知识点总结