PS3'ün Sabit Disk Şifrelemesini Kırma - Kanıtlamak Amaçlı

Graf Chokolo, doğru düzgün kopya koruma sistemi geliştiremeyince çareyi Hacker'lara saldırmakta bulan Sony tarafından tehdit edilen bir PS3 Hacker'ı. Chokolo -tabii ki takma adı- Sony'i o kadar kızdırmış ki, Alman polisi bu arkadaşın evini tam iki kere bastı ve neyi var neyi yok el koydu. Fakat Chokolo, tüm bunların olacağını bildiği için dosyaları dünyanın en büyük okyanusuna, internete çoktan atmıştı bile. Chokolo şu an ne yapıyor bilmiyorum ama çalışmaları hala daha PS3'ün kırılmasına yeni gelişmelere sahne oluyor.

Bununla ilgili son gelişme de PS3'ün sabit disk şifrelemesinin kırılması oldu. flat_z ve glevand mahlaslı iki hacker'dan tersine mühendislik (RE/Reverse Engineering) konusunda yardım alan naehrwert, bir PC vasıtası ile PS3'ün sabit diskinin şifrelemesini nasıl kıracağımızın adımlarını yayınladı. Sütten ağzı yanan, yoğurdu üfleyerek yer hesabı, naehrwert, yöntem için "kanıtlamak amaçlı" diyor.

İşte PS3'ün sabit diskinin şifrelemesini nasıl kıracağınızın kanıtı:


  • Aşağıdaki bilgiler LV1'deki LPAR1'de yer alan Depolama Yöneticisi ve sb_iso_spu_module.self'ten tersine mühendislik yöntemi ile elde edilmiştir.
  • Bu yöntem ile hacker, kendi PS3 sabit diskinin ve VFLASH'ının şifresini PC vasıtası ile kırmıştır

Sabit Disk Şifreleme:


  • PS3'ün sabit diskindeki verileri şifrelemek için XTS-AES-128 kullanılmaktadır.
  • XTS, CBC değildir! XOR işlemi ile ayarlanmış AES-ECB'dir. AES-CBC sabit disk şifreleme için pratik bir yöntem değildir. Her bir sektör, diğer sektörlerden bağımsız olarak çözülüp şifrelenebilir.
  • XTS-AES hakkında faydalı bilgiler: ntnu.diva-portal.org/smash/get/diva2:347753/FULLTEXT01
  • VFLASH iki defa şifrelenmiştir. İlki ENCDEC anahtarlarıyla ve ardından ATA anahtarlarıyla.
  • Tweak ve data XTS anahtarları 32 byte boyutundadır fakat sadece ile 16 byte kullanılmaktadır.
  • ATA anahtarlarını HDD/VFLASH şifrelemesini test etmek için kullanılan Linux ps3encdec aygıt sürücüsü ile belirleyip kaldırabilirsiniz. Dikkatli olmanızda fayda var. sabit disk bölegeleri veya bölümleri sisteme yerleştirilmişken ATA anahtarları belirleyip kaldırmayın. Sabit diskteki verileri bozabilirsiniz!

ATA anahtarlarının dökümünü alma:


  • sb_iso_spu_module.self modülü ATA anahtarlarını dump edecek şekilde modifiye edilmiştir.
  • Anahtarlar sb_iso_spu_module.self modülüne parametre şeklinde iletilecektir

Program

ATA tweak ve data XTS anahtarlarını spuisofs ile PPU belleğine atacak olan SPU programı:

Kod:
/*
 * Dump ENCDEC keys
 *
 * Copyright (C) 2012 glevand <geoffrey.levand@mail.ru>
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published
 * by the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

.text

start:

    ila        $2, 0x3dfa0
    lr        $sp, $2

    ila        $3, 0x666
    wrch        $ch30, $3

    # wait until we get message from PPU

1:

    brsl        $lr, 0x54    # in_mbox_count
    brz        $3, 1b

    brsl        $lr, 0x54    # in_mbox_read

    ila        $80, 0x3e000
    lqd        $81, 0($80)    # load PPU EA
    ila        $82, 0x0

    lqd        $83, 0($82)
    stqd        $83, 0($80)    # store upper 16bytes of ENCDEC key
    lqd        $83, 0x10($82)
    stqd        $83, 0x10($80)    # store lower 16bytes of ENCDEC key
    lqd        $83, 0x20($82)
    stqd        $83, 0x20($80)    # store ENCDEC IV

    lr        $3, $80
    lr        $4, $81
    il        $5, 0x30
    il        $6, 0x7
    il        $7, 0x20
    brsl        $lr, 0x20    # mfc_dma_xfer

    il        $3, 0x7
    brsl        $lr, 0x38    # mfc_dma_wait

    stop        0x666        # our evil stop code 

/*
 * no input parameters
 */
in_mbox_count:
    rchcnt        $3, $ch29
    bi        $lr

/*
 * no input parameters
 */
in_mbox_read:
    rdch        $3, $ch29
    bi        $lr

/*
 * r3 - LSA
 * r4 - EA
 * r5 - size
 * r6 - tag
 * r7 - cmd
 */
mfc_dma_xfer:

    wrch        $ch16, $3
    wrch        $ch17, $4
    shlqbyi        $4, $4, 4
    wrch        $ch18, $4
    wrch        $ch19, $5
    wrch        $ch20, $6
    wrch        $ch21, $7

    bi        $lr

/*
 * r3 - tag
 */
mfc_dma_wait:

    il        $2, 0
    nop        $127
    hbra        2f, 1f
    wrch        $ch23, $2

1:

    rchcnt        $2, $ch23
    ceqi        $2, $2, 1
    nop        $127
    nop        $127
    nop        $127
    nop        $127
    nop        $127

2:

    brz        $2, 1b
    hbr        3f, $lr
    rdch        $2, $ch24
    il        $2, 1
    shl        $2, $2, $3
    wrch        $ch22, $2
    il        $2, 2
    wrch        $ch23, $2
    rdch        $2, $ch24
    nop        $127

3:

    bi        $lr

Sonuç

Kod:
glevand@debian:~/dump_encdec_keys$ ./dump_encdec_keys ../ps3/metldr ../dump_encdec_keys.self 
spuldrfs found at /mnt
buf1 kernel virtual address d000000004311000
buf2 kernel virtual address d000000004412000
priv2: puint_mb_R 1
problem: pu_mb_R 1
priv2: puint_mb_R 666
problem: spu_status_R 2
glevand@debian:~/dump_encdec_keys$ hexdump -C /mnt/buf2
...
Here are your ENCDEC keys
ENCDEC keys key is at offset 0x0 (32 bytes)
ENCDEC keys IV is at offset 0x20 (16 bytes)
...

Test


  • ATA XTS tweak ve data anahtarlarınızı test etmek için şifrelenmiş sabit disk sektörlerine ihtiyacınız var. İster sabit diskinizi PC'ye bağlayıp dökümünü alabilir, isterseniz de Linux üzerinde ps3vuart-tools kullanıp ATA anahtarlarını temizledikten sonra ps3da'dan döküm alabilirsiniz. Her iki yol da denendi. Fakat ps3vuart-tools ile ATA anahtarlarınızı temizlemeden önce bütün sabit disk bölgelerini monut ettiğinizden emin olun .
  • XTS-AES şifreleme ve çözme için ufak bir uygulama kodlanmış durumda. XTS-AES yazısı bunu uygulamak için güzel bir rehber.
  • Doğru sonuçları elde etmek için doğru sektör numaralarını atlamanız gerek.
  • Aşağıdaki örneklerde de göreceğiniz üzere VFLASH için sektör numarası olarak 0 ve 8 atlanıyor. Çünkü VFLASH sabit diskte 8. sektörden itibaren başlıyor.
  • Bir başka ilginç nokta da, sabit disk bölümlerini şifreleme ve çözme sonrası yarım-kelimelerin yerini değiştirmeniz gerek. Aksi takdirde yanlış sonuçlar elde edeceksiniz. VFLASH sektörleri için bu değişiklik mecburi değil.
  • Bir başka nokta da, VFLASH sektörlerini ilk olarak ATA anahtarları ile çözmeniz gerek, ardından ENCDEC anahtarlarını kullanabilirsiniz.

Sabit diskteki şifrelenmiş ilk sektörden çıkan sonuç:

Kod:
glevand@debian:~/xts_aes$ cat ../hdd_1st_sector_enc.bin  | \
    ./xts_aes -d -k <your ATA XTS data key> -t <your ATA XTS tweak key> -s 0 -r | hexdump -C
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 0f ac e0 ff  00 00 00 00 de ad fa ce  |................|
00000020  00 00 00 00 00 00 00 03  00 00 00 00 00 00 00 02  |................|
00000030  00 00 00 00 00 00 00 08  00 00 00 00 00 08 00 00  |................|
00000040  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 0b  |.p..............|
00000050  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  00 00 00 00 00 08 00 10  00 00 00 00 03 9a 8b 2d  |...............-|
000000d0  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
000000e0  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
000000f0  10 20 00 00 03 00 00 01  00 00 00 00 00 00 00 03  |. ..............|
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000150  00 00 00 00 03 a2 8b 45  00 00 00 00 00 3f ff f8  |.......E.....?..|
00000160  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000170  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001e0  00 00 00 00 03 e2 8b 46  00 00 00 00 19 39 ce 0c  |.......F.....9..|
000001f0  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000200

ENCDEC anahtarlarının dökümünü almak:


  • VFLASH iki kere şifrelenmiştir demiştik. İlk olarak ENCDEC anahtarlarıyla ve ardından da ATA anahtarlarıyla.
  • sb_iso_spu_module.self ile ENCDEC anahtarlarının dökümünü alamazsınız. Zira anahtarlar sadece lv1ldr'de değiller (Ayrıntılı bilgi için: gitorious.ps3dev.net/reversing/lv1ldr/trees/master).
  • Bu iş için modifiye edilmiş bir lv1ldr ve Linux spuldrfs sürücüsü kullanıldı.
  • XTS-AES-128 ile 128bit tweak key ve 128bit data key, aynen ATA anahtarları gibi.
  • lv1ldr'ye iletilen ENCDEC tweak ve data key'leri düz metin biçiminde değil.
  • ENCDEC anahtarları lv1ldr tarafından AES-CBC-256 ile 32byte seed'ler şifrelenrer-k hesaplandı.
  • metldr'dan lv1ldr AES-CBC-256 IV'e geçer ve ENCDEC anahtarlarını açar.
  • ENCDEC anahtarları ps3encdec Linux sürücüsü ile test edilip tekrar ayarlandı ve VFLASH hala sorunsuz çalışıyordu. Anahtarın içinde bazı bitleri değiştirir değiştirmez VFLASH artık kırılamıyordu. Bu da demek oluyor ki anahtarlar doğru.

ENCDEC Key Seed'leri


  • Dökümü alınmış ENCDEC IV ve anahtarını kullanarak seed'lerin şifresini çözün. Böylece VFLASH için ENCDEC anahtarlarınızı elde edeceksiniz.
  • Söz konusu seed'leri lv1ldr'da bulabilirsiniz.

Data key seed:

Kod:
glevand@debian:~$ hexdump -C data1.bin
00000000  e2 d0 5d 40 71 94 5b 01  c3 6d 51 51 e8 8c b8 33  |..]@q.[..mQQ...3|
00000010  4a aa 29 80 81 d8 c4 4f  18 5d c6 60 ed 57 56 86  |J.)....O.].`.WV.|
00000020

Tweak key seed:

Kod:
glevand@debian:~$ hexdump -C data2.bin
00000000  02 08 32 92 c3 05 d5 38  bc 50 e6 99 71 0c 0a 3e  |..2....8.P..q..>|
00000010  55 f5 1c ba a5 35 a3 80  30 b6 7f 79 c9 05 bd a3  |U....5..0..y....|
00000020

Program - ENCDEC anahtarlarını elde etmek için kullanılan SPU programı:

Kod:
/*
 * Dump ENCDEC keys
 *
 * Copyright (C) 2012 glevand <geoffrey.levand@mail.ru>
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published
 * by the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

.text

start:

	ila		$2, 0x3dfa0
	lr		$sp, $2

	ila		$3, 0x666
	wrch		$ch30, $3

	# wait until we get message from PPU

1:

	brsl		$lr, 0x54	# in_mbox_count
	brz		$3, 1b

	brsl		$lr, 0x54	# in_mbox_read

	ila		$80, 0x3e000
	lqd		$81, 0($80)	# load PPU EA
	ila		$82, 0x0

	lqd		$83, 0($82)
	stqd		$83, 0($80)	# store upper 16bytes of ENCDEC key
	lqd		$83, 0x10($82)
	stqd		$83, 0x10($80)	# store lower 16bytes of ENCDEC key
	lqd		$83, 0x20($82)
	stqd		$83, 0x20($80)	# store ENCDEC IV

	lr		$3, $80
	lr		$4, $81
	il		$5, 0x30
	il		$6, 0x7
	il		$7, 0x20
	brsl		$lr, 0x20	# mfc_dma_xfer

	il		$3, 0x7
	brsl		$lr, 0x38	# mfc_dma_wait

	stop		0x666		# our evil stop code 

/*
 * no input parameters
 */
in_mbox_count:
	rchcnt		$3, $ch29
	bi		$lr

/*
 * no input parameters
 */
in_mbox_read:
	rdch		$3, $ch29
	bi		$lr

/*
 * r3 - LSA
 * r4 - EA
 * r5 - size
 * r6 - tag
 * r7 - cmd
 */
mfc_dma_xfer:

	wrch		$ch16, $3
	wrch		$ch17, $4
	shlqbyi		$4, $4, 4
	wrch		$ch18, $4
	wrch		$ch19, $5
	wrch		$ch20, $6
	wrch		$ch21, $7

	bi		$lr

/*
 * r3 - tag
 */
mfc_dma_wait:

	il		$2, 0
	nop		$127
	hbra		2f, 1f
	wrch		$ch23, $2

1:

	rchcnt		$2, $ch23
	ceqi		$2, $2, 1
	nop		$127
	nop		$127
	nop		$127
	nop		$127
	nop		$127

2:

	brz		$2, 1b
	hbr		3f, $lr
	rdch		$2, $ch24
	il		$2, 1
	shl		$2, $2, $3
	wrch		$ch22, $2
	il		$2, 2
	wrch		$ch23, $2
	rdch		$2, $ch24
	nop		$127

3:

	bi		$lr

Linux 3.5.1 üzerinde spuldrfs ile test sürüşü:

Kod:
glevand@debian:~/dump_encdec_keys$ ./dump_encdec_keys ../ps3/metldr ../dump_encdec_keys.self 
spuldrfs found at /mnt
buf1 kernel virtual address d000000004311000
buf2 kernel virtual address d000000004412000
priv2: puint_mb_R 1
problem: pu_mb_R 1
priv2: puint_mb_R 666
problem: spu_status_R 2
glevand@debian:~/dump_encdec_keys$ hexdump -C /mnt/buf2
...
Here are your ENCDEC keys
ENCDEC keys key is at offset 0x0 (32 bytes)
ENCDEC keys IV is at offset 0x20 (16 bytes)
...

Test


  • ENCDEC XTS tweak ve data keylerini test etmek için şifrelenmiş VFLASH sektörlerine ihtiyacınız var. Sektör 8 ile başlayarak ps3da'dan elde edebilirsiniz.
  • Doğru sonuçları elde etmek için doğru sektörleri atlamalısınız.
  • Örnekte de görüldüğü gibi sektör 8 atlanmıştır zira VFLASH sabit diskte bu sektör ile başlar.
  • Giriş sektörü halihazırda ATA anahtarları ile çözülmüştü.

VFLASH'taki şifrelenmiş ilk sektörden çıkan sonuç:

Kod:
glevand@debian:~/xts_aes$ cat ../vflash_1st_sector_enc.bin | \
    ./xts_aes -d -k <your ENCDEC data key> -t <your ENCDEC tweak key> -s 8 | hexdump -C
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 0f ac e0 ff  00 00 00 00 de ad fa ce  |................|
00000020  00 00 00 00 00 00 00 03  00 00 00 00 00 00 00 02  |................|
00000030  00 00 00 00 00 00 00 08  00 00 00 00 00 00 75 f8  |..............u.|
00000040  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  00 00 00 00 00 00 78 00  00 00 00 00 00 06 3e 00  |......x.......>.|
000000d0  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
000000e0  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
000000f0  10 20 00 00 03 00 00 01  00 00 00 00 00 00 00 01  |. ..............|
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000150  00 00 00 00 00 06 b6 00  00 00 00 00 00 00 80 00  |................|
00000160  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000170  10 70 00 00 01 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001e0  00 00 00 00 00 07 36 00  00 00 00 00 00 00 04 00  |......6.........|
000001f0  10 70 00 00 02 00 00 01  00 00 00 00 00 00 00 03  |.p..............|
00000200

Yorumlar

Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…