组长 | 组员 | 组员 |
---|---|---|
E41714007 | E41714001 | E41714020 |
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 文件包括三个索引表:
- ELF header ELF头,在文件的开始,保存了路线图,描述了该文件的组织情况;
- Program header table 程序头表,告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表;
- 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解题方法:
- 用PEID查看PE文件是用什么语言写的、是否加壳;
- 使用IDA进行静态分析,理解大致思路后拖入OD进行动态分析;
- 观察程序的特征,并根据这些特征推测函数的逻辑和关键函数,理清思路,反推出结果。
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密码体制的加解密,破解过程分以下步骤:
- 对大整数920139713进行分解,得到两个大素数p、q,求出φ(n)=(p-1)*(q-1);
- 根据e×d=1(modφ(n)),其中e为公钥19,d为私钥,通过求逆求出私钥值d;
- 根据公式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));
}
}
运行结果: