翻译请让一下翻译麻烦你了

相关穷游锦囊
371091次下载
442584次下载
560320次下载
1316569次下载
564688次下载
1041512次下载
麻烦懂德语的兄弟姐妹帮忙喊一下,以下一段话,google翻译出来实在不明白,谢谢,添麻烦了
由于超1000字,烦请愿意帮忙的兄弟姐妹连我自己回复里的也看一下,翻译一下
wir&freuen&uns,&dass&Sie&für&den&Kauf&Ihrer&letzten&Fahrkarte&Pr?mien-&und&Statuspunkte&sammeln&m?chten.
Leider&liegt&uns&bislang&Ihre&Anmeldung&zum&bahn.bonus-Programm&nicht&vor,&die&aufgrund&neuer&AGB&Voraussetzung&für&die&Teilnahme&ist.
bahn.bonus-Punkte&für&Fahrten,&bei&denen&Sie&Ihren&Sammelwunsch&angegeben&haben,&k?nnen&leider&nur&für&einen&begrenzten&Zeitraum&gespeichert&werden.&Damit&wir&Ihnen&also&die&bahn.bonus-Punkte&für&Ihre&letzten&Fahrten&gutschreiben&k?nnen,&melden&Sie&sich&m?glichst&schnell&unter&www.bahn.de/bahnbonus-anmeldung&an&und&geniessen&Sie&wieder&alle&Vorteile!&Wie&einfach&das&geht,&erfahren&Sie&hier.
用Bahncard买票有积分,bahn.bonus的页面注册,绑定你的Bahncard就可以把之前的积分都录入。
积分能换的最实惠的东西就是州票、周末票了,但分数要求挺高的,我用Bahncard50时不时地买半价票,一年下来也就能换2张州票
wir&freuen&uns,&dass&Sie&für&den&Kauf&Ihrer&letzten&Fahrkarte&Pr?mien-&und&Statuspunkte&sammeln&m?chten.&
我们很高兴的了解到,您在上次购票的时候希望得到积点
Leider&liegt&uns&bislang&Ihre&Anmeldung&zum&bahn.bonus-Programm&nicht&vor,&die&aufgrund&neuer&AGB&Voraussetzung&für&die&Teilnahme&ist.
遗憾的事,至今未看到您铁路积点活动中的注册
bahn.bonus-Punkte&für&Fahrten,&bei&denen&Sie&Ihren&Sammelwunsch&angegeben&haben,&k?nnen&leider&nur&für&einen&begrenzten&Zeitraum&gespeichert&warden
考虑到您的积点愿望,这次的积点将在有限的时间被保留
Damit&wir&Ihnen&also&die&bahn.bonus-Punkte&für&Ihre&letzten&Fahrten&gutschreiben&k?nnen,&melden&Sie&sich&m?glichst&schnell&unter&&an&und&geniessen&Sie&wieder&alle&Vorteile!&
为了使您在上次的购票时产生的积点可以被放入您的账户,请尽快在进行注册登录,并可以享受其他更多的服务
Ihre&bisher&gesammelten&bahn.bonus-Punkte&k?nnen&Sie&mit&ihrer&gültigen&BahnCard&jederzeit&in&Pr?mien&einl?sen,&wie&z.B.&eine&Freifahrt,&hochwertiges&Reisegep?ck&oder&einen&Kinogutschein
您目前已经累计的积点可以在任何时候凭借您有效的Bahncard进行积点兑换,比如免费的旅行,超值旅行背包或者电影票
Wir&freuen&uns&auf&Ihre&Anmeldung&und&wünschen&Ihnen&viel&Spass&mit&bahn.bonus!
我们期望着您的注册并希望您从中得到享受
Sollten&Sie&zukünftig&keine&Zusendung&von&Informationen&und&Angeboten&mehr&wünschen,&k?nnen&Sie&jederzeit&per&E-Mail&an&bahnbonus-service@bahn.de&widersprechen
如果您以后不再希望得到相关的信息,您可以在任何时候写邮件给bahnbonus-service@bahn.de&进行退订
Mit&freundlichen&Grüssen&Ihr&Team&vom&bahn.bonus-Service
铁路积点服务团队向您问好
Ihre&bisher&gesammelten&bahn.bonus-Punkte&k?nnen&Sie&mit&ihrer&gültigen&BahnCard&jederzeit&in&Pr?mien&einl?sen,&wie&z.B.&eine&Freifahrt,&hochwertiges&Reisegep?ck&oder&einen&Kinogutschein.&Wir&freuen&uns&auf&Ihre&Anmeldung&und&wünschen&Ihnen&viel&Spass&mit&bahn.bonus!&Sollten&Sie&zukünftig&keine&Zusendung&von&Informationen&und&Angeboten&mehr&wünschen,&k?nnen&Sie&jederzeit&per&E-Mail&an&bahnbonus-service@bahn.de&widersprechen.&Mit&freundlichen&Grüssen&Ihr&Team&vom&bahn.bonus-Service
同时转发到:
/question/871899.html&&问题详情
麻烦英文高手帮忙翻译一下啊!十分感谢!
空调系统。世邦魏理仕北京IFC物业服务中心非常愿意帮助您尽快熟悉本物业及其一切设施,是为确保高效服务于北京IFC全体客户、便捷,物业服务中心将会以书面形式告知全体客户、设备调试,包括供电系统,以维护全体客户的舒适和安全,同时维护全体客户的共同利益而制定的服务约定,创造宁静,并使您了解如何预防及应对可能发生的应急事项,以及应急安全系统、相关手续等方面提供全面协助、外来访客,其内容也会及时修订增减,以期北京IFC的所有客户、和谐,对于本手册的任何修订、高效、电梯系统,以适应大厦的最新情况。我们希望本手册能够帮助您了解本大厦情况及物业管理公司的服务职责和大厦运营方针;同时为您在迁入之前的装修、国际一流的办公及商业环境、大厦业主。本手册会因时宜而变更、物业公司等各方共同遵守、网络系统、搬迁本《客户服务手册》
您的回答过短,请将答案描述得更清楚一些
回答被采纳后将获得系统奖励20
手机动态登录
请输入用户名/邮箱/手机号码!
请输入密码!
Copyright &
Shang Hai Jing Rong Xin Xi Ke Ji You Xian Gong Si
上海旌荣信息科技有限公司 版权所有
客服电话: 400-850-8888 违法信息举报邮箱:后使用快捷导航没有帐号?
查看: 652|回复: 8
新人欢迎积分0 阅读权限150积分31921精华0UID帖子金钱69111 威望3
UID帖子威望3 多玩草187 草信仰力
Note: This article is part of a 3 part series:
Hacking the PS4, part 1 - Introduction to PS4's security, and userland ROP
Hacking the PS4, part 2 - Userland code execution
Hacking the PS4, part 3 - Kernel exploitation
PS3 4.XX自制破解系统软件教程
/forum-2503-1.html
/programs/view/O2Ws9jCe_Bw/
新人欢迎积分0 阅读权限40积分795精华0UID帖子金钱8107 威望0
Lv.4, 积分 795, 距离下一级还需 205 积分
UID帖子威望0 多玩草0 草信仰力
破解有望了
新人欢迎积分0 阅读权限70积分5435精华0UID8518500帖子金钱29329 威望1
Lv.7, 积分 5435, 距离下一级还需 4565 积分
UID8518500帖子威望1 多玩草260 草信仰力
英文苦手!
新人欢迎积分1 阅读权限50积分2431精华0UID帖子金钱4680 威望0
Lv.5, 积分 2431, 距离下一级还需 69 积分
UID帖子威望0 多玩草0 草信仰力
发表自UC浏览器
音道炎凉 发表于
破解有望了
终止破解了
新人欢迎积分0 阅读权限150积分31921精华0UID帖子金钱69111 威望3
UID帖子威望3 多玩草187 草信仰力
引用 音道炎凉 回复
破解有望了还有点早啊
PS3 4.XX自制破解系统软件教程
/forum-2503-1.html
/programs/view/O2Ws9jCe_Bw/
新人欢迎积分0 阅读权限80积分19570精华0UID帖子金钱82340 威望0
Lv.8, 积分 19570, 距离下一级还需 430 积分
UID帖子威望0 多玩草52 草信仰力
用機翻吧, 例如 :
黑客PS4,第1部分
介绍PS4的安全,外围罗普
注:本文是系列:3部分
黑客PS4,第1部分介绍PS4的安全,外围罗普
黑客PS4,第2部分——用户空间代码执行
黑客PS4,第3部分——内核开发
因为没有任何重大公告关于PS4黑客很长一段时间了,我想解释一下PS4黑客已经走了多远,什么是防止进一步恶化。
我将解释一些安全概念,一般适用于所有现代系统,发现我已经从PS4运行罗普测试。
如果你不是特别熟悉开发,你应该了解我的文章通过堆栈粉碎漏洞利用DS游戏保存文件第一。
你可以下载我的完成设置在这里运行这些测试自己,目前仅为1.76固件。
PS4的背景信息
正如你可能知道的PS4特性定制AMD x86 - 64 CPU核心(8),有大量的研究可用于这种CPU架构,即使这个特定版本可能稍微偏离已知的标准。例如,PFLA(页面错误解放军)发布了一个概念验证实施一个完整的图灵机只使用页面错误和x86 MMU 29 c3国会期间,检查他们的可怕的视频在YouTube上。同样有趣的如果你想运行代码在一个虚拟机和主机CPU上执行指令。
- - - - - -欧亚新闻第3251条
CPU架构,以及有良好的文档记录的该软件用于PS4是开源.
最明显的是,PS4的奥比斯操作系统是基于FreeBSD,就像PS3的OS NetBSD的(部分),但除了FreeBSD 9.0,其他明显的软件包括使用Mono VM,WebKit.
WebKit入口点
WebKit开源布局引擎渲染网页浏览器的iOS,Wii U PS维塔,PS4,3 ds。
尽管如此广泛使用和成熟,WebKit的确有一部分漏洞;您可以通过阅读了解他们中的大多数Pwn2Own全球增记.
特别是,浏览器在PS4固件1.76容易使用WebKit的一个版本cve - 2012 - 3748,出现基于堆的缓冲区溢出的 JSArray::sort(...)方法。
2014年,nas和比邻星宣布他们已经成功港口利用PS4的浏览器,PoC的代码发布公开作为第一个入口点到PS4黑客。
这给了我们任意的读和写访问所有WebKit过程可以读和写,可以用来转储模块,和改写返回地址栈上的,让我们控制程序计数器(ROP)。
从那时起,许多其他的漏洞被发现在WebKit,这可能会使在以后的固件模块倾销和罗普PS4,但作为写作的,没有人移植这些利用PS4公开。
罗普是什么?
与原始设备等DS,PS4内核控制不同区域的属性的内存。页面标记为可执行的内存不能被覆盖,和页面标记为可写的内存不能被执行,这就是所谓的数据执行预防(DEP).
这意味着我们不能仅仅复制一个有效载荷送入内存和执行它。然而,我们可以执行的代码已经加载到内存中,标记为可执行文件。
它不会是非常有用的跳转到一个地址如果我们不能编写自己的代码来解决,所以我们使用罗普。
Return-Oriented编程(ROP)只是一个堆叠扩展传统的摧毁,而是只覆盖一个价值的个人电脑将跳转到,我们可以一起链不同的地址,被称为小玩意。
小工具通常只是一个预期的指令后面跟着 ret.
在x86_64组装,当一个 ret指令,一个64位的值从栈中弹出,PC跳跃;因为我们可以控制堆栈,我们可以让每一个 ret指令跳转到下一个理想的工具。
例如,从 0x80000可能包含指令:
mov rax, 0
从 0x90000可能包含指令:
mov rbx, 0
如果我们覆盖一个返回地址栈上的控制 0x80000紧随其后的是 0x90000,然后当第一 ret达到指令执行会跳 mov rax, 0之后,立即,下???个 ret指令将会流行 0x90000从堆栈和跳转 mov rbx, 0.
有效链将两种 rax和 rbx为0,就好像我们所写的代码到一个位置,并执行它。
罗普链不仅仅局限于地址列表;假设 0xa0000包含这些指令:
我们可以设置链中的第一项 0xa0000和下一项任何想要的值 rax.
产品还没有结束 ret指令,我们可以使用小工具在一个结束 jmp:
add rax, 8
通过使 rcx指向一个 ret指令,链将继续正常:
chain.add(&pop rcx&, &ret&);
chain.add(&add rax, 8; jmp rcx&);
有时候你无法找到确切的产品,你需要的,但与其他指令。例如,如果你想设置 r8的东西,但只有这个小玩意,你必须设置 r9一些假的值:
尽管你可能与你如何写创意罗普链,人们普遍认为在一个足够大足够的代码转储,将会有足够的产品turing功能;这使得罗普绕过DEP的可行的方法。
认为罗普写一本书的新篇章,只用单词出现在句子前面的章节。
很明显从大多数句子的结构,我们可能无法找到“和”或“但是”这样的词出现在任何句子的最后,但我们需要这些连接词来写任何有意义的事情。
然而,很有可能一个句子结束了“砂”。虽然作者只用于读取这个词的“s”,如果我们从a开始阅读,它将作为一个完全不同的词出现巧合的是,“和”。
这些原则也适用于罗普。
因为几乎所有的结构函数是这样的:
; Save registers
push& & rbp
mov& &&&rbp, rsp
push& & r15
push& & r14
push& & r13
push& & r12
push& & rbx
sub& &&&rsp, 18h
; Function body
; Restore registers
add& &&&rsp, 18h
pop& &&&rbx
pop& &&&r12
pop& &&&r13
pop& &&&r14
pop& &&&r15
pop& &&&rbp
你只希望能找到 pop小工具,或更很少,类似 xor rax, rax返回之前设置返回值为0。
有一个比较:
cmp [rax], r12
以来没有任何意义的结果比较并不是使用的功能。然而,还有一种可能性,我们可以找到这样的产品。
x86_64指令是类似于变量的长度,话说,可能意味着完全不同的东西根据解码开始。
x86_64架构是一个变长CISC指令集。Return-oriented编程的x86_64利用指令集是非常“密集”,也就是说,任何可以看作随机字节序列可能是一些有效的x86_64的指令集。
- - - - - -维基百科
为了说明这一点,看看这个函数的结束的WebKit模块:
BE0D& && && && && &&&mov& &&&eax, [rdx+8]
BE10& && && && && &&&mov& &&&[rsi+10h], eax
BE13& && && && && &&&or& && &byte ptr [rsi+39h], 20h
BE17& && && && && &&&ret
现在看看代码看起来就像如果我们开始解码 0x52be14:
BE14& && && && && &&&cmp& &&&[rax], r12
BE17& && && && && &&&ret
尽管这段代码从来就没有被执行,它是在一个区域的内存被标记为可执行文件,所以它是完全有效的使用设备。
当然,这将是incredibily费时看每一个可能的解释方式之前,每一个代码 ret手动指令;这就是为什么工具存在为你这样做。我使用搜索罗普的小玩意rp + +,生成一个文本文件装满产品只使用:
rp-win-x64 -f mod14.bin --raw=x64 --rop=1 --unique & mod14.txt
分割的缺点
如果我们试图执行一个可执行的页面的内存,或者试着写一个non-writable页面的内存,段错误将会发生。
例如,试图执行代码在堆栈上,这只被映射为读和写:
setU8to(chain.data + 0, 0xeb);
setU8to(chain.data + 1, 0xfe);
chain.add(chain.data);
并试图写代码,这只被映射为读和执行:
setU8to(moduleBases[webkit], 0);
如果出现段错误,一条消息说“没有足够的自由系统内存”将会出现,和页面无法加载:
可能有其他的原因消息显示,如执行无效的指令或一个未实现的系统调用,但细分故障是最常见的。
地址空间布局随机化(本)是一种安全技术导致的基地地址模块不同每次你启动PS4。
已经报告给我很旧的固件(1.05)没有启用本主题,但它在固件1.70之前的某个时候推出。注意内核本不启用(至少1.76的固件和较低),这将被证明是在本文后面。
对于大多数利用本将是一个问题,因为如果你不知道地址的设备在内存中,你会不知道写什么堆栈。
幸运的是,我们并不局限于写静态罗普链。我们可以使用JavaScript来读取模块表,这将告诉我们所有的基地地址加载模块。使用这些基地,我们可以计算我们所有的产品在我们的地址触发罗普执行,绕过了本。
模块的模块表还包括文件名:
WebProcess.self
libkernel.sprx
libSceLibcInternal.sprx
libSceSysmodule.sprx
libSceNet.sprx
libSceNetCtl.sprx
libSceIpmi.sprx
libSceMbus.sprx
libSceRegMgr.sprx
libSceRtc.sprx
libScePad.sprx
libSceVideoOut.sprx
libScePigletv2VSH.sprx
libSceOrbisCompat.sprx
libSceWebKit2.sprx
libSceSysCore.sprx
libSceSsl.sprx
libSceVideoCoreServerInterface.sprx
libSceSystemService.sprx
libSceCompositeExt.sprx
尽管PS4主要使用(签署)PPU浮动可执行模块([S]插件可以)格式,一些字符串引用(签署)可执行文件和链接格式([S]精灵)对象文件也可以被发现的 libSceSysmodule.sprx转储文件,如 bdj.elf, web_core.elf和 orbis-jsc-compiler.self。这种组合模块和对象的类似于用于PSP和PS3。
您可以查看所有可用模块的完整列表(不仅是那些由浏览器加载) libSceSysmodule.sprx。我们可以通过几个负载和转储一些索尼的定制的系统调用,这将在本文后面加以解释。
使用JavaScript编写和执行动态罗普链给了我们一个巨大的优势一个标准的缓冲区溢出攻击。
以及绕过本,我们也可以阅读浏览器的用户代理,并提供一个不同的罗普链不同的浏览器版本,让我们利用可能的最高的兼容性。
我们甚至可以使用JavaScript来阅读记忆在我们设备的地址来检查他们是正确的,给我们几乎完美的可靠性。
写作罗普链动态,而不是生成一个脚本之前,就有意义。
我创建了一个JavaScript框架编写罗普链,JuSt-ROP,因为这一原因。
JavaScript警告
使用JavaScript代表数字ieee - 754双精度(64位)格式。这为我们提供了53位精度,这意味着它是不可能代表每一个64位的值,近似将会用于一些。
如果你只需要一个64位的值设置为低的东西, 256,然后 setU64to会没事的。
但在情况下,您需要编写一个缓冲区或结构的数据,有可能将某些字节写不正确,如果一直用64位的数据块。
相反,你应该写在32位数据块(记住究竟是小端字节序),以确保每一个字节都是恰当的。
有趣的是,究竟使用相同的调用协定为Linux和ms - dos系统调用参数存储在寄存器中,而不是传统的UNIX(FreeBSD在默认情况下使用),使用参数存储在堆栈:
rax——系统调用
r10——参数4
r8——参数5
r9——参数6
我们可以试着用以下JuSt-ROP执行任何系统调用方法:
this.syscall = function(name, systemCallNumber, arg1, arg2, arg3, arg4, arg5, arg6) {
& & & & console.log(&syscall & + name);
& & & & this.add(&pop rax&, systemCallNumber);
& & & & if(typeof(arg1) !== &undefined&) this.add(&pop rdi&, arg1);
& & & & if(typeof(arg2) !== &undefined&) this.add(&pop rsi&, arg2);
& & & & if(typeof(arg3) !== &undefined&) this.add(&pop rdx&, arg3);
& & & & if(typeof(arg4) !== &undefined&) this.add(&pop rcx&, arg4);
& & & & if(typeof(arg5) !== &undefined&) this.add(&pop r8&, arg5);
& & & & if(typeof(arg6) !== &undefined&) this.add(&pop r9&, arg6);
& & & & this.add(&mov r10, syscall&);
一定要预先设置一些空闲内存堆栈的基础:
this.add(&pop rbp&, stackBase + returnAddress + 0x1400);
使用系统调用可以告诉我们很多关于PS4内核。不仅如此,使用系统调用是最有可能的唯一途径,我们可以与内核交互,从而可能引发内核开发。
如果你是逆向工程模块识别索尼的一些定制的系统调用,您可能会遇到另一个调用协定:
有时索尼执行系统调用通过定期系统调用0(这通常并没有在FreeBSD),与第一个参数(rdi)控制应该执行哪个系统调用:
rdi——系统调用
r8——参数4
r9——参数5
索尼这样做可能很容易兼容的函数调用约定。例如:
.global syscall
& & & & xor& &&&rax, rax
& & & & mov& &&&r10, rcx
& & & & syscall
& & & & ret
使用这个,他们可以执行系统调用从C使用函数调用约定:
int syscall();
int getpid(void) {
& & & & return syscall(20);
在编写罗普链时,我们可以使用公约:
// Both will get the current process ID:
chain.syscall(&getpid&, 20);
chain.syscall(&getpid&, 0, 20);
很高兴知道这一点,因为我们可以用哪个更方便的小工具都是可用的。
通过使用系统调用20,getpid(空白),我们可以学到很多关于内核。
这个系统调用在所有工作的事实告诉我们,索尼没有混合的系统调用的数量通过模糊的安全(BSD许可下他们可以做这没有发布新的系统调用数字)。
所以,我们会自动有一个PS4内核的系统调用列表去尝试。
其次,通过调用 getpid(),重新启动浏览器,再次调用,我们得到一个返回值2高于前一个值。
这告诉我们,互联网浏览器应用程序实际上包含两个独立的过程:WebKit核心(我们接管),处理解析HTML和CSS,解码图像,例如,和执行JavaScript和另一个来处理一切:显示图形,控制器接收输入,管理历史和书签等。
此外,尽管FreeBSD的支持PID随机自4.0以来,连续PID配置是默认的行为。
PID的配置被设置为默认的行为表明,索尼可能没有添加任何额外的安全增强鼓励的此类项目HardenedBSD.
有多少自定义系统调用吗?
的去年标准FreeBSD 9系统调用是 wait6、数量 532,任何高于这一定是一个定制的索尼系统调用。
调用索尼的定制系统调用不正确的参数将会返回错误 0x16, &Invalid argument&;然而,任何兼容性或未执行的系统调用将报告“没有足够的自由”系统内存错误。
通过试验和错误,我已经发现,系统调用号 617是最后一个索尼系统调用,任何更高的是未实现的。
由此,我们可以得出结论,有85定制索尼系统调用PS4的内核(617 - 532)。
这是明显低于PS3,近1000的系统调用在总。这表明我们有更少的可能的攻击向量,但它可能更容易文档的所有系统调用。
此外,85这些系统调用总是返回 0x4e, ENOSYS,这表明他们可能只是调用从开发单位,离开我们只有76可用。
76年,只有45所引用 libkernel.sprx(所有非核心执行系统调用应用程序使用),所以开发人员只有45他们可以使用定制的系统调用。
有趣的是,尽管只有45旨在被称为(因为 libkernel.sprx有包装的),其他的一些31仍可以从网络浏览器调用过程。它更有可能为这些意想不到的系统调用有漏洞,因为他们可能有最少的测试。
libkernel.sprx
识别由libkernel如何使用自定义的系统调用,您必须首先记住,它只是一个修改标准FreeBSD 9.0库。
这里有一个提取的 _libpthread_init从thr_init.c:
* Check for the special case of this process running as
* or in place of init as pid = 1:
if ((_thr_pid = getpid()) == 1) {
& & & & /*
& & & &&&* Setup a new session for this process which is
& & & &&&* assumed to be running as root.
& & & &&&*/
& & & & if (setsid() == -1)
& & & & & & & & PANIC(&Can't set session ID&);
& & & & if (revoke(_PATH_CONSOLE) != 0)
& & & & & & & & PANIC(&Can't revoke console&);
& & & & if ((fd = __sys_open(_PATH_CONSOLE, O_RDWR)) & 0)
& & & & & & & & PANIC(&Can't open console&);
& & & & if (setlogin(&root&) == -1)
& & & & & & & & PANIC(&Can't set login to root&);
& & & & if (_ioctl(fd, TIOCSCTTY, (char *) NULL) == -1)
& & & & & & & & PANIC(&Can't set controlling terminal&);
可以找到相同的功能在偏移量 0x215F0从 libkernel.sprx。这就是上面提取看起来从libkernel转储中:
call& & getpid
mov& &&&cs:dword_5B638, eax
cmp& &&&eax, 1
jnz& &&&short loc_2169F
call& & setsid
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A0C
lea& &&&rdi, aDevC &/dev/console&
call& & revoke
test& & eax, eax
jnz& &&&loc_21A24
lea& &&&rdi, aDevC &/dev/console&
mov& &&&esi, 2
xor& &&&al, al
call& & open
mov& &&&r14d, eax
test& & r14d, r14d
js& && &loc_21A3C
lea& &&&rdi, aRoot& && & ; &root&
call& & setlogin
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A54
mov& &&&edi, r14d
mov& &&&esi, h
xor& &&&edx, edx
xor& &&&al, al
call& & ioctl
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A6C
扭转模块转储分析系统调用
libkernel并非完全开源;还有很多自定义代码可以帮助披露索尼的一些系统调用。
虽然这个过程将取决于你查找的系统调用,对一些人来说,它是相当容易的基本理解传递给它的参数。
将在系统调用包装器 libkernel.sprx,并将几乎总是遵循这个模板:
DB70 syscall_601& &&&proc near
DB70& && && && && &&&mov& &&&rax, 259h
DB77& && && && && &&&mov& &&&r10, rcx
DB7A& && && && && &&&syscall
DB7C& && && && && &&&jb& && &short error
DB7E& && && && && &&&retn
DB7F error:
DB7F& && && && && &&&lea& &&&rcx, sub_DF60
DB86& && && && && &&&jmp& &&&rcx
DB86 syscall_601& &&&endp
请注意, mov r10, rcx指令并不意味着系统调用有至少4参数;所有系统调用包装器,甚至那些不带任何参数,如 getpid.
一旦你发现包装器,您可以查找xrefs:
1D50& && && && && &&&mov& &&&edi, 10h
1D55& && && && && &&&xor& &&&esi, esi
1D57& && && && && &&&mov& &&&edx, 1
1D5C& && && && && &&&call& & syscall_601
1D61& && && && && &&&test& & eax, eax
1D63& && && && && &&&jz& && &short loc_11D6A
查找很好一些,只是为了确保注册没有修改的东西无关:
1A28& && && && && &&&mov& &&&edi, 9
1A2D& && && && && &&&xor& &&&esi, esi
1A2F& && && && && &&&xor& &&&edx, edx
1A31& && && && && &&&call& & syscall_601
1A36& && && && && &&&test& & eax, eax
1A38& && && && && &&&jz& && &short loc_11A3F
一致,系统调用约定的前三个寄存器(rdi, rsi, rdx)被修改之前调用调用,我们可以得出合理的信心,需要三个参数。
为了清楚起见,我们将复制JuSt-ROP的电话:
chain.syscall(&unknown&, 601, 0x10, 0, 1);
chain.syscall(&unknown&, 601, 9, 0, 0);
如同大多数系统调用,它将返回0成功,所看到的 jz条件后 test荷兰国际集团(ing)返回值。
查找任何超出比参数的数量需要更深入分析代码的调用之前和之后理解上下文,但这应该能帮助您入门。
蛮迫使系统调用
尽管逆向工程模块转储的最可靠的方法是识别系统调用,有些没有引用转储我们所以我们需要分析他们盲目。
如果我们想这一定系统调用可能需要特定的参数,我们可以暴力破解所有系统调用返回一个特定值(0对于我们选择的成功)的参数,并忽略所有返回一个错误。
我们也可以通过0对所有参数,和蛮力所有系统调用返回有用错误等 0xe, &Bad address&,这将表明,他们至少需要一个指针。
首先,我们需要尽快执行罗普链页面加载。我们可以通过附加功能 body元素的 onload:
&body onload=&exploit()&&
接下来,我们将需要执行一个特定的系统调用取决于一个HTTP GET值。虽然这可以用JavaScript,我将演示如何使用PHP为简单起见:这样做
var Sony = 533;
chain.syscall(&Sony system call&, Sony + &?php print($_GET[&b&]); ?&, 0, 0, 0, 0, 0, 0);
chain.write_rax_ToVariable(0);
一旦系统调用执行,我们可以检查返回值,如果它不是有趣的,页面重定向到下一个系统调用:
if(chain.getVariable(0) == 0x16) window.location.assign(&index.php?b=& + (&?php print($_GET[&b&]); ?& + 1).toString());
运行该页面 ?b=0附加到蛮力结束后将开始从第一个索尼系统调用。
虽然这种方法需要大量的实验,通过不同的值的一些系统调用蛮干和分析发现新返回值,有一些系统调用这部分你应该能够识别。
系统调用538
作为一个例子,我将看看538年系统调用,不需要依赖任何模块转储。
这些返回值取决于作为第一个参数传递:
0 - 0x16, &Invalid argument&
1 - 0xe, &Bad address&
指针0 s - 0x64最初,但每次页面刷新这个值增加1
其他潜在的论证尝试将PID,线程ID和文件描述符。
尽管大多数系统调用将返回 0成功,由于性质的每次调用后返回值增加,这似乎是分配资源数量,例如一个文件描述符。
接下来要做的是看看执行系统调用之前和之后的数据,是否已被写入。
由于没有改变的数据,我们可以假设它是一个输入。
然后我试着通过一个长字符串作为第一个参数。你应该试试这个每输入你发现因为发现缓冲区溢出的可能性。
writeString(chain.data, &aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&);
chain.syscall(&unknown&, 538, chain.data, 0, 0, 0, 0, 0);
这是返回值 0x3f, ENAMETOOLONG。但不幸的是,这个系统调用正确限制名称(32字节包括零truncator),但它确实告诉我们,这是期待一个字符串,而不是一个结构体。
我们现在有几个可能性这个系统调用是什么做的,最明显的是相关的文件系统(如自定义 mkdir或 open),但这似乎特别不太可能看到作为一个资源分配之前我们写任何数据的指针。
测试是否第一个参数是一个路径,我们可以把多个 /人物,看看这允许更长的字符串:
writeString(chain.data, &aaaaaaaaaa/aaaaaaaaaa/aaaaaaaaaa&);
chain.syscall(&unknown&, 538, chain.data, 0, 0, 0, 0, 0);
因为这也回报 0x3f,我们可以假设第一个参数不是一个路径,它是一个名字被分配一个序列标识符的东西。
一些系统调用进行分析之后,我发现下面的所有共享这种相同的行为:
我们到目前为止,从信息几乎是不可能的,以确定这些系统调用具体所做的事情,但是当你进行更多的测试,进一步信息将逐渐被揭示。
为您节省一些时间,系统调用538是分配一个事件标志(和它不取一个名字)。
使用常识的内核是如何工作的,你可以猜,然后验证,系统调用是什么分配(信号量,互斥锁等)。
倾销额外的模块
我们可以把额外的模块通过以下阶段:
模块的基地址
我沉闷地尝试加载和倾销的每一个模块从网络浏览器中手动,并公布结果psdevwiki。所有的模块与是的旁边可以甩了这个方法。
加载模块我们将需要使用 sceSysmoduleLoadModule函数 libSceSysmodule.sprx + 0x1850。第一个参数是该模块ID加载,另3应该通过0。
以下JuSt-ROP方法可以用来执行一个函数调用:
this.call = function(name, module, address, arg1, arg2, arg3, arg4, arg5, arg6) {
& & & & console.log(&call & + name);
& & & & if(typeof(arg1) !== &undefined&) this.add(&pop rdi&, arg1);
& & & & if(typeof(arg2) !== &undefined&) this.add(&pop rsi&, arg2);
& & & & if(typeof(arg3) !== &undefined&) this.add(&pop rdx&, arg3);
& & & & if(typeof(arg4) !== &undefined&) this.add(&pop rcx&, arg4);
& & & & if(typeof(arg5) !== &undefined&) this.add(&pop r8&, arg5);
& & & & if(typeof(arg6) !== &undefined&) this.add(&pop r9&, arg6);
& & & & this.add(module_bases[module] + address);
所以,加载 libSceAvSetting.sprx (0xb):
chain.call(&sceSysmoduleLoadModule&, libSysmodule, 0x1850, 0xb, 0, 0, 0);
像大多数系统调用,这应该返回 0在成功。看到加载模块ID分配,我们可以使用索尼的一个定制的系统调用,号码 592,目前得到的列表加载模块:
var countAddress = chain.
var modulesAddress = chain.data + 8;
// System call 592, getLoadedModules(int *destinationModuleIDs, int max, int *count);
chain.syscall(&getLoadedModules&, 592, modulesAddress, 256, countAddress);
chain.execute(function() {
& & & & var count = getU64from(countAddress);
& & & & for(var index = 0; index & index++) {
& & & & & & & & logAdd(&Module: 0x& + getU32from(modulesAddress + index * 4).toString(16));
运行这个没有加载任何额外的模块将产生以下列表:
0x0, 0x1, 0x2, 0xc, 0xe, 0xf, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1e, 0x37, 0x59
但是如果我们运行后加载模块 0xb,我们看到了一个额外的条目, 0x65。记住,模块ID是不一样的加载模块ID。
我们现在可以使用另一个索尼的定制的系统调用,号码 593一个加载模块ID和一个缓冲区,和填充缓冲区的信息加载模块,包括它的基地址。总是自加载模块ID 0x65,我们可以硬编码成链,而不必从模块列表中存储结果。
缓冲区的大小必须从结构应该返回,否则错误 0x16将返回, &Invalid argument&:
setU64to(moduleInfoAddress, 0x160);
chain.syscall(&getModuleInfo&, 593, 0x65, moduleInfoAddress);
chain.execute(function() {
& & & & logAdd(hexDump(moduleInfoAddress, 0x160));
它将返回 0在成功,填满缓冲区结构可以读一样:
var name = readString(moduleInfoAddress + 0x8);
var codeBase = getU64from(moduleInfoAddress + 0x108);
var codeSize = getU32from(moduleInfoAddress + 0x110);
var dataBase = getU64from(moduleInfoAddress + 0x118);
var dataSize = getU32from(moduleInfoAddress + 0x120);
我们现在拥有一切我们需要转储模块!
dump(codeBase, codeSize + dataSize);
还有另一个索尼系统调用,号码 608以类似的方式工作 593,但提供了稍微不同的加载模块的信息:
setU64to(moduleInfoAddress, 0x1a8);
chain.syscall(&getDifferentModuleInfo&, 608, 0x65, 0, moduleInfoAddress);
logAdd(hexDump(moduleInfoAddress, 0x1a8));
目前还不清楚这些信息是什么。
浏览文件系统
PS4使用标准FreeBSD 9.0系统要求阅读的文件和目录。
然而,当使用 read对于一些目录等 /dev/将工作,其他人,比如 /将会失败。
我不知道这是为什么,但如果我们使用 gendents而不是 read的目录,它会工作更可靠:
writeString(chain.data, &/dev/&);
chain.syscall(&open&, 5, chain.data, 0, 0);
chain.write_rax_ToVariable(0);
chain.read_rdi_FromVariable(0);
chain.syscall(&getdents&, 272, undefined, chain.data + 0x10, 1028);
这是合成记忆:
00 05 00 0000&&........dipsw...
00 04 6e75 6c6c &&........null....
00 04 7a65 726f &&........zero....
00 0b00 0000&&........fd......
00 0a05 e00
0000&&....stdin.......
00 0a06 74
0000&&....stdout......
00 0a06 72 00&&....stderr......
00 6d 00 0000&&....dmem0.......
00 6d 00 0000&&....dmem1.......
00 e64 6f6d 00&&....random......
00 0a07 6f 6d00 &&....urandom.....
00 020b f73
7400&&....deci_stdout.
00 0b f73 7464&&........deci_std
72 00 65 6369&&err.........deci
f74 00 00 0209&&_tty2...........
00 1a00 0000&&deci_tty3.......
00 69 5f74 00&&....deci_tty4...
b00 09 f74 7479&&........deci_tty
09 &&5...........deci
f74 00 1d00 09&&_tty6...........
00 1e00 0000&&deci_tty7.......
00 020a f74 00&&....deci_ttya0..
f00 0a f74 7479&&........deci_tty
30 00 65 6369&&b0.. .......deci
f74 00 00 020a&&_ttyc0..&.......
00 &&deci_stdin..#...
c00 00 00 0a04&&....bpf.$.......
70 00 c00 0203&&bpf0....).......
08 f&&hid.,.......sce_
a6c 00 2e00 04&&zlib............
74 00 c00 0202&&ctty....4.......
63 00 0c00 00&&gc..9.......dce.
a00 05 00 0000&&:.......dbggc...
d00 &&&.......ajm.A...
c00 00 c00 0203&&....uvd.B.......
63 00 e6f 7469&&vce.E.......noti
69 f6e 00 0000&&fication0...F...
00 020d 6e6f 61 e&&....notification
00 00 73 6263&&1...P.......usbc
6c 00 61 6d65&&tl..V.......came
61 00 0c00 00&&ra..........rng.
00 c900 0000&&........usb.....
00 0a07 2e 00&&....ugen0.4.....
00 00 00 0000&&................
你可以阅读一些设备,例如:阅读 /dev/urandom将随机数据填满记忆。
还可以解析这个内存来创建一个干净的条目列表,看看 browser.html在存储库中为一个完整的文件浏览器:
不幸的是,由于沙盒我们没有完整的访问文件系统。试图读取文件和目录确实存在但限制会给你错误2 ENOENT, &No such file or directory&.
我们有很多有趣的东西虽然包括加密保存数据,奖杯,和帐户信息。我将会在我的下一篇文章中更多的文件系统。
以及相关的文件系统调用失败对于特定的路径,还有其他原因系统调用失败。
大多数情况下,不允许系统调用会返回错误 1, EPERM, &Operation not permitted&,比如试图使用 ptrace,但其它系统调用可能会失败的原因各不相同:
选择系统调用是禁用的。如果你想打电话 mmap例如,您必须使用系统调用号477,而不是71年或197年,否则一段错误将被触发。
其他系统调用等 exit也会导致段错误:
chain.syscall(&exit&, 1, 0);
SCTP试图创建一个套接字将返回错误 0x2b, EPROTONOSUPPORT,这表明SCTP套接字已经禁用PS4内核:
//int socket(int domain, int type, int protocol);
//socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
chain.syscall(&socket&, 97, 2, 1, 132);
尽管调用 mmap与 PROT_READ | PROT_WRITE | PROT_EXEC将返回一个有效的指针, PROT_EXEC国旗被忽略。阅读它的保护将返回3(RW),和任何试图执行内存将触发一个段错误:
chain.syscall(&mmap&, 477, 0, 4096, 1 | 2 | 4, 4096, -1, 0);
chain.write_rax_ToVariable(0);
chain.read_rdi_FromVariable(0);
chain.add(&pop rax&, 0xfeeb);
chain.add(&mov [rdi], rax&);
chain.add(&mov rax, rdi&);
chain.add(&jmp rax&);
的列表PS4中使用开源软件没有任何类型的沙盒软件列表辣椒,所以PS4必须使用纯FreeBSD监狱,或某种习俗,专有,沙盒系统(不太可能)。
我们可以证明存在的FreeBSD监狱被积极用于PS4的内核 auditon系统调用被监禁环境中无法执行:
chain.syscall(&auditon&, 446, 0, 0, 0);
的第一件事 auditon系统调用是检查 jailed在这里,如果是,返回 ENOSYS:
if (jailed(td-&td_ucred))
& & & & return (ENOSYS);
否则系统调用将最有可能的回报 EPERM从 mac_system_check_auditon在这里:
error = mac_system_check_auditon(td-&td_ucred, uap-&cmd);
if (error)
& & & & return (error);
或从 priv_check在这里:
error = priv_check(td, PRIV_AUDIT_CONTROL);
if (error)
& & & & return (error);
系统调用的绝对最大可能达到后立即 priv_check,在这里之前,返回 EINVAL由于长度参数是0:
if ((uap-&length &= 0) || (uap-&length & sizeof(union auditon_udata)))
& & & & return (EINVAL);
自 mac_system_check_auditon和 priv_check永远不会回来 ENOSYS,有 jailed检查是唯一的办法 ENOSYS可以返回。
当执行链, ENOSYS返回(0x48).
这告诉我们,无论PS4使用沙箱系统基于监狱,因为至少 jailed检查通过。
FreeBSD 9.0内核利用
它毫无意义试图寻找新的漏洞FreeBSD 9.0内核源代码因为自2012年上映以来,一些内核漏洞已经被发现,PS4可能会容易。
我们可以立即把这些显而易见的原因:
FreeBSD 9.0 - -9.1 mmap / ptrace -特权升级开发——这是行不通的,因为如前所述,我们不可以访问 ptrace系统调用。
FreeBSD内核9.0 -英特尔SYSRET特权升级开发——不会因为PS4使用AMD处理器的工作。
FreeBSD内核——多个漏洞——也许第一个漏洞将导致一些,但是其他2依赖SCTP套接字,残疾人PS4内核(如前所述)。
然而,有一些较小的措施,这可能导致一些事情:
一个漏洞看起来很容易尝试使用getlogin系统调用少量的内核内存泄漏.
的 getlogin系统调用是为了复制当前会话的登录名用户记忆,然而,由于一个错误,整个缓冲区总是复制,而不仅仅是名称字符串的大小。这意味着我们可以阅读一些uninitialised数据从内核,这可能是一些使用。
注意,系统调用(49) int getlogin_r(char *name, int len);而不是 char *getlogin(void);.
让我们试着将一些内核内存复制到一个未使用的用户态内存的一部分:
chain.syscall(&getlogin&, 49, chain.data, 17);
不幸的是17字节是大多数数据我们可以得到,因为:
登录名称是有限的 MAXLOGNAME(从 &sys/param.h&)角色,目前17包括null。
- - - - - -FreeBSD手册页
执行链后,返回值是0,也就是说系统调用成功了!一个很好的开始。现在让我们看一下内存,我们指出:
在执行之前链:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
72 6f 6f 74 00 fe ff ff 08 62 61 82 ff ff ff ff
解码后的第一个4字节为ASCII码:
所以浏览器作为根用户执行!这是意想不到的。
但更有趣的是,内存泄露的看起来像一个指针在内核的东西,也总是每次链运行;这是证据支持Yifanlu PS4没有内核本的说法!
从目前可获得的信息,PS4的内核似乎非常类似于股票FreeBSD 9.0内核。
重要的是,存在的差异似乎从标准内核配置变化(比如禁用SCTP套接字),而不是修改过的代码。索尼还添加了一些自己的自定义系统调用内核,但除此之外,其余的内核似乎相当。
在这方面,我倾向于相信PS4股票的大部分多汁的漏洞一样FreeBSD 9.0的内核!
不幸的是,大多数内核利用不能触发WebKit的入口点,我们目前由于沙盒的限制(可能只是股票FreeBSD监狱)。
和FreeBSD 10,不太可能有人藏把任何私人利用FreeBSD 9,所以除非一个新的突然释放,我们坚持目前可用。
它可能不是不可能利用PS4内核利用一些现有的内核内存腐败漏洞,但它肯定不容易。
从这里最好的方法似乎是逆向工程可以抛弃所有的模块,以文档尽可能多的索尼的定制系统调用;我有一种预感,我们会有更多的运气针对这些,比标准的FreeBSD系统调用。
最近PS4 Jaicrab发现了两个UART港口这告诉我们,有硬件黑客对PS4感兴趣。虽然硬件黑客的作用一直被转储内存??一个系统,像DSi,我们已经可以做多亏了WebKit开发,还有硬件触发的内核漏洞被发现的可能性,等等geohot的原始PS3管理程序破解。它仍然是最有可能的,内核开发将通过系统调用在PS4找到漏洞。
新人欢迎积分0 阅读权限70积分9104精华0UID帖子金钱54907 威望0
Lv.7, 积分 9104, 距离下一级还需 896 积分
UID帖子威望0 多玩草0 草信仰力
黑客PS4,1
PS4的保安介绍,和用户ROP
注:这篇文章是3部分系列的一部分:
黑客PS4,1部分对PS4的保安介绍,和用户ROP
黑客PS4,部分2用户代码执行
黑客PS4,3内核开发
因为没有任何重大的公告对于PS4黑客很久了,我想解释一下关于PS4的黑客来了,什么是防止进一步的进展。
我将解释一些安全概念,普遍适用于所有现代的系统,而且我已经从我的PS4运行试验发现ROP。
如果你不是特别熟悉的剥削,你应该读我的文章,通过堆栈粉碎的漏洞在保存文件第一次通过游戏。
您可以下载我的完整设置在这里运行这些测试自己,它是目前为1.76固件。
关于PS4的背景信息
正如你可能知道的PS4的功能定制的AMD x86-64 CPU(8芯),还有用于该CPU架构研究负载,即使这个特定的版本可能稍微偏离已知的标准。例如,PLFA(页故障解放军)发布的概念只使用页面错误和x86 MMU的29c3大会期间实施一个完整的图灵机的证明,检查他们的视频在YouTube上。也很有趣,如果你想在虚拟机中运行代码,并且要在主机处理器上执行指令。
-欧亚新闻报3251
以及有一个有据可查的CPU架构,开源是多用在PS4的软件。
最值得注意的是,PS4的奥比斯OS是基于FreeBSD,就像PS3的OS(部分NetBSD为好);但以及FreeBSD 9,其他应注意的使用的软件包括单VM,和WebKit。
WebKit的切入点
WebKit是一个开放源代码的布局引擎将在iOS浏览器网页Wii U,3DS,PS Vita,和PS4。
尽管如此广泛和成熟,它确实有其份额的漏洞;你可以了解他们中的大多数人通过阅读Pwn2Own写作。
特别是,在PS4固件1.76版本的浏览器使用WebKit是脆弱的cve-,堆在jsarray基于缓冲区溢出::排序法(…)。
2014、NAS和比邻宣布他们已经成功能够端口利用PS4的浏览器,并释放PoC代码公开的第一个切入点黑客PS4。
这给了我们任意读写访问所有WebKit过程可以读写,可以转储模块,并覆盖返回地址堆栈上,让我们控制程序计数器(ROP)。
此后,许多其他的漏洞已经被发现在WebKit,这可能允许模块在以后的固件倾销与ROP的PS4,但作为写作,没有移植任何这些漏洞到PS4公开。
ROP是什么?
不同于原始设备像DS,PS4有一个控制存储器的不同区域的属性核。记忆被标记为可执行无法覆盖的页面,和内存的页被标记为可写不能执行;这被称为数据执行保护(DEP)。
这意味着我们不能只复制一个有效载荷,并执行它。然而,我们可以执行已加载到内存中并标记为可执行的代码。
它不会跳到一个单一的地址很有用,如果我们不能写自己的代码的地址,所以我们使用ROP。
返回导向编程(ROP)是传统的栈溢出的延伸,而是覆盖只有一个值,电脑会跳,我们可以有许多不同的地址链在一起,称为小工具。
一个小工具,通常只是一个单一的期望指令后悔。
在x86_64装配,当RET指令达到64位值从堆栈中弹出和PC跳到它;因为我们可以控制栈,才能使每一个小工具的RET指令跳转。
例如,从0x80000可能包含指令:
MOV RAX,0
从0x90000可能包含指令:
MOV RBX,0
如果我们覆盖堆栈上的返回地址包含0x80000随后0x90000,然后尽快达到第一RET指令执行会跳转到MOV RAX,0,紧接着,下一个RET指令将流行0x90000了MOV RBX堆栈和跳跃,0。
实际上这链都将设置獭兔和RBX 0,就像我们所写的代码到一个单一的定位和执行它从那里。
ROP链不只是限于地址列表虽然;假设从0xa0000包含这些指令:
流行的獭兔
我们可以在链0xa0000设置第一项和下一项的任何所需的值为獭兔。
小工具还没有结束在RET指令;我们可以使用小工具,结束
; Save registers
push& & rbp
mov& &&&rbp, rsp
push& & r15
push& & r14
push& & r13
push& & r12
push& & rbx
sub& &&&rsp, 18h
; Function body
; Restore registers
add& &&&rsp, 18h
pop& &&&rbx
pop& &&&r12
pop& &&&r13
pop& &&&r14
pop& &&&r15
pop& &&&rbp
你希望能找到流行的小玩意,或很少,像异或獭兔,獭兔设置返回值为0返回之前。
有一个比较:
[其它] CMP,R12
不会有任何意义,因为比较的结果是不使用的功能。然而,仍然有一个可能性,我们可以找到这样的小工具。
x86_64指令长度可变的,他们是相似的话,可以说完全不同的东西取决于解码的开始。
的x86_64架构是一个可变长度的CISC指令集。返回导向编程的x86_64利用的事实,指令集是非常“密集”,即任意字节序列可能被解释为x86_64指示一些有效的设置。
为了证明这一点,从Webkit模块在这个函数的最后一眼:
52be0d mov eax,[ 8 ] RDX
52be10 MOV [ RSI + 10 ],eax
52be13或BYTE PTR [ RSI + 39h取样进行],20h
52be17 RET
现在用什么代码看上去一看如果我们开始从0x52be14解码:
52be14 CMP [一],R12
52be17 RET
即使这个代码从来没有被执行,它是在内存中已被标记为可执行的,所以它是完全有效的使用作为一个小工具。
当然,这将是incredibily费时看解释代码之前每一个RET指令手动无微不至;这就是为什么工具能为你做这个。一个我使用搜索ROP小工具是RP + +;生成一个文本文件填充工具,只是用:
rp-win-x64 F mod14.bin——原= x64,ROP = 1 & mod14.txt独特
如果我们试图执行一个不可执行的内存页,或试着写一个非可写内存分页、分段故障发生。
例如,尝试在堆栈上执行代码,该代码被映射为只读:
setu8to(chain.data + 0,0xeb);
setu8to(chain.data + 1,0XFE);
链(链,数据);
并试着写代码,它被映射为只读和执行:
setu8to(modulebases [ WebKit ],0);
如果一个分段错误发生,一个消息说“没有足够的免费系统内存”会出现,而且页面将无法加载:
有显示此信息的其他可能的原因,如执行非法指令或未实现的系统调用,但分割故障是最常见的。
地址空间布局随机化(ASLR)是一种安全技术,使模块的基地址,每次启动PS4是不同的。
它已经向我报告,很老的固件(1.05)没有ASLR启用,但据介绍,以前的固件1.70。注意,内核ASLR未启用(固件1.76下至少),这将在后面的文章证明。
对于大多数使用ASLR会有问题,因为如果你不知道在内存中的地址的小工具,你就不知道写什么到堆栈。
幸运的是,我们不限于只写静态的ROP链。我们可以使用JavaScript读取模块表,它会告诉我们所有已加载的模块的基地址。利用这些基地,我们就可以在我们触发ROP执行计算各种设备的地址,绕过ASLR。
模块表还包括模块的文件名:
webprocess.self
libkernel.sprx
libscelibcinternal.sprx
libscesysmodule.sprx
libscenet.sprx
libscenetctl.sprx
libsceipmi.sprx
libscembus.sprx
libsceregmgr.sprx
libscertc.sprx
libscepad.sprx
libscevideoout.sprx
libscepigletv2vsh.sprx
libsceorbiscompat.sprx
libscewebkit2.sprx
libscesyscore.sprx
libscessl.sprx
libscevideocoreserverinterface.sprx
libscesystemservice.sprx
libscecompositeext.sprx
虽然PS4主要采用[签署] PPU浮动执行([S] PRX)格式的模块,一些字符串引用[签署]格式的可执行([的]精灵)对象文件也可以在libscesysmodule.sprx转储,如bdj.elf,web_core.elf和orbis-jsc-compiler.self。本文结合模块和对象是类似于用于PS3和PSP。
您可以查看完整的所有模块的列表(不只是那些被浏览器加载)在libscesysmodule.sprx。我们可以通过几个索尼定制的系统调用来加载和转储,这将在本文稍后解释。
使用JavaScript来编写和执行动态的ROP链给了我们一个标准的缓冲区溢出攻击的巨大优势。
以及绕过ASLR,我们也可以读取浏览器的用户代理,并提供不同的浏览器版本不同的ROP链,给我们的开发尽可能最高的兼容性。
我们甚至可以使用JavaScript读取存储在我们的小工具地址检查是否正确,让我们几乎完美的可靠性。
写作ROP链动态,而不是他们的脚本之前,是有道理的。
我创建了一个写作的ROP链,JavaScript框架只是ROP,为此。
JavaScript警告
JavaScript的数字表示使用IEEE-754双精度(64bit)格式。这为我们提供了53bit精度,这意味着它不可能代表每一位的值,近似将被用于一些。
如果你只需要设置一个64位的值小一些,如256,然后setu64to会好的。
但是,你需要写一个缓冲或结构数据的情况下,有一定的字节将被写入错误如果已经写在64位块的可能性。
相反,你应该在32位块写入数据(记住,PS4是小端),以确保每一个字节是精确的。
有趣的是,PS4使用相同的调用约定作为系统调用Linux和MS-DOS,存储在寄存器的参数,而不是传统的UNIX方式(其中FreeBSD使用默认),与存储在堆栈参数
rax - System call number
rdi - Argument 1
rsi - Argument 2
rdx - Argument 3
r10 - Argument 4
r8 - Argument 5
r9 - Argument 6
我们可以尝试用以下方法进行任何系统调用是ROP:
this.syscall =函数(名称、systemcallnumber,arg1,arg2,ARG3,ARG4,ARG5,ARG6){
& & & & console.log(&syscall & + name);
& & & & this.add(&pop rax&, systemCallNumber);
& & & & if(typeof(arg1) !== &undefined&) this.add(&pop rdi&, arg1);
& & & & if(typeof(arg2) !== &undefined&) this.add(&pop rsi&, arg2);
& & & & if(typeof(arg3) !== &undefined&) this.add(&pop rdx&, arg3);
& & & & if(typeof(arg4) !== &undefined&) this.add(&pop rcx&, arg4);
& & & & if(typeof(arg5) !== &undefined&) this.add(&pop r8&, arg5);
& & & & if(typeof(arg6) !== &undefined&) this.add(&pop r9&, arg6);
& & & & this.add(&mov r10, syscall&);}
只要确保预先设定的堆栈基地,一些免费的内存:
这个添加(“流行RBP,StackBase +地址的攻击+ 0x1400);
使用系统调用可以告诉我们关于PS4的内核数量巨大。不仅如此,使用系统调用最有可能是我们可以与内核进行交互的唯一方式,从而有可能触发内核漏洞。
如果你是逆向工程模块,以确定一些索尼的自定义系统调用,你可能会遇到另一种调用约定:
有时,索尼通过定期的系统调用0个系统调用(通常不在FreeBSD),与第一个参数(RDI)控制系统调用应执行:
rdi - System call number
rsi - Argument 1
rdx - Argument 2
r10 - Argument 3
r8 - Argument 4
r9 - Argument 5
这很可能是索尼这样做很容易兼容的功能调用约定。例如:
全球的系统调用。
系统调用:
异或獭兔,獭兔
MOV R10,RCX
使用此,他们可以使用函数调用约定来执行系统调用:
国际syscall();
int getpid(void){
返回系统调用(20);
写作ROP链时,我们可以使用公约:
/ /两者都将得到当前进程标识:
链。(“系统调用getpid”,20);
链。(“系统调用getpid”,0,20);
很好地意识到这一点,因为我们可以使用任何一个更方便的小工具,可。
只需使用系统调用20、getpid(void),我们可以学到很多关于核。
这个系统调用的工作在所有的事实告诉我们,索尼不把系统调用号为手段,通过隐藏的安全性(BSD许可下可以没有发布新的系统调用号)。
所以,我们有一个列表的自动系统调用在内核尝试PS4。
其次,通过调用getpid(),重新启动浏览器,并再次调用它,我们得到一个返回值2高于前值。
这告诉我们,互联网浏览器的应用程序实际上是由2个独立的过程:WebKit核心(我们接管),负责解析HTML和CSS,解码图像,例如执行JavaScript,和另一个处理一切:图形显示、接收控制器的输入,管理历史和书签等。
另外,虽然FreeBSD已经4支持PID随机化,连续PID分配默认的行为。
事实上,PID配置设置为默认的行为表明,索尼可能不添加任何额外的安全性增强功能,如那些由项目hardenedbsd鼓励。
有多少自定义系统调用?
最后一个标准的FreeBSD 9系统调用是wait6,数532;什么比这必须是一个定制的索尼系统调用。
调用索尼的大多数自定义系统调用不正确的参数将返回错误0x16,“参数无效”;然而,任何兼容或未实现的系统调用将报告“没有足够的系统内存”错误。
通过试验和错误,我发现系统调用号617是去年索尼的系统调用,高于未落实。
由此,我们可以得出结论,在PS4的85内核定制的索尼系统调用(617 - 532)。
这是显着低于PS3,共有近1000系统调用。这表明,我们有较少的攻击向量,但它可能会更容易地记录所有的系统调用。
此外,9这85个系统调用都返回0x4e,enosys,这表明他们可能只可以从开发单位,留给我们的只有76是可用的。
这76人中,只有45是被libkernel.sprx(所有非核心应用程序执行系统调用),所以开发商只有45个自定义的系统调用,它们可以使用。
有趣的是,虽然只有45被称为(因为libkernel.sprx已包装他们的),其他还有31的互联网浏览器调用过程。这是更可能的是,这些非预期的系统调用有漏洞,因为他们可能有最少的测试。
libkernel.sprx
如何自定义系统调用所使用的libkernel,首先你必须记住,这只是一个修改标准的FreeBSD 9图书馆。
这是一个_libpthread_init从C thr_init提取物:
* Check for the special case of this process running as
* or in place of init as pid = 1:
if ((_thr_pid = getpid()) == 1) {
& & & & /*
& & & &&&* Setup a new session for this process which is
& & & &&&* assumed to be running as root.
& & & &&&*/
& & & & if (setsid() == -1)
& & & & & & & & PANIC(&Can't set session ID&);
& & & & if (revoke(_PATH_CONSOLE) != 0)
& & & & & & & & PANIC(&Can't revoke console&);
& & & & if ((fd = __sys_open(_PATH_CONSOLE, O_RDWR)) & 0)
& & & & & & & & PANIC(&Can't open console&);
& & & & if (setlogin(&root&) == -1)
& & & & & & & & PANIC(&Can't set login to root&);
& & & & if (_ioctl(fd, TIOCSCTTY, (char *) NULL) == -1)
& & & & & & & & PANIC(&Can't set controlling terminal&);
The same function can be found at offset 0x215F0 from libkernel.sprx. This is how the above extract looks from within a libkernel dump:
call& & getpid
mov& &&&cs:dword_5B638, eax
cmp& &&&eax, 1
jnz& &&&short loc_2169F
call& & setsid
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A0C
lea& &&&rdi, aDevC &/dev/console&
call& & revoke
test& & eax, eax
jnz& &&&loc_21A24
lea& &&&rdi, aDevC &/dev/console&
mov& &&&esi, 2
xor& &&&al, al
call& & open
mov& &&&r14d, eax
test& & r14d, r14d
js& && &loc_21A3C
lea& &&&rdi, aRoot& && & ; &root&
call& & setlogin
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A54
mov& &&&edi, r14d
mov& &&&esi, h
xor& &&&edx, edx
xor& &&&al, al
call& & ioctl
cmp& &&&eax, 0FFFFFFFFh
jz& && &loc_21A6C
Reversing module dumps to analyse system calls
libkernel isn't completel there's also a lot of custom code which can help disclose some of Sony's system calls.
Although this process will vary depending on the system cal for some, it is fairly easy to get a basic understanding of the arguments that are passed to it.
The system call wrapper will be declared somewhere in libkernel.sprx, and will almost always follow this template:
DB70 syscall_601& &&&proc near
DB70& && && && && &&&mov& &&&rax, 259h
DB77& && && && && &&&mov& &&&r10, rcx
DB7A& && && && && &&&syscall
DB7C& && && && && &&&jb& && &short error
DB7E& && && && && &&&retn
DB7F error:
DB7F& && && && && &&&lea& &&&rcx, sub_DF60
DB86& && && && && &&&jmp& &&&rcx
DB86 syscall_601& &&&endp
请注意,MOV R10,RCX指令并不一定意味着系统调用需要至少4个参数;所有的系统调用的包装,甚至是那些没有参数,如getpid。
一旦你发现包装,您可以看一下它的外部参照:
1D50& && && && && &&&mov& &&&edi, 10h
1D55& && && && && &&&xor& &&&esi, esi
1D57& && && && && &&&mov& &&&edx, 1
1D5C& && && && && &&&call& & syscall_601
1D61& && && && && &&&test& & eax, eax
1D63& && && && && &&&jz& && &short loc_11D6A
很好的,看看这些,只是为了确保寄存器没有修改的东西无关:
1A28& && && && && &&&mov& &&&edi, 9
1A2D& && && && && &&&xor& &&&esi, esi
1A2F& && && && && &&&xor& &&&edx, edx
1A31& && && && && &&&call& & syscall_601
1A36& && && && && &&&test& & eax, eax
1A38& && && && && &&&jz& && &short loc_11A3F
不行眼花了
19:00:36 上传
新人欢迎积分1 阅读权限70积分7486精华0UID帖子金钱27647 威望0
Lv.7, 积分 7486, 距离下一级还需 2514 积分
UID帖子威望0 多玩草0 草信仰力
新人欢迎积分1 阅读权限130积分253357精华0UID帖子金钱196718 威望14
UID帖子威望14 多玩草3500 草信仰力
破解路慢慢
马年新春勋章
手机APP马年迎春,马上有钱!
手机论坛勋章
APP发帖双倍积分,登陆即送勋章!
猴年新春勋章
猴年大吉,猴年行大运!
365天!天天有你
连续签到1年即可获得
元宝专属一阶勋章。已绝版
5153活动勋章
我去5153探探路
2014论坛年度勋章
参与论坛年度活动发放
英雄联盟赛事勋章
英雄联盟赛事勋章
初级灌水标兵
初级灌水标兵
爱情守望者
爱情守望者
初级在线标兵
论坛在线时间达1000小时即可申请
需要金钱:1100
Powered by
手机盒子客户端点击或扫描下载

我要回帖

更多关于 请让一下翻译 的文章

 

随机推荐