|
|
Giang Hồ Mạng,
Dump file chắc là không cho được đâu. Những thông tin trong dump file quá nhiều, filter ra hết các thông tin quan trọng và cá nhân là rất mất thời gian.
Anh conmale,
Xin phép nói thêm để phân biệt unix và internet socket. Chúng giống nhau ở điểm đều thuộc vào loại socket. Nghĩa là dữ liệu đi vào/ra không phải dạng raw, mà đã qua các công đoạn chế biến (encapsulation). Unix socket được ứng dụng để các process khác nhau trên cùng một máy có thể nói chuyện với nhau--tương tự như khi hai process nằm trên hai máy khác nhau vậy.
Khi process nhận dữ liệu từ các sockets, nó không hề quan tâm việc làm sao chuyển raw bits/bytes từ đầu này qua đầu kia socket. Lợi dụng điểm đó, Unix socket giúp cho việc implement Inter-Process Communication được thuận tiện hơn--y chang như khi đọc hoặc ghi dữ liệu vào một socket thông thường.
Về việc vì sao iptables không thể trực tiếp wwwect input stream vào /dev/null, em hiểu như sau:
Bình thường, khi ta dùng issue một "lệnh" trong shell (ví dụ là bash) thì chính bash sẽ làm việc quản lý process đó. Việc quản lý đó bào gồm open các file chính: stdin, stdout và stderr cho process đó. Với stdin, bash sẽ open device là keyboard, stdout và stderr là màn hình chẳn hạn. Bản thân process đó không trực tiếp động đến các device này mà chỉ tương tác với chúng thông qua các discriptors 0, 1, 2 mà thôi. Việc open device và "gắn" device vào file discriptors của process xảy ra trước khi process con được tạo và được chạy.
Khi ta có wwwection, chính bash không open monitor, mà lại open /dev/null rồi mới wwwect dữ liệu vào đây. Điều này xảy ra tương tự như khi wwwect vào file, hay vào một process khác.
Vì sao iptables không thể "wwwect" input stream vào /dev/null bằng các cách như >, hoặc pipe vân vân? Lý do là iptables không cung cấp cho mình một interface để tương tác với /dev/null, và, input stream không thể ra vào trực tiếp trên các file stdin, stdout và stderr. Mình có thể chạy iptables bằng bash (script), và khi sử dụng các ký tự đặc biệt này thì chính bash sẽ open stdin, stdout, và stderr, rồi chính bash sẽ lo vụ wwwect. iptables khi nhận một gói tin sẽ open các files khác (socket, cho wwwect, hoặc /dev/eth1 nếu đang làm gateway chẳng hạn) và "wwwect" gói tin đến file đó.
Giả sử iptables có một target là -j NULL, ta có thể wwwect input stream trực tiếp từ socket vào /dev/null. Lúc này, chính iptables sẽ open /dev/null và tiến hành write dữ liệu vào đó. Việc hack netfilter và iptables để làm việc này thì không phải không làm được. Nhưng mình có thể sử dụng một cách khác để đạt kết quả tương tự.
khoai
|
|
|
anh conmale wrote:
Mr. Khoai "đẩy" đến chỗ dùng netcat để đưa packet vào /dev/null theo dạng đã đưa ra ở trên là một gặt hái rất lớn trong việc thảo luận. Tiếc là Mr. Khoai chưa giải thích tại sao một packet đi vào xuyên qua một socket không thể wwwect vào một device như /dev/null smilie . Khai triển ngọn ngành điểm này thì mức độ lãnh hội về internet socket, unix socket, devices và filesystem sẽ đi đến chỗ chín mùi.
Hix, khổ ghê, lần nào thảo luận gì đó với anh đều tìm ra cả đống thứ phải học. Em vẫn không thể giải thích tại sao không thể wwwect network traffic vào /dev/null, mà phải wwwect đến một socket. Theo em nghĩ, netfilter được iptables điều khiển. Tuy nhiên iptables và netfilter không cung cấp một công cụ nào đó để mình wwwect dữ liệu sang một device khác. Netfilter có thể wwwect network traffic sang một socket khác (một IP : PORT khác) nên em nghĩ đến cách đó.
Hy vọng trong bài tiếp theo, hoặc một bài nào đó, anh sẽ giới thiệu hoặc giải thích phần trên một cách rõ ràng.
Ky0shir0,
Điểm quan trọng ở đây khoai nghĩ là anh conmale muốn phổ biến kiến thức và tạo môi trường thảo luận trên diễn đàn. Không thể dựa vào điểm các attacker không biết mình implement cơ chế bảo mật thế nào để rồi nghĩ là mình sẽ không bị tấn công.
Đọc mấy bài này y như coi phim/đọc truyện kiếm hiệp
khoai
|
|
|
conmale wrote:
Hì hì, em đoán đúng đó. Em có thể phân tích thêm lý do tại sao em nghĩ rằng mình phải "đưa các gói không hợp lệ vào localhost port nào đó" mà không phải là /dev/null (như một device bình thường)?
Em chỉ không nghĩ ra cách gì wwwect dữ liệu đi vào network device sang một device khác (ở đây là /dev/null). Nhưng iptables có thể wwwect traffic sang một interface khác nhờ cơ chế NAT. Do đó em nghĩ mình có thể tạo một process nào đó, lắng nghe trên localhost port 12345 udp. Sau đó dùng iptables rules, match các udp rules hợp lệ. Còn các gói udp khác thì cứ đưa nó vào localhost:12345. Cái process đang LISTEN trên localhost:12345 có thể đưa dữ liệu vào /dev/null. Ví dụ Code:
$ nc -l -p 12345 -u -e /dev/null
khoai
|
|
|
MrTux wrote:
Chưa từng nghe danh !!!
Nói chung là mấy bản Linux Việt Nam make toàn trên nền của mấy đại gia còn Hacao thì cũng chỉ là một dự án ... mà thôi.
Thay vì cứ cố gắng tạo ra một cái gì đó quá riêng mà chưa chắc đã làm được thì cứ tham gia cùng cả thế giới phát triển một phiên bản nào đó sao cho nó thật phù hợp với nước mình.Không cần nhất thiết phải Tiếng Việt như vậy có lẽ hay hơn.
Đấy là ý kiến chủ quan của mình có gì không phải mong bà con góp ý !
Mr.Tux,
Mỗi distro đương nhiên phải gó một cái gì đó thật nổi bật. Nếu không thì không có lý do thực tiễn nào để theo một dự án phát triển một distro làm gì. Cái "nổi bật" của Há Cảo, theo khoai, là có giao diện tiếng Việt, nhỏ gọn, và khá là tự động (cấu hình, nhận phần cứng vân vân). Đúng là không phải cái gì cũng có thể hoặc cũng nên dịch sang tiếng Việt. Nhưng một giao diện tiếng Việt hoàn toàn sẽ giúp người sử dụng thoải mái hơn rất nhiều.
emnhiepphong,
Bạn muốn hack cái gì mà dùng Hacao linux? Chả có cái gì là "tốt" để hack cả, nếu như bạn không biết mình đang làm cái gì, đang hack cái gì. Nên tìm hiểu xem vì sao "người ta nào đó" nói là dùng *nix để hack, thay vì nghe lời người ta mà chả biết tại sao
khoai
|
|
|
Anh conmale,
Vẫn đang tò mò chờ xem anh implement cái blackhole bằng iptables như thế nào. Em chưa có dịp thử, nhưng đoán là anh dùng PREROUTE để đưa các gói không hợp lệ vào localhost port nào đó có /dev/null ?
Em nghĩ giải pháp cho tình trạng này là thay vì filter traffic thì nên để mấy gói tin bất hợp lệ đi vào, và đi qua thật nhanh. Các gói UDP đó không có ảnh hưởng gì cho hệ thống mà mình lại phải tốn thời gian filter -> input queue có thể bị đầy. Nếu có thể (sử dụng blackhole như anh nói) đưa các gói tin bất hợp lệ đi qua thật nhanh mà không cần process nó thì có thể free một chút băng thông làm việc khác.
khoai
|
|
|
Chào ShinichiKuto,
Vẫn không có gì xác định là tại đống broadcast này làm ảnh hưởng đến mạng của bạn. Bạn nên thử sniff lại từ chính cái gateway. Kiểm tra hoạt động của gateway và LAN trong 2 điều kiện bình thường và bị nghẽn mạng để so sánh.
khoai
|
|
|
Anh quanta,
Thông thường các lỗi liên quan đến mấy cái .so.gì gì đó là do các library mà amarok cần thì nó tìm không ra. Anh thử ldconfig -v rồi grep libmysqlclient xem có .15 hay không. Nếu không có, anh có thể thêm /usr/local/mysql/lib/mysql vào /etc/ld.so.conf để ldconfig có thông tin về lib này.
Trường hợp không có llibmysql.so.15 mà lại có libmysql.so.16 thì có lẽ anh phải upgrade lại amarok để sử dụng lib mới hơn? Em không có dùng amarok cũng như fedora nên không chắc.
khoai
|
|
|
Bài tập thì phải tự làm, sao lại nhờ người khác làm cho mình rồi lấy điểm?
Làm gì cũng vậy, đầu tiên là tìm hiểu kỹ các yêu cầu. 3D browser của bồ có yêu cầu gì? Phải làm những gì? Sau đó mới mò tiếp xem "làm thế nào".
khoai
|
|
|
zducdungz,
Dựa vào đâu dám khẳng định là lần sau sẽ khó hơn lần đầu? Quyền admin ảo là quyền gì?
vikjava,
Mục đích của bạn khi tấn công, thâm nhập và đoạt quyền admin của server này là để làm gì? Nếu không có mục tiêu cụ thể thì tốt nhất là:
khai thác --> đoạt quyền admin --> learn something cool --> report
khoai
|
|
|
Khà khà, anh mrro, khoai vừa mới thử với -fpic thì shellcode cũ vẫn work
Code:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i386-slackware-linux --host=i386-slackware-linux
Thread model: posix
gcc version 3.2.2
$ gcc -o testshell1 -fpic -g testshell.c
$ ./testshell1 SC1
your shellcode is less than 30 bytes! 10 bonus points
sh-2.05b$
SC1 vẫn sử dụng string /bin/sh trong testsh chứ không push string đó lên stack. Thử tiếp với ASLR thì SC1 vẫn work. Lý do: Đã nói cái này không phải là exploit, đơn giản là một bài tập thiết kế shellcode. Các protection mechanism có ứng dụng cũng chưa chắc có hiệu quả:
Code:
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 1
$ gcc -fpic -o testshell -g testshell.c
$ ./testshell SC1
your shellcode is less than 30 bytes! 10 bonus points
sh-2.05b$
Thử build lại với gcc 4.1.2 thì lại khác. SC1 bị segfault. Nhưng cũng may mắn mò được một cách khác tạo ra được một shellcode nhỏ hơn (15 bytes). Vẫn sử dụng string /bin/sh trong testshell, nhưng do gcc khác version khiến cho vị trí của string này trong stack "thuận tiện" khi sử dụng. khoai sẽ report cụ thể các shell code sau.
stager và egghunter thì lần đầu tiên khoai nghe nói. Thanks anh mrro, sẽ xem qua về hai anh này.
khoai
|
|
|
Rắc rối nhỉ! Khoai thấy hiện giờ bạn đã có một máy Ubuntu hoạt động tốt rồi. Vì sao không cài lại các phần mềm cần thiết một cách "sạch sẽ" mà phải sử dụng tar như thế?
Khoai không nghĩ ra cách gì để có thể dùng các file cũ (gồm các các file config) để có thể có một hệ thống tương đối clean được. Ví dụ, bồ cài lại KDE bằng cách copy các files, thì bồ biết files nào là cần thiết? Rồi còn database của dep thì sao? Còn các library, các dependency vân vân? Bồ copy files như thế còn tốn thời gian hơn việc dùng apt-get mà install lại từ đầu rất nhiều.
Vài ý kiến,
khoai
|
|
|
dreamout wrote:
Chỉ cần Cần Can pass la được chứ gi`.
dreamount,
Suy nghĩ kỹ và đọc kỹ chủ đề từ trước đến giờ rồi hãy trả lời.
khoai
|
|
|
Cognac,
Cái này không phải là exploit đâu, đơn giản chỉ là một bài tập để thiết kế cái shellcode mà thôi. Khoai có chịu không thì đâu có quan trọng, quan trọng là bồ "rút" ra được cái gì từ bài này
anh mrro,
Đúng là khoai dùng lại chính cái /bin/sh trong testshell. Đây là một ví dụ khá rõ cho hiện tượng nhét thêm một defense system vào hệ thống, nhưng lại vô tình tạo ra weakpoint khiến cho mục tiêu (ở đây là size shellcode phải nhỏ) dễ thực hiện hơn.
Còn hai cái options kia phải làm sao là cả một vấn đề còn đang suy nghĩ
khoai
|
|
|
anh mrro,
"Bài" này không giới hạn độ dài tối đa ở 30 bytes. Cái khoai đang tìm là một shellcode thật nhỏ. Nhỏ nhất là bao nhiêu thì khoai không biết. Nhưng khoai đã mò được một cái chỉ với 16 bytes, spawn /bin/sh và không bị la lên là "malicious code detected"
Cognac,
Ủa, cứ tưởng code asm là của bồ viết chứ, sao lại bảo khoai chuyển từ shellcode qua assembly?
to all,
Bài này làm chơi cho vui. Đừng vướng vào lối mòn khi suy nghĩ. Nghĩ thoáng một chút sẽ tìm được một con shellcode hiệu quả mà kích thước lại nhỏ
khoai
|
|
|
Anh quanta, fdisk + disk manager report đều đúng, nhưng mà partition table của superthin có vẻ lung tung quá
superthin,
Nhiều máy quá làm khoai choáng luôn. Nói tóm lại hiện giờ kernel bị panic nên bạn không thể boot vào Ubuntu. Bạn xem lại trong /boot có cái initrd nào không? Rất có thể kernel của bạn cần có initrd để load các module cần thiết trước khi nhận ra phần cứng.
khoai
|
|
|
Chào superthin,
Sao cái fdisk -l và cái Disk Manager lại report khác nhau ta? Swap nằm gần chót thì fdisk -l lại thông báo ở sda3?
File menu.lst của bạn cấu hình không chính xác. File menu.lst đặt tại /boot nằm trên một partition. Khoai đoán là nó nằm trên partition chứa linux (/dev/sda9) vì chỉ thấy fdisk report cái đó là ext2 hoặc ext3 mà thôi. Bạn chỉnh lại menu.lst, thay đổi Code:
trở thành Code:
Và, trong menu.lst không có một entry nào để boot windows. Bạn thêm các dòng sau để có thể boot vào windows từ GRUB:
Code:
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
boot
khoai
|
|
|
Hello Cognac,
Nếu shell lớn hơn 50 bytes --> 10 points penalty
Nếu shell ỡ giữa 30-50 : không có penalty, cũng không có bonus
Nếu shell bé hơn 30 bytes --> 10 points bonus.
Không thèm cái shellcode của bồ, mà cần code + giải thích vì đâu có được đống bytes như vậy? Tại sao push giá trị "abcd" lên stack? vân vân.
khoai
|
|
|
Cunconlonton123 wrote:
Mình muốn trong CSDL của website mã hóa dữ liệu . Cụ thể như sau: pass admin của website lưu trong CSDL phải được mã hóa. Vậy thuật toán để viết code như thế nào mong các bạn chỉ giúp. Mình đang rất cần. Cám ơn các bạn nha!
Không nên viết code mã hóa mà nên gọi hàm mã hóa có sẵn. Một số cơ sở dữ liệu có cung cấp hàm mã hóa luôn. Nên sử dụng các hàm này thay vì tự viết.
khoai
|
|
|
Tình hình là dạo gần đây khoai rất có duyên với mấy cái shellcode + buffer overflow. Hôm trước có gặp phải một "bài tập" nhỏ, khá hay nên post lên đây để bà con thảo luận chơi cho vui.
Code:
/* testshell.c */
#include <stdio.h>
#include <string.h>
#define bufsz 100
const char msg[]="Usage: %s <shellcode file>\n";
static char buffer1[bufsz];
static char buffer2[bufsz];
void usage(char *self)
{
printf(msg, self);
exit(1);
}
int main(int argc, char *argv[])
{
FILE *fp;
void (*funcptr)();
if (argc != 2) usage(argv[0]);
if ((fp=fopen(argv[1], "rb"))==NULL) {
printf("fail to open file: %s\n", argv[1]);
exit(1);
}
fgets(buffer1, bufsz, fp);
fclose(fp);
strcpy(buffer2, buffer1);/* your shellcode should not contain 0x0*/
if (strlen(buffer2)>=50) /* your shellcode should be less than 40 bytes */
printf("your shellcode is too long! 5 points penalty \n");
if (strlen(buffer2)<30) /* the shorter, the better the shell code is */
printf("your shellcode is less than 30 bytes! 10 bonus points\n");
if (strstr(buffer2, "/bin/sh"))
printf("Malicious code detected! 15 points penalty \n");
funcptr = (void *) buffer2;
(*funcptr)(); /* execute your shell code */
return 0 ;
}
Nhiệm vụ của mình là phải thiết kế một binary file chứa shellcode sao cho:
1. Shellcode phải work. Và phải spawn /bin/sh (không chơi shell khác )
2. Shellcode phải nhỏ. Càng nhỏ càng tốt.
3. Shellcode phải né string /bin/sh vì chương trình testshell sẽ kiểm tra string đó.
Các bạn thử viết một cái shellcode thỏa mãn các điều kiện trên xem? Và size nhỏ nhất là bao nhiêu? Các bạn dùng cách nào để có được size nhỏ như vây?
Thông tin thêm về gcc:
Code:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i386-slackware-linux --host=i386-slackware-linux
Thread model: posix
gcc version 3.2.2
khoai
|
|
|
Mr.Dak wrote:
ây da, ông satashi crack được là tốt rồi, ông TQN bắt bẻ làm chi ko biết?
à mà tiện thể cho hỏi soft SpaceMonger 2.1 dùng làm gì vậy? hay ko, để tui còn tải về nghiên cứu
Chính nhờ anh TQN bắt bẻ như vậy mà satashi mới biết mình cần tìm hiểu thêm cái gì khi động đến RE. Không phải chỉ việc patch một chương trình cho chạy mà không check serial là xong. Muốn RE thành công thì phải hiểu rõ tường tận chương trình đó làm gì. Hiểu được rồi thì muốn patch là patch, muốn keygen là có keygen. Mục đính chính của việc RE là hiểu, không phải là patch.
khoai
|
|
|
Chúc mừng rickb.
Hy vọng box "tuyển người -- tìm việc" sẽ giúp đỡ được thêm nhiều thành viên trên HVA.
khoai
|
|
|
lehong,
IDS khác với firewall. Khi cài IDS thì không nhất thiết phải có firewall làm gì.
khoai
|
|
|
examen wrote:
Thì em cũng đang hỏi cái kinh no các pro dùng lâu nay, các pro dùng Distro nào ? Thấy hay ở điểm nào thì nói cho beginner tham khảo. Chắc hẳn các bác cũng đã dùng ko ít hơn 2 Distro Linux nên có thể so sánh các mặt mạnh yếu của chúng. Còn dùng bản nào là do beginner tự quyết.
Cá nhân khoai thấy chẳng có lý do gì dùng slackware cả. Vừa khó dùng, vừa khó cài đặt, vừa khó cập nhật. Sao không dùng các distro khác đơn giản hơn để làm quen với linux. Nên nhớ linux là công cụ giúp mình làm các việc khác.
khoai
|
|
|
meomeo_bebong wrote:
*Tip: tớ có 1 mẹo nhỏ nghe hơi chuối thế này: bạn down cái tài liệu hướng dẫn dùng slackware trên mạng về và lưu vào 1 partition chứa data riêng (đặt label cho partition này hăn hoi).
Khi nào cài slackware thì mount cái phân vùng chứa data ấy lên và lấy tài liệu ra đọc.
= >dùng cách này thì dễ bị người ta gọi mình là script kiddies lắm smilie
Cái này không ai dám gọi là script kiddie trick cả. Ngược lại, làm kiểu này rất đáng khen vì nó thể hiện cá nhân biết quan tâm và làm theo hướng dẫn khi sử dụng một cái gì đó mà mình không quen thuộc. Việc đọc tài liệu và làm theo hướng dẫn (của distro mà mình dùng) là rất đáng hoan nghênh.
khoai
|
|
|
n1t2_8 wrote:
híc híc toàn tiếng anh mà mình thì học dốt tiếng anh có bạn nào chỉ dùm cách dịch sang tiếng việt với chứ mình với vào nghề còn kém và đang cố ghắng mong các bạn giúp đỡ.Thanks nhiều
Chỉ dịch sang tiếng Anh mà các bác ở trên đã phải vất vả, nói chi dịch lại sang tiếng Việt. Học/làm việc liên quan đến IT nên chuẩn bị cho mình trình độ tiếng Anh, ít nhất là ở mức có thể đọc hiểu các tài liệu kỹ thuật.
meomeo_bebong,
Hakin9 là tạp chí bảo mật thuộc hàng hardcore. Các topics thảo luận đi từ đơn giản đến phức tạp. Có nhiều topics nói về các khái niệm khác thông dụng, nhưng phân tích rất sâu và rất thấu đáo. Có thể nói đây là một trong các tạp chí "ngon" nhất mà khoai từng biết. Đừng chỉ nhìn mục lục các topic mà nên đọc xem bên trong người ta nói gì trước khi đánh giá.
khoai
|
|
|
khoai close chủ đề này lại. Lý do: Câu hỏi đã được trả lời.
khoai
|
|
|
Anh TQN, như lời hẹn, hôm nay em có thời gian sẽ trả lời vụ segmentation fault của chương trình vuln.
Code:
$ cat -n vuln.c
1 /*
2 * vuln.c
3 */
4 int
5 main(int argc, char *argv[])
6 {
7 char buf[500];
8 strcpy (buf, argv[1]);
9 return 0;
10 }
$ gcc -o vuln -g vuln.c
$ gdb -q vuln
(gdb) disas main
Dump of assembler code for function main:
0x8048328 <main>: push ebp
0x8048329 <main+1>: mov ebp,esp
0x804832b <main+3>: sub esp,0x208
0x8048331 <main+9>: and esp,0xfffffff0
0x8048334 <main+12>: mov eax,0x0
0x8048339 <main+17>: sub esp,eax
0x804833b <main+19>: sub esp,0x8
0x804833e <main+22>: mov eax,DWORD PTR [ebp+12];Có lẽ là lea của argv[1]
0x8048341 <main+25>: add eax,0x4
0x8048344 <main+28>: push DWORD PTR [eax]; push địa chỉ của argv[1]?
0x8048346 <main+30>: lea eax,[ebp-520] ;load địa chỉ của buf
0x804834c <main+36>: push eax ; push buf lên?
0x804834d <main+37>: call 0x8048268 <strcpy>
0x8048352 <main+42>: add esp,0x10
0x8048355 <main+45>: mov eax,0x0
0x804835a <main+50>: leave
0x804835b <main+51>: ret
End of assembler dump.
(gdb)
Đầu tiên set breakpoint ngay tại strcpy (dòng số 8) và run với một argument là test như sau:
(gdb) b 8
Breakpoint 1 at 0x804833b: file vuln.c, line 8.
(gdb) r test
Starting program: /home/khoai/vuln test
Breakpoint 1, main (argc=2, argv=0xbffffb14) at vuln.c:8
8 strcpy (buf, argv[1]);
(gdb)
Chú ý argv trỏ đến 0xbffffb14, là một địa chỉ trên stack nơi mà input argument 0 sẽ trỏ đến. Địa chỉ của argv này là ở đâu? Và có liên quan đến cái stack của mình như thế nào:
(gdb) x/ &argv
0xbffffac4: 0xbffffb14
(gdb) x/4x $ebp
0xbffffab8: 0xbffffae8 0x40030bb4 0x00000002 0xbffffb14
(gdb) x/4x 0xbffffb14
0xbffffb14: 0xbffffc0d 0xbffffc1e 0x00000000 0xbffffc23
(gdb) x/s 0xbffffc0d
0xbffffc0d: "/home/khoai/vuln"
(gdb) x/s 0xbffffc1e
0xbffffc1e: "test"
Như vậy, ta có thể hình dung phần stack của mình như sau:
High mem <------------------------------------> Low mem
[argv][argc][old EIP][old EBP][...buf...]
argv ->0xbffffb14->0xbffffc0d là string /home/khoai/vuln. Còn argv[1] -> 0xbffffc1e là string "test".Thử chạy lại vuln, giữ nguyên cái breakpoint nhưng lần này không cho tham số nào cả xem cái stack của mình như thế nào:
(gdb) r
Starting program: /home/khoai/vuln
Breakpoint 1, main (argc=1, argv=0xbffffb14) at vuln.c:8
8 strcpy (buf, argv[1]);
(gdb) x/4x $ebp
0xbffffab8: 0xbffffae8 0x40030bb4 0x00000001 0xbffffb14
Lần này, argv -> 0xbffffb14, còn argc = 1. Thử xem ngay tại 0xbffffb14 có gì hấp dẫn:
(gdb) x/4x 0xbffffb14
0xbffffb14: 0xbffffc12 0x00000000 0xbffffc23 0xbffffc52
(gdb) x/s 0xbffffc12
0xbffffc12: "/home/khoai/vuln"
Vậy argv[0] -> "/home/khoai/vuln", còn argv[1] = 0. Khi strcpy được gọi, nó sẽ cố gắng truy cập vào vùng nhớ 0x0, dẫn đến tình trạng segmentation fault.
Ai rãnh rỗi có thể mò thêm tại 0xbffffb1c (argv[0] + 2) có gì hấp dẫn.
khoai
|
|
|
|
|
|
|