ret2libc
Last updated
Last updated
Challenge
áģ tháģ thÃĄch nà y, tôi cháģ nháēn ÄÆ°áģŖc file libc.so.6.
Và 2 file docker Äáģ cháēĄy môi trÆ°áģng trÃĒn mÃĄy cáģ§a mÃŦnh.
CháēĄy file buildnrun.sh Äáģ setup môi trÆ°áģng.
==> Tôi ÄÃŖ ghi Äè 40 byte Äáģ cÃŗ tháģ xáēŖy ra láģi *** stack smashing detected ***.
Overview
Tôi sáēŊ nÃŗi qua váģ láģi nà y 1 chÃēt trÆ°áģc khi báē¯t Äáē§u phÃĸn tÃch bà i nà y. Tôi cÃŗ chÆ°ÆĄng trÃŦnh cÆĄ báēŖn sau:
+ Pháē§n mÅŠi tÃĒn mà u xanh chÃnh là canary vÃŦ canary thÆ°áģng cÃŗ byte \x00 áģ cuáģi
+ Pháē§n mÅŠi tÃĒn mà u và ng cÃŗ tháģ là giÃĄ tráģ 0x1 hoáēˇc giÃĄ tráģ 0x0
+ Ngay bÃĒn dÆ°áģi nÃŗ lÃ
__libc_start_call_main
náēŋu ret áģ hà mmain
.+ BÃĒn dÆ°áģĄi nÃŗ náģ¯a là 1 byte null
+ Và bÃĒn dÆ°áģi byte null nÃŗ là Äáģa cháģ cáģ§a hà m
main()
.
Váēy kÄŠ thuáēt bypass Canary là cáē§n thiáēŋt :>>
Script
Quay tráģ láēĄi váēĨn Äáģ chÃnh. Máģt cÃĸu háģi Äáēˇt ra ÄÃŗ là là m tháēŋ nà o Äáģ cÃŗ tháģ bypass ÄÆ°áģŖc Canary. ThÃŦ ÄÆĄn giáēŖn cháģ là gáģi 1 payload cÃŗ cháģŠa giÃĄ tráģ cáģ§a canary là ÄÆ°áģŖc. Váēy là m tháēŋ nà o Äáģ biáēŋt ÄÆ°áģŖc giÃĄ tráģ canary ÄÃŗ ?
BáēĄn cháģ cáē§n là m ÄÆ°áģŖc 2 viáģc trÃĒn thÃŦ máģi chuyáģn coi nhÆ° xong
Leak Canary
Trong bÆ°áģc nà y, ta pháēŖi leak táģĢng byte ra ngoà i mà n hÃŦnh Äáģ chÆ°ÆĄng trÃŦnh không báģ láģi.
Byte cuáģi cÚng cÃŗ nÃŗ luôn là \x00 nÃĒn ta pháēŖi láēˇp láēĄi táēĨt cáēŖ là 7 láē§n và ta sáēŊ tháģ táģĢ 0x00 --> 0xFF.
TrÆ°áģc tiÃĒn táēĄo khung chÆ°ÆĄng trÃŦnh ÄÃŖ:
ÄÃĸy là pháē§n code cáģ§a tôi Äáģ leak ÄÆ°áģŖc canary theo nhÆ° logic trÃĒn.
Sau khi báēĄn cháēĄy code trÃĒn thÃŦ báēĄn sáēŊ nháēn ÄÆ°áģŖc canary ÄÆ°áģŖc leak ra.
Váēy bÆ°áģc tiáēŋp theo là leak Äáģa cháģ ngay sau canary. CÃŗ tháģ là Äáģa cháģ libc hoáēˇc Äáģa cháģ cáģ§a file binary. NhÆ°ng tôi khÃĄ cháē¯c cháē¯n 80% là libc.
Leak LIBC
BáēĄn hÃŖy nhÃŦn láēĄi pháē§n Overview trÆ°áģc khi là m tiáēŋp.
NhÆ°ng cÃŗ 1 váēĨn Äáģ: ÄÃŗ là ta không cÃŗ file binary Äáģ láēĨy cÃĄc gadget nhÆ° pop rdi
. NÃĒn tôi sáēŊ pháēŖi leak ÄÆ°áģŖc Äáģa cháģ libc Äáģ cÃŗ tháģ láēĨy ÄÆ°áģŖc cÃĄc gadget áģ file libc.so.6
.
stack mà báēĄn tháēĨy áģ trÃĒn kia tôi láēĨy áģ chÆ°ÆĄng trÃŦnh áģ overview mà chÆ°ÆĄng trÃŦnh ÄÃŗ tôi ÄÃŖ biÃĒn dáģch báēąng file libc.so.6 mà Äáģ bà i cho. NÃĒn báēĄn cÃŗ tháģ tháēĨy luôn offset cáģ§a nÃŗ là 0xd90
Náēŋu leak táģĢng byte cáģ§a 1 Äáģa cháģ libc thÃŦ ta cáē§n táēĨt cáēŖ (6-1) láē§n tháģąc hiáģn. VÃŦ 1 Äáģa cháģ thÆ°áģng chiáēŋm 6 bytes. Mà ta ÄÃŖ ÄoÃĄn ÄÆ°áģŖc 1,5 bytes cáģ§a Äáģa cháģ ÄÃŗ ráģi. (tháģąc ra là 2,5 bytes - tÃnh cáēŖ byte 0x7F).
Váēy táģng láē§n tháģąc hiáģn là 5 láē§n. Láē§n Äáē§u tiÃĒn tôi sáēŊ xáģ là 0,5 byte cáģ§a bytes tháģŠ 2 trÆ°áģc. (Là m tÆ°ÆĄng táģą nhÆ° váģi canary)
ÄÃĸy là pháē§n code mà tôi sáēŊ láēĨy 2 byte cuáģi cÚng cáģ§a Äáģa cháģ libc.
Tiáēŋp theo tôi sáēŊ xáģ là 4 bytes tiáēŋp theo.
BáēĄn cÃŗ tháģ thÃĒm ÄoáēĄn nà y và o chÆ°ÆĄng trÃŦnh:
Äáģ nÃŗ in ra nhÆ° tháēŋ nà y:
Libc Base
Sau khi leak ÄÆ°áģŖc Äáģa cháģ cáģ§a libc thÃŦ tôi sáēŊ Äi tÃŦm libc base. Và cÃĄc rop_gadget cáģ§a file libc ÄÃŗ.
Get Shell
Pháē§n nà y là m tÆ°ÆĄng táģą nhÆ° cÃĄc bà i khÃĄc:
Okii, váēy ÄÃŖ khai thÃĄc thà nh công:
Full Payload
Khi mà ta ghi Äè lÃĒn canary thÃŦ láģi nà y sáēŊ xáēŖy ra. Mà giÃĄ tráģ canary cháģ xuáēĨt hiáģn khi stack-protector ÄÆ°áģŖc báēt. Váēy nÃĒn, báēĄn cÃŗ tháģ ÄoÃĄn ÄÆ°áģŖc luôn ráēąng chÆ°ÆĄng trÃŦnh bÃĒn trÃĒn cÅŠng ÄÆ°áģŖc báēt stack giáģng nhÆ° chÆ°ÆĄng trÃŦnh nà y.
VÃ giÃĄ tráģ cáģ§a canary cÃŗ tháģ nhÆ° sau: