バッファオーバーランを悪用するコード完成!!
/*
バッファオーバーランを悪用するコード(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;
}