simple
找到main函数
在debugger前下断点调试

弹出反调试,看看报错内容
某处指令调用内存0x41A024失败
静态分析的内存地址和动态调试时不一样
找到程序开始的地方下断点

慢慢f7往下调试(其实也可以从关键函数main0往上交叉检索)
然后遇到卡调试的就C+n就好了
无论怎么调试都会触发错误
- 它为什么会内存地址整体变更
- 如何才能让他不变更内存地址,或者说让他指向正确的内存地址
找找反调试
https://www.cnblogs.com/LyShark/p/13525917.html c++反调试学习
https://bbs.pediy.com/thread-225740.htm#msg_header_h1_0
这题脱壳之后被破坏了,需要修复。。。
直接用未脱壳的调试
这里学习一下main函数传参
1 2 3 4 5 6 7 8 9
| #include<stdio.h> int main(int argc, char** argv,const char **envp)
{ printf("\n%s", argv[1]); printf("\n%d %c", argv[1][1]);
system("pause") }
|
在vs路径中用cmd启动debugger

获得返回结果
可见,argv[1] 返回的是输入参数,而argv[0]返回的是文件路径,arg[1][i]返回的是字符(相当于二维数组存放字符串)
而argc返回的是参数数量,envp返回的是环境变量。

做静态分析
看完静态之后感觉,这个应该是main函数传参然后数据储存在stream内部
将stream内容抄入buffer,buffer 内容加密后抄入data,最后data送入比较函数

关键加密部分
这题的data 是以dd形式分开存放的,加密的时候存一部分,对比的时候拿出另一部分,最后flag自输出。
解析完了,这题是32长的flag,取偶数位用奇数位加密,加密方式就是简单的阿斯卡码加减。很简单就可以推出来,主要是。怎么修复啊啊啊啊啊啊!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| data='fmcj2y~{' data_l=list(data) for i in range(len(data_l)): data_l[i]=ord(data_l[i]) data_l[i]-= i s=''.join(chr(i)for i in data_l) print(s) rdata=[80, 198, 241, 228, 227, 226, 154, 161 ,167,222,218,70,171,46,255,219] flag=[] for i in range(len(rdata)): rdata[i]-=1 for i in range(len(rdata)): a=int(rdata[i]/16) b=rdata[i]%16 if 9<a<16: a+=87 flag.append(chr(a)) elif 0<=a<=9: a+=48 flag.append(chr(a)) if 9<b<16: b+=87 flag.append(chr(b)) elif 0<=b<=9: b+=48 flag.append(chr(b)) flag_s=''.join(flag) print(flag_s)
|
flag应该为
4fc5f0e3e2e199a0a6ddd945aa2dfeda
真tm菜