For the complete documentation index, see llms.txt. This page is also available as Markdown.

6.1.22 pwn HITCONCTF2016 Sleepy_Holder

ไธ‹่ฝฝๆ–‡ไปถ

้ข˜็›ฎๅค็Žฐ

$ file SleepyHolder
SleepyHolder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=46f0e70abd9460828444d7f0975a8b2f2ddbad46, stripped
$ checksec -f SleepyHolder
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FORTIFY Fortified Fortifiable  FILE
Partial RELRO   Canary found      NX enabled    No PIE          No RPATH   No RUNPATH   Yes     0               2       SleepyHolder
$ strings libc-2.23.so | grep "GNU C"
GNU C Library (Ubuntu GLIBC 2.23-0ubuntu3) stable release version 2.23, by Roland McGrath et al.
Compiled by GNU CC version 5.3.1 20160413.

64 ไฝ็จ‹ๅบ๏ผŒๅผ€ๅฏไบ† Canary ๅ’Œ NX๏ผŒ้ป˜่ฎคๅผ€ๅฏ ASLRใ€‚

ๅœจ Ubuntu-16.04 ไธŠ็Žฉไธ€ไธ‹๏ผš

$ ./SleepyHolder
Waking Sleepy Holder up ...
Hey! Do you have any secret?
I can help you to hold your secrets, and no one will be able to see it :)
1. Keep secret
2. Wipe secret
3. Renew secret
1
What secret do you want to keep?
1. Small secret
2. Big secret
3. Keep a huge secret and lock it forever
1
Tell me your secret:
AAAA
1. Keep secret
2. Wipe secret
3. Renew secret
1
What secret do you want to keep?
1. Small secret
2. Big secret
3. Keep a huge secret and lock it forever
3
Tell me your secret:
CCCC
1. Keep secret
2. Wipe secret
3. Renew secret
3
Which Secret do you want to renew?
1. Small secret
2. Big secret
1
Tell me your secret:
BBBB
1. Keep secret
2. Wipe secret
3. Renew secret
2
Which Secret do you want to wipe?
1. Small secret
2. Big secret
1

่ฟ™ไธ€้ข˜็œ‹่ตทๆฅๅ’ŒไธŠไธ€้ข˜ Secret_Holder ๅทฎไธๅคšใ€‚ๅŒๆ ทๆ˜ฏ smallใ€bigใ€huge ไธ‰็ง secret๏ผŒไธๅŒ็š„ๆ˜ฏ่ฟ™้‡Œ็š„ huge secret ๆ˜ฏไธๅฏไฟฎๆ”นๅ’Œๅˆ ้™ค็š„ใ€‚

้ข˜็›ฎ่งฃๆž

ไธ‹้ขๆˆ‘ไปฌ้€ไธชๆฅ้€†ๅ‘่ฟ™ไบ›ๅŠŸ่ƒฝใ€‚

Keep secret

่ฟ˜ๆ˜ฏไธ€ๆ ท็š„๏ผŒ่ฏฅๅ‡ฝๆ•ฐไฝฟ็”จ calloc() ไธบไธ‰็ง secret ๅˆ†ๅˆซไบ†ไธๅŒๅคงๅฐ็š„ chunk๏ผŒsmall secret ๅฑžไบŽ small chunk๏ผŒbig secret ๅ’Œ huge secret ๅฑžไบŽ large chunkใ€‚ๅœจๅˆ†้…ๅ‰๏ผŒไผšๆฃ€ๆŸฅๅฏนๅบ”็š„ secret ๆ˜ฏๅฆๅทฒ็ปๅญ˜ๅœจ๏ผŒๅณๆฏ็ง chunk ๅช่ƒฝๆœ‰ไธ€ไธชใ€‚ๅฆๅค–็œ‹ๅ‡ฝๆ•ฐๅผ€ๅคด้ƒจๅˆ†๏ผŒhuge secret ๆ˜พ็„ถๅ—ๅˆฐไบ†็‰นๆฎŠๅค„็†ใ€‚

  • small secret: small chunk, 40 bytes

    • small_ptr: 0x006020d0

    • small_flag: 0x006020e0

  • big secret: large chunk, 4000 bytes

    • big_ptr: 0x006020c0

    • big_flag: 0x006020d8

  • huge secret: large chunk, 400000 bytes

    • huge_ptr: 0x006020c8

    • huge_flag: 0x006020dc

Wipe secret

่ฏฅๅ‡ฝๆ•ฐๅช่ƒฝ้‡Šๆ”พ small secret ๅ’Œ big secretใ€‚้‡Šๆ”พ็š„่ฟ‡็จ‹้ฆ–ๅ…ˆๅฐ†ๅฏนๅบ”็š„ chunk ้‡Šๆ”พๆމ๏ผŒ็„ถๅŽ่ฎพ็ฝฎๅฏนๅบ” flag ไธบ 0ใ€‚ๆผๆดžๅพˆๆ˜Žๆ˜พ๏ผŒๅฐฑๆ˜ฏๆฒกๆœ‰ๅฐ† chunk ๆŒ‡้’ˆๆธ…็ฉบ๏ผŒๅญ˜ๅœจๆ‚ฌๆŒ‡้’ˆ๏ผŒๅฏ่ƒฝๅฏผ่‡ด use-after-free๏ผŒ็„ถๅŽๅœจ้‡Šๆ”พๅ‰๏ผŒไนŸๆฒกๆœ‰ๆฃ€ๆŸฅ flag๏ผŒๅฏ่ƒฝๅฏผ่‡ด double-freeใ€‚

Renew secret

่ฏฅๅ‡ฝๆ•ฐๅช่ƒฝๅฏน small secret ๅ’Œ big secret ่ฟ›่กŒไฟฎๆ”น๏ผŒๆ‰€ไปฅ huge secret ๅฐฑๆ˜ฏไธ€ๆฌกๅˆ†้…๏ผŒๆฐธ่ฟœๅญ˜ๅœจไธ”ๅ†…ๅฎนไธๅฏไฟฎๆ”นไบ†ใ€‚่ฟ‡็จ‹ๆ˜ฏ้ฆ–ๅ…ˆๅˆคๆ–ญๅฏนๅบ”็š„ flag ๆ˜ฏๅฆไธบ 1๏ผŒๅณ secret ๆ˜ฏๅฆๅทฒ็ปๅญ˜ๅœจ๏ผŒๅฆ‚ๆžœไธๅญ˜ๅœจ๏ผŒๅˆ™่ฏปๅ…ฅ secret๏ผŒๅฆๅˆ™ๅ‡ฝๆ•ฐ็›ดๆŽฅ่ฟ”ๅ›žใ€‚

ๆผๆดžๅˆฉ็”จ

ๆ€ป็ป“ไธ€ไธ‹ๆˆ‘ไปฌ็Ÿฅ้“็š„ไธœ่ฅฟ๏ผš

  • small secret: small chunk, 40 bytes

    • small_ptr: 0x006020d0

    • small_flag: 0x006020e0

  • big secret: large chunk, 4000 bytes

    • big_ptr: 0x006020c0

    • big_flag: 0x006020d8

  • huge secret: large chunk, 400000 bytes

    • huge_ptr: 0x006020c8

    • huge_flag: 0x006020dc

ๆผๆดž๏ผš

  • double-free๏ผšๅœจ free chunk ็š„ไฝ็ฝฎ calloc ๅฆไธ€ไธช chunk๏ผŒๅณๅฏๅ†ๆฌก free ่ฟ™ไธช chunk

  • use-after-free๏ผš็”ฑไบŽ double-free๏ผŒcalloc ๅ‡บๆฅ็š„้‚ฃไธช chunk ่ขซ่ฎคไธบๆ˜ฏ free ็š„๏ผŒไฝ†ๅฏไปฅไฝฟ็”จ

็œ‹ๅˆฐ่ฟ™้‡Œ่ฏฅ้ข˜ไธŽไธŠไธ€้ข˜็š„ๅทฎๅˆซๅพˆๆ˜Žๆ˜พไบ†๏ผŒๅฐฑๆ˜ฏๆˆ‘ไปฌๆฒกๆœ‰ๅŠžๆณ•ๅ†้€š่ฟ‡ keep(huge) -> wipe(huge) -> keep(huge) ๆฅๅˆฉ็”จ brk() ๅˆ†้…ๅ†…ๅญ˜๏ผŒๅˆถ้€  unsafe unlinkใ€‚

็„ถๅŽๆˆ‘ไปฌๅˆๅœจ _int_malloc() ไธญๅ‘็Žฐไบ†ๅฆไธ€ไธชไธœ่ฅฟ๏ผš

ๅฝ“้œ€ๆฑ‚ chunk ๆ˜ฏไธ€ไธช large chunk ๆ—ถ๏ผŒglibc ไผšๅฐ†ๆŠŠ fastbins ไธญ็š„ chunk ็งป้™ค๏ผŒ่ฎพ็ฝฎ PREV_INUSE ไธบ 0๏ผŒๅˆๅนถ free chunk๏ผŒ็„ถๅŽๆ”พๅˆฐ unsorted binใ€‚ๆŽฅ็€ glibc ๅฐ่ฏ•ไปŽ unsorted bin ไธญๅ–ๅ‡บ chunk๏ผŒ็”ฑไบŽๅคงๅฐไธๅˆ้€‚๏ผŒ่ฟ™ไบ› chunk ๅˆ่ขซๆ”พๅˆฐ small bin ไธญ๏ผš

่ฟ™ๆ—ถๅฐฑๅฏไปฅๅ†ๆฌก้‡Šๆ”พ small secret ่€Œไธ่งฆๅ‘ double-free ็š„ๆฃ€ๆต‹ใ€‚

้‚ฃไนˆไธบไป€ไนˆไธ€ๅฎš่ฆๅฐ† small secret ๆ”พ่ฟ› small bin ๅ‘ข๏ผŸๅ› ไธบๅฝ“ chunk ่ขซๆ”พ่ฟ› small bin ๆ—ถ๏ผŒไผš็›ธๅบ”็š„ไฟฎๆ”น next chunk๏ผˆๅณbig secret๏ผ‰็š„ chunk header๏ผˆ่ฎพ็ฝฎprev_size๏ผŒPREV_INUSE็ฝฎ0๏ผ‰๏ผŒ่€Œๅฝ“ chunk ่ขซๆ”พ่ฟ› fastbins ๆ—ถๆ˜ฏไธไผšๆœ‰่ฟ™ๆ ท็š„ๆ“ไฝœ็š„ใ€‚ๆŽฅไธ‹ๆฅๆˆ‘ไปฌ้œ€่ฆ้€š่ฟ‡ double-free ๅฐ† small secret ๅ†ๆฌกๆ”พ่ฟ› fastbins๏ผˆ่ฟ™ๆ—ถsmall secretๅŒๆ—ถๅญ˜ๅœจไบŽfastbinsๅ’Œsmall binไธญ๏ผ‰๏ผŒๅ†ไปŽ fastbins ไธญๅ–ๅ‡บ small secret๏ผŒๅŽŸๅ› ๅ’ŒไธŠ้ข็ฑปไผผ๏ผŒไปŽ fastbins ไธญๅ–ๅ‡บ chunk ไธไผš่ฎพ็ฝฎ next chunk ็š„ chunk headerใ€‚่ฟ™ๆ ทๆˆ‘ไปฌๆ‰่ƒฝๆญฃ็กฎๅœฐ่งฆๅ‘ unlinkใ€‚

ๅˆถ้€  double-free๏ผš

ไธŠ้ข็š„่ฟ‡็จ‹ไธ€ๆ–น้ข้€š่ฟ‡ malloc_consolidate ่ฎพ็ฝฎไบ† big secret ็š„ PREV_INUSE๏ผŒๅฆไธ€ๆ–น้ข้€š่ฟ‡ double-free ๅฐ† small secret ๆ”พ่ฟ› fastbinsใ€‚

ๅœจ small secret ไธญๅธƒ็ฝฎไธŠไธ€ไธช fake chunk๏ผš

้‡Šๆ”พ big secret ๅณๅฏ่งฆๅ‘ unsafe unlink๏ผš

ไบŽๆ˜ฏๆˆ‘ไปฌๅฐฑ่Žทๅพ—ไบ†ไฟฎๆ”น .bss ๆฎต็š„่ƒฝๅŠ›ใ€‚

ๅŽ้ข็š„่ฟ‡็จ‹ๅฐฑๅ’ŒไธŠไธ€้ข˜ๅฎŒๅ…จไธ€ๆ ทไบ†ใ€‚

leak libc

pwn

ๅผ€ๅฏ ASLR๏ผŒBingo!!!

exploit

ๅฎŒๆ•ด็š„ exp ๅฆ‚ไธ‹๏ผš

ๅ‚่€ƒ่ต„ๆ–™

Last updated