process memory layout on linux x86

ในแต่ละ process จะมีการจอง memory ไว้ใช้งาน โดยทุก process จะเห็น memory เป็นโครงสร้างเดียวกันทั้งหมด หรือที่เรียกว่า virtual memory (หน่วยความจำเสมือน) และ memory จะมีการแบ่งส่วนไว้เก็บข้อมูลต่างๆ โดยผมจะพูดถึงส่วนที่สำคัญ ตามรูปข้างล่าง (ถ้าใครไม่รู้ว่า virtual memory ก็คิดซะว่าเป็น memory ไปก่อน แต่ถ้าสนใจ แนะนำให้ไปอ่านหนังสือพวก operating system)

process on memory

  • .text ส่วนนี้ใช้สำหรับเก็บ code ของโปรแกรมที่แปลงเป็น machine code แล้ว โดย default ส่วนนี้จะเป็น read-only (อ่านได้อย่างเดียว) ไม่สามารถเขียนทับได้
  • .bss ส่วนนี้ตัวแปร global ที่มีการ initialize (ถูกกำหนดค่าไว้ตั้งแต่โปรแกรมเริ่ม) เช่น int a = 0;
  • .data ส่วนนี้ตัวแปร global ที่ไม่มีการ initialize (ไม่ถูกกำหนดค่าไว้ตั้งแต่โปรแกรมเริ่ม) เช่น int a;
  • heap เป็นส่วนที่สามารถขยายได้ โดย address จะขยายจาก low address ไปยัง high address เพื่อใช้สำหรับจองและเก็บข้อมูลที่มีขนาดไม่แน่นอน ในขณะที่โปรแกรมทำงานอยู่ โดยคำสั่งที่ใช้ใน c เพื่อควบคุมส่วนนี้คือ malloc() และ free()
  • stack ใช้สำหรับเก็บข้อมูลของการเรียกฟังก์ชัน (function call) เพื่อให้โปรแกรมสามารถกลับมาทำงานต่อได้ หลังจากโปรแกรมจบฟังก์ชันที่เรียก โดย address ของส่วนนี้จะขยายจาก high address ไปยัง low address

จะเห็นว่าในรูป ผมได้มี argv กับ env ใน stack ด้วย ในขณะนี้โปรแกรมจะเริ่มทำงาน โปรแกรมได้มีการเก็บข้อมูล environment (สามารถดูได้จากคำสั่ง env) และ arguments ของโปรแกรมนั้นลงบน stack ด้วย

endian

endian นั้นจะมี big endian กับ little endian โดยจะต่างกันในเรื่องของ byte order เช่นถ้าเราจะเก็บข้อมูล integer ที่มีขนาด 4 bytes (32 bits) ค่า 0×41424344 ใน memory ก็จะเก็บได้ตามรูป

endian

จะเห็นว่า big endian นั้นเก็บข้อมูลเรียงตามปกติที่เราเขียน แต่ little endian นั้นจะเก็บข้อมูลจาก byte ที่มีค่าน้อยที่สุดก่อน
สำหรับ x86 ที่ผมจะพูดถึงในเรื่องการเขียน exploit จะใช้การเก็บข้อมูลเป็นแบบ little endian ถ้าใครไม่เคยอ่านแบบนี้ แรกๆอาจจะงงกันได้ แต่ถ้าได้ทำบ่อยๆ ก็จะคุ้นเคยกับมันไปเอง

stack

ปกติเราคง คุ้นเคยกับ queue (คิว) คือใครต่อแถวก่อนได้ก่อน หรือคนเรียนคอมพิวเตอร์จะเรียกว่า first in first out(เข้าก่อนออกก่อน) ย่อๆว่า fifo ส่วน stack (กองซ้อน) คือวิธีการเก็บข้อมูลแบบนี้ ที่ตรงกับข้ามกับ queue โดยจะเรียกว่า last in first out (เข้าทีหลังออกก่อน) ย่อๆ ว่า lifo โดย stack ที่น่าเคยเห็นกันทุกคนคือ กล่องใส่ซีดีที่มีแกนอยู่ตรงกลาง แผ่นซีดีที่เราใส่เป็นแผ่นสุดท้าย เราต้องเอาออกก่อน ส่วนแผ่นซีดีที่เราใส่เป็นแผ่นแรก จะเป็นแผ่นสุดท้ายที่เราเอาออกมาได้

stack

ใน คอมพิวเตอร์จะมี 2 operation (การกระทำ) หลักๆ คือ push กับ pop โดย push คือการใส่ข้อมูลที่บนสุดของ stack ส่วน pop คือการเอาข้อมูลที่อยู่บนสุดของ stack ออกมา ตามรูปข้างล่าง

ในหัวข้อนี้ ผมได้พูดถึง memory layout ของ process บน linux x86 โดยส่วนที่จะได้พบและใช้บ่อยๆในการเขียน exploit คือส่วนของ stack ที่ผมยังไม่ได้ลงรายละเอียดมากนัก ซึ่งจะมีเพิ่มเติมในหัวข้อถัดๆ ไป

credit : sleepya [ http://thtutz.blogspot.com ]

what is buffer overflow

ในทางโปรแกรมมิ่ง buffer หมายถึง memory ที่จองไว้ สำหรับทำงานต่างๆ เช่น รับข้อมูลจากผู้ใช้ ใส่ข้อมูลเก็บชั่วคราว buffer overflow ก็คือ การใส่ข้อมูลใน buffer เกินที่จองไว้ เช่นเราได้กำหนดขนาด buffer ไว้ 8 bytes แต่เราใส่ข้อมูลไป 12 bytes

buffer overflow เป็นปัญหาหนึ่งในเรื่อง security โดยในเริ่มต้น จะยกตัวอย่างที่ง่ายๆ

C++
# ex_01_1.c
 
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
  int magic = 0;
  char buf[8];
 
  printf("Before strcpy: magic is 0x%08x\n", magic);
  strcpy(buf, argv[1]);
  printf("After strcpy: magic is 0x%08x\n", magic);
  if (magic == 0x55555555)
    printf("Hahaha, you WIN\n");
 
  return 0;
}

build code ตัวอย่างที่ 1 ด้วยคำสั่งข้างล่างไม่ต้องพิมพ์ $ นะครับ (option ของ gcc จะมีการกล่าวถึงในหัวข้อถัดๆ ไป)

SHELL
$ gcc -mpreferred-stack-boundary=2 -fno-stack-protector -o ex_01_1 ex_01_1.c

ใคร ที่มีความรู้เรื่องนี้มาบ้าง ก็คงจะรู้แล้วว่าผมจะให้ทำอะไร จากตัวอย่างนี้ ให้รันโปรแกรม แล้วให้โปรแกรมพิมพ์คำว่า “hahaha, you win” ให้ได้

มาดูเฉลยกันเลยดีกว่า

จะเห็นว่ามีการจอง buffer ไว้ 8 bytes ครั้งแรกขอลองใส่ 8 ตัว

SHELL
$ ./ex_01_1 55555555
before strcpy: magic is 0x00000000
after strcpy: magic is 0x00000000

คราวนี้ลองใส่ 9 ตัว

SHELL
$ ./ex_01_1 555555555
before strcpy: magic is 0x00000000
after strcpy: magic is 0x00000035

จะเห็นว่ามีเลข 35 ออกมาตัวหนึ่ง คราวนี้ลองใส่ 12 ตัว

SHELL
$ ./ex_01_1 555555555555
before strcpy: magic is 0x00000000
after strcpy: magic is 0x35353535

จะ เห็นว่าคราวนี้ magic เป็น 35 หมดเลย ถ้าเราเป็น ascii table ดู จะเห็นว่าเลข 35 ในฐาน 16 คือตัวอักษร “5″ (หลังจากนี้ ผมจะเขียนเลขฐาน 16 เป็น 0×35 หรือ 35h) แต่ที่เราต้องการคือ 55h เมื่อดูที่ ascii table 55h คือตัวอักษร “u” คราวนี้เราลองใส่เป็น u 12 ตัว

SHELL
$ ./ex_01_1 uuuuuuuuuuuu
before strcpy: magic is 0x00000000
after strcpy: magic is 0x55555555
hahaha, you win

ทำได้แล้ว จะเห็นว่าเราทำการ copy ข้อมูลที่รับมาจาก argv[1] ลงที่ buf แต่ค่า magic กับถูกเปลี่ยนไปด้วย ที่เป็นแบบนี้ เพราะว่า magic ได้ถูกจองไว้หลัง buf ซึ่งเมื่อมีการเขียนข้อมูลลง buf เกินไว้ที่จอง ข้อมูลที่เกินก็จะถูกเขียนไปที่ magic
คราวนี้ เรามาลองเพิ่มเติม โดยการใส่ตัว u ไป 16 ตัว

SHELL
$ ./ex_01_1 uuuuuuuuuuuuuuuu
before strcpy: magic is 0x00000000
after strcpy: magic is 0x55555555
hahaha, you win
segmentation fault

segmentation fault คืออะไร ค่านี้เราไม่มีการสั่งให้โปรแกรมแสดงออกมา
segmentation fault เกิดเมื่อโปรแกรมมีการ access memory ที่ os ไม่อนุญาต และที่เกิดขึ้นเพราะว่า เราได้เขียนทับข้อมูลส่วนที่ใช้สำหรับควบคุมการทำงานของโปรแกรม ซึ่งทำให้โปรแกรมทำงานผิดพลาด ซึ่งในกรณีนี้เราจะกลับมาดูอีกครั้ง ว่าเราสามารถทำอะไรได้บ้าง >=)

น่าสนใจไหมครับ… แต่ก่อนที่จะถึงส่วนที่สนุก ผมต้องอธิบายเกี่ยวกับความรู้พื้นฐานสำหรับการเขียน exploit ก่อน เช่น memory layout, assembly, elf, … ซึ่งเรื่องพวกนี้ ผมคิดว่าน่าเบื่อ แต่จำเป็นต้องรู้

สุดท้าย tutorial การเขียน exploit ชุดนี้ สำหรับคนที่รู้ภาษา c เบื้องต้นอยู่แล้ว และพอรู้ linux command บ้าง ก็ถ้าใครอ่านตอนนี้ไม่รู้เรื่อง แล้วสนใจ คงต้องไปหาความรู้เพิ่มเติมนะครับ

credit : sleepya [ http://thtutz.blogspot.com ]

get wifi password on backtrack in vmware

aircrack

อุปกรณ์ที่ต้องใช้

  • usb wireless หรือ wireless อะไรก็ได้ครับที่ support aircrack-ng โดยที่ผมใช้คือ alfa รุ่นนี้ครับ

    usb wireless

  • vmware
  • backtrack

download เครื่องมือ

  • ให้ download vmware มาติดตั้งที่เครื่องก่อนครับ หากใครใช้โปรแกรมจำลองนี้ไม่เป็น ก็ลองไป search ใน google ดูนะครับ
  • หลัง จากติดตั้งเรียบร้อยแล้ว สิ่งที่จำเป็นที่สุดก็คือ os backtrack ซึ่ง backtrack คือ ระบบปฏิบัติการ linux ทั่วๆไป แต่ที่แตกต่างคือมันได้รวมเครื่องมือด้าน security ไว้เพียบก็ต้องไป download backtrack มาเก็บไว้นะครับ ล่าสุดตอนนี้คือ backtrack version 4 ในส่วนนี้ผมขอใช้ backtrack 3 นะครับ เนื่องจากมีอยู่แล้วและไม่จำเป็นต้องไป download version ใหม่เพราะใช้ได้เหมือนกันครับ
  • ติดตั้ง backtrack บน vmware

    edit virtual machine

    • แก้ไข cdrom โดยให้ edit เป็น iso ไฟล์ image backtrack
    • เนื่องจากผมใช้ wireless แบบ usb จึงจำเป็นต้องไปเพิ่ม usb controller

    เริ่มใช้งาน backtrack

    • start vmware ครับ จากนั้น ก็เริ่ม boot เข้าระบบครับ
    • เข้า console ตรวจสอบ interface network โดยใช้คำสั่ง ifconfig และ iwconfig
    • backtrack console

    • จะสังเกตว่าในเครื่องผมไม่มีอุปกรณ์ wireless lan อยู่เลย เนื่องจากยังไม่ได้เรียกใช้งาน usb ผ่าน vmware ให้ไปเลือกดังนี้
    • use usb wireless on vmware menu

    • จะมีรูป usb ปรากฎขึ้นมาที่ status ด้านขวาของโปรแกรม vmware
    • vmware status

    • หลักจากนั้นตรวจสอบใหม่ด้วยคำสั่งเดิม ก็จะพบ interface wireless ชื่ว่า wlan0
    • iwconfig

    • ถ้าพร้อมแล้วเราจะใช้เครื่องมือที่ชื่อว่า aircrack ซึ่งเป็น tool ในการ crack หา key wep และ wpa-psk โดยทางผู้พัฒนา backtrack ได้ compile tool นี้ไว้ให้เรียบร้อยแล้ว
      เปลี่ยนค่า mac address ของ usb wireless เป็น รุ่นอื่นๆ โดยใช้คำสั่ง macchanger -m ตามด้วย mac adress ปลอมและ interface ที่ใช้
    • macchanger

    • จากนั้นเปิดให้ wireless ทำงานได้ตัวมันเองโดยไม่ต้อง connect ใคร โดยใช้คำสั่งว่า airmon-ng start wlan0
    • start wlan0

    • หลังจากเปิด mode monitor แล้ว ต่อไปเราจะทำการ ตรวจสอบ ssid ที่เราต้องการ crack โดยใช้คำสั่งว่า airodump-ng wlan0 เพื่อ scan ระบบ network ที่พบ
      จากภาพการ scan ผมได้เลือกเป้าหมายดังรูป รายละเอียดที่ได้ดังนี้
    •     bssid  = 02:25:9c:dc:06:f8
          ch  = 11
          essid = hotsopt
          และการเข้ารหัสแบบ wep
      

      scan network

    • ให้กด crtl+c เพื่อยกเลิกการ scan ให้ copy mac address ของ access point ไว้คือตรงช่อง bssid
    • ทำการดักจับข้อมูลที่วิ่งอยู่บนอากาศ ที่ connect wireless เป้าหมาย โดยใช้คำสั่งตามรูป เปลี่ยนค่าดังนี้
      • -c 11 คือ channel ของ wireless จากข้อมูล ch
      • –bssid คือ ข้อมูล mac address ของ wireless เป้าหมาย
      • -w hot เป็นการกำหนดให้ save ข้อมูลที่วิ่งอยู่บนอากาศลงในไฟล์ชื่อ hot
    • capture command

    • หลังจากนั้นจะมีหน้าจอแสดงการจับข้อมูล package ที่วิ่งอยู่บนอากาศ ของ essid hotspot จะสังเกตุเห็นว่าเก็บข้อมูล data ได้เพียงแค่ 5 เท่านั้น ซึ่งไม่เพียงพอต่อการนำไปประมวลผลหา key ควรจะมี data ที่ได้ประมาน 20000 ขึ้นไป
    • capture

    • ให้ทำการ handshake ข้อมูลกับ wireless ก่อนเพื่อที่จะได้นำข้อมูลมาใช้ในการ crack โดยจะมีการส่ง syn และ ack หากสำเร็จจะขึ้นข้อความว่า aid:1 โดยใช้คำสั่งตามรูปโดยเปลี่ยนค่าตามนี้
      • -a ตามด้วย bssid
      • -h ตามด้วย mac address ของ usb wireless ของเรา
      • -e ตามด้วย essid
    • handshakehandshake

    • เอา หละครับ เราได้ข้อมูลการ handshake แล้วที่เหลือเรายังขาด data เพื่อใช้ประมวลผล ซึ่งจะทำการเล่นกับ wireless เป้าหมายนิดหน่อยเป็นการส่ง package arp request โดยใช้คำสั่งตามรูป
      • -b ตามด้วย bssid
      • -h ตามด้วย mac address ของ usb wireless ของเรา
    • arp command

    • ต่อ ไปก็นั่งรอจิบกินกาแฟ หอม รอ data วิ่งอย่างเดียวครับ ทั้งนี้ต้องมี client ติดต่อการใช้งานกับ wireless นั้นอยู่ด้วย การทำ arp จึงจะสำเร็จผล เหมือนดังรูป มี client ใช้งานติดต่ออยู่กับ hotspot อยู่ 3 เครื่อง packets ก็วิ่งกันวุ่นเลยครับ
    • send arp request

    • สุดท้ายเมื่อมี data ที่เพียงพอให้ใช้คำสั่ง aircrack-ng โดย
      • -n 128 เป็นการถอดรหัส web แบบ 128 bit
      • -b ตามด้วย bssid
      • hot*.cap เป็นการเรียกไฟล์ data ที่ได้ save ไว้ขึ้นมาอ่านครับ
    • open .cap

    • จากนั้นให้รอครับ เมื่อ data ได้ที่ต่อการ crack แล้ว ระบบก็จะแจ้งผลให้ทราบ
    • key found

      วิธีป้องการจากการ crack, hack wireless

      • ยกเลิกการใช้การเข้ารหัสแบบ wep เปลี่ยนมาใช้แบบ wpa แทน
      • ควรกำหนดรหัส wireless ให้มีความยาวเกิน 10 ตัวโดยมีทั้ง อักษร ตัวเลข และ สัญลักษณ์
      • หากเป็นไปได้ควรกำหนด router หรือ access point ให้มีการกำหนด mac address ที่สามารถใช้งานได้ (mac address filtering)
      • ซ่อน ssid ของ wireless (disable broadcast)
      • ยกเลิกการแจก ip จาก dhcp แต่ให้มีการ set ip ที่เครื่อง client เอง และเปลี่ยน class ip ที่ไม่ใช่แบบมาตรฐาน เช่น 192.168.0 192.168.1 เป็นต้น (disable dhcp)

      credit : http://www.webcms.in.th