攻防世界no-strings-attached做法(简易版)

首先查个壳,发现没壳,是32bit,那就丢进ida32中进行反编译进入main函数查看,里面有很多个函数,挨个点进去看看,找找关键点进入最后一个函数,发现了些东西,两个函数输出success和denied,if括号内的条件就得为非0,也就是说ws数组和s2数组相等才行,上面对s2数组进行了处理,那就直接看他咋处理的,然后逆推就行了,先提取数据,选中之后shift+e,这边有一个坑,那就是dword_8048A90的数据提取,这个数组最后的四个0不要提取,为什么是最后四个呢?这边需要一点汇编的知识点,数的定义,一般四个为一组,定义0,没有意义,所以最后定义的数0不采取

点进decrypt函数该函数传入的两个数组都是已知数,这边对应好就行了(num数组为我自己定义的数组,方便些),这边也有一个小点注意一下,那就是不是所有的c代码都会有意义,跟着他的大概意思揣测,未说明白的地方直接跳过就好,最后上代码


#include<stdio.h>
#include<string.h>
int main(){
	int s[]={
   58,  20,   0,   0,  54,  20,   0,   0,  55,  20, 
    0,   0,  59,  20,   0,   0, 128,  20,   0,   0, 
  122,  20,   0,   0, 113,  20,   0,   0, 120,  20, 
    0,   0,  99,  20,   0,   0, 102,  20,   0,   0, 
  115,  20,   0,   0, 103,  20,   0,   0,  98,  20, 
    0,   0, 101,  20,   0,   0, 115,  20,   0,   0, 
   96,  20,   0,   0, 107,  20,   0,   0, 113,  20, 
    0,   0, 120,  20,   0,   0, 106,  20,   0,   0, 
  115,  20,   0,   0, 112,  20,   0,   0, 100,  20, 
    0,   0, 120,  20,   0,   0, 110,  20,   0,   0, 
  112,  20,   0,   0, 112,  20,   0,   0, 100,  20, 
    0,   0, 112,  20,   0,   0, 100,  20,   0,   0, 
  110,  20,   0,   0, 123,  20,   0,   0, 118,  20, 
    0,   0, 120,  20,   0,   0, 106,  20,   0,   0, 
  115,  20,   0,   0, 123,  20,   0,   0, 128,  20, 
    0,   0,   0,   0,   0,   0
};
	int num[]={
    1,  20,   0,   0,   2,  20,   0,   0,   3,  20, 
    0,   0,   4,  20,   0,   0,   5,  20,   0,   0, 
    
};
	for(int i=0;i<sizeof(s)/sizeof(int);i++){
		
		s[i]-=num[i%20];
		if(s[i]>32&&s[i]<128){
			printf("%c",s[i]);
		}
	}
	return 0;
}

写代码的时候,也要注意几个小点,只有32-128之间的再输出出来,如果不对,再缩小范围60-128,同时也要注意数组的长度,此处取num数组的值时,需要对20取模,不然会超出数组的长度取值,到时候就会错了,毕竟s数组长度远大于num数组。

最后总结一下,c代码中未说明清楚的东西可以暂且忽略一下,数组和数组进行异或时,需要考虑两个数组的长度,不能超出数组本身的长度(^_^),拿下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值