学习报告(一到二周)

runwu2204 Lv6

学习报告(一到二周)

语言学习

汇编语言

已基本了解其使用语法,及其功能(函数调用,返回父函数)

mov,jmp,push,pop(基本语句)

call(调用子函数),ret(返回父函数),leave(将栈中的指向子函数地址去除,恢复父函数指令)

stack用法

存储函数在内存中的位置,存储变量,存储命令等

C语言

基本理解指针用法(用于指向变量地址),可用于子函数中调用外部变量,也可用于间接修改和间接引用对应地址的值

工具使用

ida静态分析

通过解ctf题逐步理解

基本可以看懂其伪代码表示意思

基本会搜索相应输出结果以找到目标程序

评测作业

1,交换数值

(1)指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int change (int* a, int* b)
{
int m;
m = *a;
*a = *b;
*b = m;
return 0;
}
int main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("a=%d,b=%d", a, b);
change (&a, &b);
printf("a=%d,b=%d", a, b);
return 0;

}

(2)+-交换

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
int a = 1, b = 2;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d,b=%d", a, b);
return 0;
}

(3)异或(利用两次异或后为原值)

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
int a=1;b=2;
a = a^b;
b = a^b;
a = a^b;
printf("a=%d,b=%d"a,b);
}

2,汇编角度分析switch语句

switch相当于一个子函数,每个case对应命令地址,所有的case按我们在c语言中写出的顺序排序,switch寻找对应case名对应的地址,将IP移向对应地址再进行相应命令,根据IP进行一次命令后+一个命令长度,就会按顺序执行命令。

只要不遇到break就不会退出该子函数。

3,位运算判断奇偶数

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
int a;
printf("a=");
scanf("%d",&a);
if(a&1==0)
printf("a是一个偶数");
else
printf("a是一个奇数");
return 0;
}

直接通过最后一位是否为1判断奇偶数,因为除第一位其他都为2的多少次方倍

4,

选择排序()
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
#include<stdio.h>
int change (int* a, int* b)//交换数字
{
int m;
m = *a;
*a = *b;
*b = m;
return 0;
}
int main()
{
a[]={6,2,4,1,3,5};
int i,j;
for (i = 0; i < 5; i++)
{
for (j = i; j < =5; j++)
{
if (a[j] < a[i])
change(&a[j], &a[i]);\\交换数值
}
}
for (i = 0; i <= 5; i++)
printf("%3d", a[i]);
return 0;

}
冒泡排序
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
29
30
31
32
33
#include<stdio.h>
int change (int* a, int* b)//交换数字
{
int m;
m = *a;
*a = *b;
*b = m;
return 0;
}

int main()
{
int a[10000],n,m,c,o;
for (n = 0; n <= 10000; n++)
{
scanf("%d", &a[n]);
if (getchar() == '\n')
break;
}
for (m = n-1; m >= 0; m--)//依次将最高位移向最右端
{
for ( o= 0;o <= m; o++)
{
if (a[o] > a[o + 1])
{
change(&a[o],a[o+1])
}
}
}
for (o = 0; o <= n; o++)
printf("%-3d", a[o]);
return 0;
}
二分寻找
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
29
30
31
32
33
int search(int* arr, int p, int q, int ele) 
{
int mid = 0;
//如果[p,q] 不存在,返回 -1
if (p > q)
{
return -1;
}
// 找到中间元素所在的位置
mid = p + (q - p) / 2;
//递归的出口
if (ele == arr[mid])
{
return mid;
}
//比较 ele 和 arr[mid] 的值,缩小 ele 可能存在的区域
if (ele < arr[mid])
{
//新的搜索区域为 [p,mid-1]
return search(arr, p, mid - 1, ele);
}
else
{
//新的搜索区域为 [mid+1,q]
return search(arr, mid + 1, q, ele);
}
}
int main()
{
int a[10] = { 10,14,19,26,27,31,33,35,42,44 };//二分法首先得排序
printf("%d",search(a, 0, 9, 31));
return 0;
}
5,出的题目

目测需要动态调试,没寻找到对应的地址,不太会做

学习目标

仍需多加练习CTF

仍需多了解加密算法如base64及更高级的算法

  • 标题: 学习报告(一到二周)
  • 作者: runwu2204
  • 创建于 : 2023-01-05 17:05:21
  • 更新于 : 2023-01-05 17:05:21
  • 链接: https://runwu2204.github.io/2023/01/05/Re/实验室报告/学习报告(一到二周)/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论