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处理链接起来
标签:input2,input3,int,sum,unsigned,2022,input From: https://www.cnblogs.com/Chis42/p/16659900.html