学习目标:
- 无名侠的课,看二进制培训(第二集和第三集)(https://space.bilibili.com/7761039/video)
- 会反汇编
- 会字符串搜索(f12)
- 会简单异或解密
-
了解一下操作系统
-
linux系统的可执行文件的后缀
-
windows系统的可执行文件的后缀
-
了解安装die(Detect It Easy)工具(自行网上或论坛搜索)
-
-
可以略微了解docker(和vmware差不多)
第二课 简单的加密算法
1. 先运行一下程序
2.使用左侧functions查找main函数
3.将函数名改为真实函数名
点击查看代码
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
int v3; // edx
int v5; // [esp-4h] [ebp-1E8h]
unsigned int i; // [esp+D0h] [ebp-114h]
char v7[260]; // [esp+DCh] [ebp-108h] BYREF
int v8; // [esp+1E0h] [ebp-4h]
int savedregs; // [esp+1E4h] [ebp+0h] BYREF
printf("Hi CTFer,Input your flag:");
scanf("%s", v7);
for ( i = 0; i < strlen(v7); ++i )
++v7[i];
if ( sub_454086(v7, "gmbh|ZPV`GJOE`JU`IBIB~") )
printf("you are wrong!\n");
else
printf("you are right!\n");
sub_4558B4(&savedregs, &dword_45A2C0, 0, v3);
return sub_4546B7((unsigned int)&savedregs ^ v8, v5);
}
4.对main函数分析发现v7变量被for循环每一个字母向后移动了一位,结果得到“gmbh|ZPV`GJOE`JU`IBIB~”所以有结果想要知道初始值,只需要每一个向前移动一位
5.编写
点击查看C语言代码
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "gmbh|ZPV`GJOE`JU`IBIB~";
for ( int i = 0; i < strlen(str1); ++i )
--str1[i];
printf("%s\n",str1);
printf("Ok\n");
return 0;
}