代码脚本解开法
#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位
所以操作为
最后得到结果
标签:函数,eax,simple,char,int,100,断点,check,ida From: https://www.cnblogs.com/lhqrusht0p/p/17824086.html