2022-9-5

2022-9-5

HWS2022-Re1

这题也算复习了一下tea,踩了一下几个做题的坑,希望自己下次做tea的时候可以注意

1.注意ida的赋值问题,要了解出题人的代码规范和习惯
2.注意sum值的变化,和最后的值的变化
3.可以动调一些固定值的值查看直接解题脚本是否正确
第二种解题写法
把一些固定值重新赋值 这样动调好看
#include "defs.h"
#include <iostream>
#include <stdlib.h>
void __fastcall tea( unsigned int* input)
{
    unsigned int input7; // r9d
    unsigned int sum; // edi
    unsigned int input1; // ebp
    unsigned int input0; // esi
    unsigned int input2; // r14d
    unsigned int input3; // r15d
    unsigned int input4; // r12d
    unsigned int input5; // r13d
    unsigned int v10; // r11
    unsigned int v11; // r10
    __int64 v12; // rbx
    unsigned int v13; // r9
    bool v14; // zf
    unsigned int input6; // [rsp+40h] [rbp+8h]
    int round; // [rsp+48h] [rbp+10h]


    input7 = input[7];
    sum = 0x8D12E65; //这里是round减完再-0x61C88647
    input1 = input[1];
    input0 = *input;
    input2 = input[2];
    input3 = input[3];
    input4 = input[4];
    input5 = input[5];
    input6 = input[6];
    
    round = 11;
    unsigned int enc[4] = {
       0x00001234, 0x00002345, 0x00004567, 0x00006789 };
    for(int i=0;i<12;i++)
    {
        sum += 0x61C88647;  
        v10 = enc[(sum >> 2) & 3];
        v12 = (sum >> 2) & 3 ^ 3;
        v13 = enc[(sum >> 2) & 3 ^ 2];
        v11 = enc[(sum >> 2) & 3 ^ 1];
        input7 -= ((sum ^ input0) + (enc[v12] ^ (unsigned int)input[6])) ^ (((16 * (_DWORD)input[6]) ^ (input0 >> 3))
            + (((unsigned int)input[6] >> 5) ^ (4 * input0)));
        input[7] = input7;
        input6 -= (((sum ^ input7) + (v13 ^ input5)) ^ (((16 * input5) ^ (input7 >> 3))
            + ((input5 >> 5) ^ (4 * input7))));
        input[6] = input6;
        input5 -= ((v11 ^ input4) + (sum ^ input6)) ^ (((16 * input4) ^ (input6 >> 3)) + ((input4 >> 5) ^ (4 * input6)));
        input[5] = input5;
        input4 -= ((sum ^ input5) + (v10 ^ input3)) ^ (((16 * input3) ^ (input5 >> 3)) + ((input3 >> 5) ^ (4 * input5)));
        input[4] = input4;
        input3 -= ((sum ^ input4) + (enc[v12] ^ input2)) ^ (((16 * input2) ^ (input4 >> 3))
            + ((input2 >> 5) ^ (4 * input4)));
        input[3] = input3;
        input2 -= ((sum ^ input3) + (v13 ^ input1)) ^ (((16 * input1) ^ (input3 >> 3)) + ((input1 >> 5) ^ (4 * input3)));
        input[2] = input2;
        input1 -= ((v11 ^ input0) + (sum ^ input2)) ^ (((16 * input0) ^ (input2 >> 3)) + ((input0 >> 5) ^ (4 * input2)));
        input[1] = input1;
        input0 -= ((sum ^ input1) + (v10 ^ input7)) ^ (((16 * input7) ^ (input1 >> 3)) + ((input7 >> 5) ^ (4 * input1)));
        *input = input0;
        
       
        
     
        
        
    
        v14 = round--;
        
        
    } 
    
}


int main()
{
    unsigned int enc[9] = {
    0x10BD3B47, 0x6155E0F9, 0x6AF7EBC5, 0x8D23435F, 0x1A091605, 0xD43D40EF, 0xB4B16A67, 0x6B3578A9,0 };
    tea(enc);
    puts((char*) &enc); //7f943921724d63dc0ac9c6febf99fa88

}

在看一些awd,搭了一些awd的docker,还有一些docker的操作

docker ps
docker cp dockerid:/文件目录 /本机文件目录

玄武组的花指令暂时想不到怎么清除,还有一点反调试

转战SCTF2021学习一下C++异常处理

1.C++通过从抛异常的函数开始先调用_cxa_allocate_exception申请一片内存存放一个数据结构来春分异常数据,throw函数调用Unwind_RaiseException对于调用链的每一个函数采用personality routine 函数来清除一些局部变量

借用网上的例子来学习一下

#include <iostream>
using namespace std;

void test_func3()
{
    throw 3;

    cout << "test func3" << endl;
}

void test_func2()
{
    cout << "test func2" << endl;
    try
    {
        test_func3();
    }
    catch (int)
    {
        cout << "catch 2" << endl;
    }
}

void test_func1()
{
    cout << "test func1" << endl;
    try
    {
        test_func2();
    }
    catch (...)
    {
        cout << "catch 1" << endl;
    }
}

int main()
{
    test_func1();
    return 0;
}

输出

test func1
test func2
catch 2

认识了unwind存放数据区域 .eh_frame和 DWARF还有CFA

记录一下

在我的理解中,DWARF里的CFA表现为ida对于函数变量便宜的识别,让比如一个数组元素可以用基地址的不断偏移来识别,也就是这个表可以用来记录其他函数的对于基地址的偏移,但在实际情况上,gcc只会记录抛异常的函数

于是再回到eh_frame上,eh_frame通过CIE和FDE来寻找相关的异常信息,得到当前函数的调用函数的现场信息

清除调用函数的函数Personality routine的实现

LSDA 表

主要是在call site table指明异常处理的action 地址 长度还有处理指令的位移,catch抛出的异常会在action部分结合下一个action table 去处理,概括一下,就是调用这个action tabl来去具体化catch的具体情况,类推包括有没有 有一个且或有多个 action 会有指向下一个action table的记录 靠这个来讲函数异常多个catch的action处理链接起来

posted @   chis42  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示