simple-check-100

发布时间 2023-11-10 14:46:58作者: 努力的大魔王

代码脚本解开法

#include <stdio.h>
int main(int argc, char* argv[]) {
char flag_data[] = {
    220, 23, 191, 91, 212, 10, 210, 27, 125, 218,
    167, 149, 181, 50, 16, 246, 28, 101, 83, 83,
    103, 186, 234, 110, 120, 34, 114, 211};
char v7[] = {
    84, -56, 126, -29, 100, -57, 22, -102, -51, 17,
    101, 50, 45, -29, -45, 67, -110, -87, -99, -46,
    -26, 109, 44, -45, -74, -67, -2, 106};
unsigned int v2;
unsigned char* v3;
// v11 = -478230444;
// v12 = -1709783196;
// v13 = 845484493;
// v14 = 1137959725;
// v15 = -761419374;
// v16 = -752063002;
// v17 = -74;
// v18 = -67;
// v19 = -2;
// v20 = 106;
// 方法一:类比写
for (int i = 0; i <= 6; ++i) {
    v2 = ((v7[4 * i] & 0x000000FF) + ((v7[4 * i + 1] & 0x000000FF) << 8)
        + ((v7[4 * i + 2] & 0x000000FF) << 16) + ((v7[4 * i + 3] & 0x000000FF) <<
            24)) ^ 0xDEADBEEF;
    v3 = (unsigned char*)&v2;
        for (int j = 3; j >= 0; --j) {
        printf("%c", *(v3 + j) ^ flag_data[4 * i + j]);
    }
}
// 方法二:按位异或,小端字节序,低位在低地址
// for (int i = 0; i <= 6; ++i) {
// printf("%c", v7[4 * i + 3] ^ 0xDE ^ flag_data[4 * i + 3]);
// printf("%c", v7[4 * i + 2] ^ 0xAD ^ flag_data[4 * i + 2]);
// printf("%c", v7[4 * i + 1] ^ 0xBE ^ flag_data[4 * i + 1]);
// printf("%c", v7[4 * i] ^ 0xEF ^ flag_data[4 * i]);
// }
return 0;
}

动态调试

这里得用Linux得gdb动态调试

 

win

ida

找到关键函数下断点

 

 动态调试

 这里不改寄存器,直接改函数,jz——>jnz

 然后运行到函数结束,return处

 但是程序得到不可打印字符,说明ida不行

 然后od也差不多是一个意思了

 

GDB

用这个的话需要win结合一起用,因为需要在win的ida那里看地址

在ida中找到关键函数的地址

 

 在gdb上下断点

mian函数下一个,防止一下子运行结束了

然后再到关键函数那里下一个

 然后运行程序

 然后运行到下一个断点

 在这里的话因为是test eax eax,所以查看一下eax的值,果不其然为0,那么test就是0和0按位与,这样子的话最后导致的就是zf位为1,那么就会发生jz跳转,就会跳转到wrong的部分,所以要改变zf的结果,也就是要改变eax的值

test指令

 

 zf位

 

所以操作为

 最后得到结果