simple

找到main函数

在debugger前下断点调试

弹出反调试,看看报错内容

某处指令调用内存0x41A024失败

静态分析的内存地址和动态调试时不一样

找到程序开始的地方下断点

慢慢f7往下调试(其实也可以从关键函数main0往上交叉检索)

然后遇到卡调试的就C+n就好了

无论怎么调试都会触发错误

  1. 它为什么会内存地址整体变更
  2. 如何才能让他不变更内存地址,或者说让他指向正确的内存地址

找找反调试

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菜