信息安全综合训练RElec2(自用、记录)

组长组员组员
E41714007E41714001E41714020

1、(一定要看)阅读 使用OllyDbg从零开始Cracking

如果要搞32位windows下用户态逆向,OD一定要熟练使用,今天看不完未来几天继续看
https://www.52pojie.cn/thread-338571-1-1.html

答:这个文件的链接失效了。

2、阅读 ELF文件格式分析

https://www.cnblogs.com/brotherlittlefish/p/5557476.html
https://blog.csdn.net/feglass/article/details/51469511

答:
ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序。ELF文件(目标文件)格式主要三种:可重定向文件、可执行文件和共享目标文件。

一般的 ELF 文件包括三个索引表:

  1. ELF header ELF头,在文件的开始,保存了路线图,描述了该文件的组织情况;
  2. Program header table 程序头表,告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表;
  3. Section header table 段节头表,包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

常见的section包括.text .strtab .symtab .rodata等。

3、阅读下面这两篇文章

https://blog.csdn.net/s1054436218/article/details/71698904
https://blog.csdn.net/s1054436218/article/details/71809403

答:
a) CTF用到的工具:PEID、IDA、OD等;
b) CTF解题方法:

  1. 用PEID查看PE文件是用什么语言写的、是否加壳;
  2. 使用IDA进行静态分析,理解大致思路后拖入OD进行动态分析;
  3. 观察程序的特征,并根据这些特征推测函数的逻辑和关键函数,理清思路,反推出结果。

4、cipher text {920139713,19}

704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148

本题是基于RSA密码体制的加解密,破解过程分以下步骤:

  1. 对大整数920139713进行分解,得到两个大素数p、q,求出φ(n)=(p-1)*(q-1);
  2. 根据e×d=1(modφ(n)),其中e为公钥19,d为私钥,通过求逆求出私钥值d;
  3. 根据公式M=Cd (mod n)解密,其中M为明文,C为密文,d为私钥,输出C对应字符即可。

源代码:

#include<stdio.h>
#include<iostream>
using namespace std;

// 三元组gcd(a, b) == ax + by == d
struct gcd {
	long d;
	long x;
	long y;
};

//辗转相除法求模的逆元
struct gcd exgcd(long a, long b)
{
	struct gcd a1, a2;
	if (b == 0) {
		a1.d = a;
		a1.x = 1;
		a1.y = 0;
		return a1;
	}
	else {
		a2 = exgcd(b, a % b);
		a1.d = a2.d;
		a1.x = a2.y;
		a1.y = a2.x - a2.y * (a / b);
	}
	return a1;
}

long inverse(long a, long m)
{
	long x;
	struct gcd a1;
	a1 = exgcd(a, m);
	if (a1.x < 0)
		a1.x += m;
	return a1.x;
}

//求x的y次方
long long Epow(long long x, long long y, long long num) {
	long long i, temp = x;
	for (i = 0; i < y - 1; i++) {
		x = (x * temp) % num;
	}
	return x;
}

int main() {
	//大整数分解
	long temp = 2,p=0,q=0,n1=0;
	while (temp < 920139713) {   
		if (920139713 % temp == 0) {
			p = temp;
			q = 920139713 / temp;
			n1 = (p - 1) * (q - 1);
			cout << "920139713的分解结果为:" << endl;
			cout << "p=" << p << endl;
			cout << "q=" << q << endl;
			cout << "φ(n):" << n1 << endl;
			break;
		}
		++temp;
	}
	//根据公钥求私钥
	long e = 19;  //公钥
	long d;    //私钥
	d = inverse(e, n1);
	cout << "私钥:" << d << endl;
	//解密
	long n = 920139713;
	long num[] = { 704796792,752211152,274704164,18414022,368270835,483295235,263072905,459788476,483295235,459788476,663551792,475206804,459788476,428313374,475206804,459788476,25392137,704796792,458265677,341524652,483295235,534149509,425392137,428313374,425392137,341524652,458265677,263072905,483295235,828509797,341524652,425392137,475206804,428313374,483295235,475206804,459788476,306220148 };
	int i, len;
	len = sizeof(c) / sizeof(c[0]);
	cout << "明文:" << endl;
	for (i = 0; i < len; i++) {  
		printf("%c", Epow(num[i], d, n));
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值