2020-HWS-冬令营线上赛WP

admin 2022年1月6日01:11:52安全博客 CTF专场评论20 views2423字阅读8分4秒阅读模式

本次线上赛赛题只有四类:固件、内核、逆向、Pwn。比赛完参考轩哥和线上师傅的博客进行复现,其中固件题目与IoT实战结合紧密,难度总体来说不大,入门友好型赛题。

Reverse

decryption

x86windows

考点:

加法的位运算实现

单子节爆破

主要加密逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for ( i = 0; i <= 31; ++i )
{
v2 = i ^ a2[i];
v3 = i &amp; a2[i];
v7 = a2[i];
v6 = i;
do
{
v4 = 2 * (v6 &amp; v7);
v7 ^= v6;
v6 = v4;
}
while ( v4 );
result = &a1[i];
a1[i] = v7 ^ 0x23;
}

方法一

加密算法无法一眼看出对应的运算,直接写脚本进行爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
buf = [0x12, 0x45, 0x10, 0x47, 0x19, 0x49, 0x49, 0x49, 0x1A, 0x4F, 
0x1C, 0x1E, 0x52, 0x66, 0x1D, 0x52, 0x66, 0x67, 0x68, 0x67,
0x65, 0x6F, 0x5F, 0x59, 0x58, 0x5E, 0x6D, 0x70, 0xA1, 0x6E,
0x70, 0xA3]
flag = ""
for i in range(0x20):
for j in range(0xff):
v6 = i
v7 = j
while 1:
v4 = 2 * (v6 & v7)
v7 = v7 ^ v6
v6 = v4
if v4 == 0:
break

if v7 ^ 0x23 == buf[i]:
flag += chr(j)
break

print("flag{%s}" % flag)

方法二

如果了解过加法的位运算实现的话,可以发现encrypt函数实际上是把对应input[i]加上i在异或,我们可以写出对应的逆运算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstdio>
#include <cstring>

char decrypt(char c1,int i){
return (c1 ^ 0x23) - i;
}

int main(){
char buf[40] = "\x12\x45\x10\x47\x19\x49\x49\x49\x1A\x4F\x1C\x1E\x52\x66\x1D\x52\x66\x67\x68\x67\x65\x6F\x5F\x59\x58\x5E\x6D\x70\xA1\x6E\x70\xA3";
for(int i = 0; i < 32; i++){
putchar(decrypt(buf[i],i));
}
printf("\n");
}

ofbu

Kernel

第一次做内核,基础学习文章如下:

基础练习题目如下:

进阶练习题目如下:ISCN2017 - babydriver、2018 强网杯 - core、2018 0CTF Finals Baby Kernel

easy_kernel

逻辑总共为4个步骤

  1. 输入flag
  2. 加载驱动,调用驱动中的函数加密flag
  3. 长调用,加密密文
  4. Check,对比结果

image-20210304114311164

驱动调用

image-20210304114327405

image-20210304113617543

查看驱动

image-20210304114358052

最终调用的加密函数是驱动的sub_401340

image-20210304114503572

参数分别是ring3传进来的 sub_401005(-1, &v7, aAglfTTon5iSiht, 32, v4, &Buf1);

V7是输入的flag,Buf1是加密的结果,aAglfTTon5iSiht是字符串常量}aglf_T_ton_5i_sihT_yrroS{galf,32是长度

image-20210304114649560

依据相关的加密算法的特征,可判别sub_401710是des spankey函数,sub_401620是des encrypt函数

image-20210304121153289

长调用

利用call fwrod 返回用 retf

image-20210304121619358

调用的是ring3下图的函数,功能很简单,就是一个简单的xor

image-20210304121657064

解密脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto.Cipher import DES
from hashlib import md5

key='}aglf_T_ton_5i_sihT_yrroS{galf'[:8]
c=[0xB2, 0xC4, 0x86, 0xD5, 0x54, 0x6C, 0x38, 0xAD, 0xBD, 0x69, 0xD4, 0xE9, 0x44, 0x47, 0x36, 0x21, 0x99, 0x91, 0xFB, 0x13, 0x70, 0xD8, 0x6B, 0xE4, 0x80, 0x12, 0xE2, 0x43, 0x2A, 0x4B, 0x49, 0x8E]
for i in range(0x1e,-1,-1):
c[i]^=c[i+1]
cipher=''.join(list(map(chr,c)))
des=DES.new(key)
flag=des.decrypt(cipher)
print(flag)
print(md5(flag).hexdigest())

参考链接:

https://xuanxuanblingbling.github.io/ctf/pwn/2021/02/01/hws/

FROM :ol4three.com | Author:ol4three

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:11:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  2020-HWS-冬令营线上赛WP http://cn-sec.com/archives/721354.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: