2020.2.25训练总结

计算器
思维僵化忘记倒着推了
ac
从要变的b入手, 如果b小于a直接相减就行了.和我超时思路一样.但b大于a的情况.我的思路会多执行判断和计算,实际上只要大的能除以2.那么这一步就赚了.直到b小于a就行了

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int main(){
    ios::sync_with_stdio(false);
	int a,b;
	while(cin>>a>>b){
		cnt=0;
		if(a==b){
			cout<<0<<endl;
		}
		else{
			while(a<b){
				if(b%2==0){
					b/=2;
				}
				else{
					b++;
				}
				cnt++;
			}
			cout<<cnt+(a-b)<<endl;
		}
	}
	return 0;
} 

比赛时超时思路,想着正着推,如果a*2大于等于b+2那么-1则会省一步,结果这个思路超时,去上班了

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int main(){
    ios::sync_with_stdio(false);
	int a,b;
	while(cin>>a>>b){
		cnt=0;
		if(a==b){
			cout<<0<<endl;
		}
		else{
			while(a!=b){
				if(a>b){
					cnt+=a-b;
					break;
				}
				else{
					while(a<b){
						if(a*2>=b+2){ 	
							cnt++;
							a--;
							continue;
						}
						else{
							cnt++;
							a*=2;
							continue;
						}
					}
				}
			}
			cout<<cnt<<endl;
		}
	}
	return 0;
} 

吃饱
结构体快排以下

#include<bits/stdc++.h>
using namespace std;
struct c{
	int id;
	int pf;
	int ss;
	int pj;
	int jl;
}C[10005];
int cmp(c a,c b){
	if(a.pf==b.pf){
		return a.id>b.id;
	}
	else return a.pf>b.pf;
}
int main(){
	int n,a,b,c;
	int p[1005],q[1005];
	while(scanf("%d %d %d %d",&n,&a,&b,&c)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%d %d %d %d %d",&C[i].id,&C[i].pf,&C[i].ss,&C[i].pj,&C[i].jl);
		}
		sort(C,C+n,cmp);
		for(int i=0;i<n;i++){
			if(!a){
				if(C[i].pj<=b&&C[i].jl<=c)printf("%d %d %d %d %d\n",C[i].id,C[i].pf,C[i].ss,C[i].pj,C[i].jl);
			}
			else{
				if(C[i].ss&&(C[i].pj<=b&&C[i].jl<=c))printf("%d %d %d %d %d\n",C[i].id,C[i].pf,C[i].ss,C[i].pj,C[i].jl);
			}
		}
	}
}

找预言家
有两种情况,关注别人的人和被关注的人.hash存储数组.然后跑个循环.看谁没关注人和被所有人关注

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;
	int p[1005],q[1005];
	int a,b;
	while(cin>>n>>m){
		int flag=1;
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		for(int i=0;i<m;i++){
			cin>>a>>b;
			p[b]++;
			q[a]++;
		}
		for(int i=1;i<=n;i++){
			if(p[i]==n-1&&q[i]==0){
				cout<<i<<endl;
				flag=0;
				break;
			}
		}
		if(flag)cout<<-1<<endl;
	}
}

最长回文
把字母的个数存到map里面,然后加起来就行了

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int main(){
    ios::sync_with_stdio(false);
	int a,b;
	while(cin>>a>>b){
		cnt=0;
		if(a==b){
			cout<<0<<endl;
		}
		else{
			while(a!=b){
				if(a>b){
					cnt+=a-b;
					break;
				}
				else{
					while(a<b){
						if(a*2>=b+2){
							cnt++;
							a--;
							continue;
						}
						else{
							cnt++;
							a*=2;
							continue;
						}
					}
				}
			}
			cout<<cnt<<endl;
		}
	}
	return 0;
} 

总结:思维僵化.只会正着推题.路线那题一样. 我想到只有顶端和底端个数会比中间的不同,还没推出来就弃了


恶意代码分析学习:
恶意样本存在的恶意行为,明天学习记录剩下行为

下载器和启动器
常见的两种恶意代码是下载器和启动器.下载器从互联网上下载其他的恶意代码,然后在本地系统中运行,下载器通常会与漏洞利用(exploit)打包在一起,下载器常用Windows API函数URLDownloadtoFileA和WinExec,来下载并运行新的恶意代码.
启动器(也称加载器)是一类可执行文件,用来安装立即运行或者将来秘密执行的恶意代码.启动器通常包含一个它要加载的恶意代码.
后门(backdoor)
后门(backdoor)是另一种类型的恶意代码,它能让攻击者远程访问一个受害的机器.后门是一种最常见的恶意代码,它们拥有多种功能,并且以多种形式与大小存在.后门代码往往实现了全套功能,所以当使用一个后门时,攻击者通常不需要下载额外的恶意代码.
后门程序利用互联网的通信方式是多样的.但是一个常用的方法是利用80端口使用HTTP协议.HTTP是出站流量最常使用的协议,所以它为恶意代码提供了一个与其他流量混淆的好机会.
反向shell
反向shell是从被感染机器上发起一个连接,它提供攻击者shell访问被感染机器的权限.反向shell或者作为一个单独的恶意代码存在,或者作为一个复杂后面程序中的组件而存在.在反向shell中,攻击者能够如同在本地系统上一样运行命令.
Windows反向shell
使用cmd.exe作为Windows系统中的反向shell,有两种简单的恶意编码实现:基础方法和多线程技术.
基础方法在恶意代码编写者之间比较流行,因为容易编写,且效果与多线程技术一致.它涉及CreateProcess函数的调用,并操纵传递给CreateProcess的STARTUPINFO结构.首先,创建一个套接字,并与远程服务器建立连接.然后,绑定这个套接字与cmd.exe标准流(标准输入,标准输出以及标准错误).调用CreateProcess函数用隐藏窗口的方式创建cmd.exe程序,对受害者隐藏cmd.exe进程.
Windows反向shell的多线程版本涉及一个套接字,两个管道以及两个线程的创建(查询API调用函数CreateThread,CreatePipe).恶意代码有时将这种方法作为策略,来篡改或编码经过一个套接字传入或传出的数据.CreatePipe用来绑定一个管道的读写端,如标准输入(stdin)和标准输出(stdout).CreateProcess方法用来绑定一个管道与标准流,而不是直接与套接字绑定.调用CreateProcess方法.恶意代码会产生两个线程:一个用来从标准输入管道读数据,并且向套接字写数据.另外一个用来从一个套接字读数据,并且向一个标准输出管道写数据.通常这两个线程使用数据编码来串改数据.
远程控制工具
远程控制工具(RAT)被用来远程管理一台或多台计算机.远程控制工具经常为了特定目标,如窃取信息或旁路一个网络执行针对性的攻击.
僵尸网络
僵尸网络是被感染主机(也称僵尸主机)的一个集合.它们由单一实体控制,通常由一个称为僵尸控制器的机器作为服务器.僵尸网络的目标是尽可能多地感染机器,来构建一个更大的僵尸主机网络.从而使僵尸网络传播其他的恶意代码或蠕虫,或者执行分布式拒绝服务(DDoS)攻击.在实施分布式拒绝服务攻击时,所有僵尸主机会在同一时刻访问同一个站点,僵尸网络能够让这个站点挂掉.
远程控制工具与僵尸网络的不同
僵尸网络感染和控制数以百万记的主机.远程控制工具通常只控制很少数量的主机.僵尸网络中的所有主机在同一时刻被控制,而远程控制工具是以每个受害者为单位进行远程控制.因为远程控制工具要求攻击者与受害者主机之间更紧密地交互.
登录凭证窃取
攻击者经常窃取登录凭证,主要以下面三种类型的恶意代码:
等待用户登录以窃取登录凭证的程序.转储windows系统中存放信息的程序,例如密码哈希值.程序直接使用它,或者进行离线破解.
`击键记录程序.
GINA拦截
在windows XP系统中,恶意代码使用微软图形识别和验证界面(GINA)拦截技术来窃取用户的登录凭证.GINA的设计目的是让合法第三方通过添加一些代码,来自定义登录过程,如用硬件无法射频标识(RFID)令牌或者智能卡来进行身份认证等.恶意代码编写者利用GINA对第三方的支持来加载窃密器.
GINA在msgina.dll中实现,这个DLL在用户登录系统过程中由winlogon可执行文件加载.winlogon也为第三方定制实现DLL程序工作,在winlogon与GINADLL之间加载第三方DLL(类似中间人攻击).windows用下列注册表存储需要winlogon加载的第三方DLL:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL.
口令哈希转储
转储windows口令哈希是恶意代码获取系统登录凭证的一种方法.攻击者试图抓取这些口令哈希,以便离线暴力破解.或者利用它们执行Pass-the-Hash攻击.Pass-the-Hash攻击在无需破解或解密口令哈希以获取明文秘钥的情况下,使用LM或者NTLM哈希来通过远程主机的身份验证,从而获得访问权.
Pwdump和Pass-the-Hash工具包是提供口令哈希转储免费的可用软件包.多数反病毒软件都拥有它们的特征码,通常情况下攻击者要逃避探测就会编译他们专有版本.
pwdump是一个程序合集,它从安全账户管理器(SAM)输出本地用户账户的LM和NTLM口令哈希.pwdump通过注入DLL到本地安全认证子系统服务(LSASS)进程进行攻击.口令哈希转储工具通常针对lsass.exe进程.因为它有足够权限来访问很多API函数.一旦DLL在lsass.exe中运行,pwdump就会调用GetHash,这个函数,目的是执行口令哈希提取.提取函数会使用未文档化的windows函数,来枚举系统中的用户,并且获得每个用户未解密的口令哈希.
处理pwdump程序变种时,需要分析DLL,以便确定它如何执行口令哈希转储操作.首先查看DLL的导出函数,默认导出函数是GetHash.

发布了7 篇原创文章 · 获赞 0 · 访问量 95

猜你喜欢

转载自blog.csdn.net/qq_35927490/article/details/104505724
今日推荐