「ROP」是一款反向编程游戏。玩家需要用已有的函数和指令,把程序解开,获取系统权限,进而完成各种任务。第二篇第五关的背景是:你需要攻入一个系统,获取特定文件。但是你发现,这个系统已经被加固了,需要通过一个异常分支来解决问题。
在ROP第2节5关中,你需要控制程序跳转到指定的函数,并在函数中执行操作,最终获取文件。具体而言,你需要通过一串ROP链控制程序跳转到打印函数`puts`,并且把文件名打印出来。难点在于,`puts`函数的参数是在栈上的,你需要先通过一个异常分支来控制程序把文件名放到栈上。
首先,我们需要分析程序的汇编代码,了解程序的组成和执行过程。在ROP第2节5关中,程序会调用`verify`函数,该函数会执行一些验证操作,然后将返回值作为参数调用`authorize`函数。我们需要控制程序在`verify`函数中抛出异常,然后跳转到另一个函数`getFileName`,该函数会把文件名放到栈上。接着,我们构造一个ROP链,利用`puts`函数打印出文件名。
在ROP第2节5关中,我们需要构造一个ROP链控制程序跳转并执行操作。首先,我们需要找到`puts`函数的地址,可以通过断点调试或者反汇编程序来获得。然后,我们需要找到系统调用`pop rdi; ret`的地址,该指令的作用是弹出一个值到寄存器`rdi`中,并跳转到返回地址。在ROP链中,我们需要先把文件名的地址压入栈中,然后跟上`pop rdi; ret`指令的地址,再跟上`puts`函数的地址,最终构造出一个可以执行`puts`函数的ROP链。
在ROP第2节5关中,我们需要通过一条异常路径执行ROP链。具体而言,我们可以利用`verify`函数中的一个缓冲区溢出漏洞,把缓冲区的值覆盖成异常处理程序的地址。当`verify`函数执行到缓冲区溢出的代码时,就会抛出异常,并跳转到异常处理程序。在异常处理程序中,我们把栈顶指针指向`getFileName`函数的地址,然后再执行ROP链即可。
最终,在ROP第2节5关中,我们成功构造出了一个ROP链,控制程序执行`puts`函数,并打印出文件名。这个关卡的难点在于需要通过异常路径来控制程序的跳转,需要对程序的执行过程有一定的了解和分析能力。
ROP第2节5关是「ROP」第二篇中比较难的一关。在攻略过程中,我们需要通过分析程序的代码,构造ROP链,利用异常路径来控制程序的跳转。这个过程需要有一定的编程和调试经验,也需要对程序的执行过程有一定的了解。在实战中,我们可以参考已有的ROP经验,了解各种攻击技巧和漏洞利用方式,提高自己的反向编程能力。
2023-08-25 / v3.1

2023-08-25 / v1.0.3

2023-08-25 / v1.0.1

2023-08-25 / v2.19.1

2023-08-25 / v1.2.0

2023-08-25 / v2.0.1

2023-08-25 / v1.5.1

2023-08-25 / v4.4.0

2023-08-25 / v1.0.03

2023-08-25 / v5.6.6

2023-08-25 / v1.2.20230810

2023-08-25 / v2.3.1.1
