[CTF]-Reverse:纯逻辑分析题型综合解析

C语言:

字符串爆破:

例题(BUUCTF SimpleRev):

 查壳

看ida

这里的中心就是两个字符串和一个计算式子,text=killshadow和str2=adsfkndcls,计算式子str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97

完整exp:

#include<stdio.h>
int main()
{
	char key[11]="adsfkndcls";
	char text[11]="killshadow";
	char str2[11];
	char flag[11];
	int v1=0,v2=0,v3=0,v5=0;
	
	v3=v5=10;
	while(1)
	{
	for(v1='A';v1<='z';v1++)
	{
        str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
        if(str2[v2]==text[v2])
        {
          	flag[v2]=v1;
          	v3++;
          	break;
		}
    }
    v2++;
    if(v2==10)
    {
    	break;
	}
    }
    printf("%s",flag);
}

最后flag是flag{KLDQCUDFZO}

ascll码逆向:

例题(SWPUCTF 2021 新生赛 re2):

无壳

直接看ida

完整exp:

result=list('ylqq]aycqyp{')
for i in range(len(result)):
    if (ord(result[i])<=94 or ord(result[i])>96) and (ord(result[i])<=62 or ord(result[i])>64):
        result[i]=chr(ord(result[i])+2)
    else:
        result[i]=chr(ord(result[i])-24)
result=''.join(result)
print(result)

输出的是{nss_c{es{r}

因为a与{加密都得y所以要适当修改一点

{nss_caesar}

#补充点:这里的if的范围因为是逆回去的,所以范围要减2。

Python:

取模逆运算:

例题(SWPUCTF 2021 新生赛 fakebase):

题目:

flag = 'xxxxxxxxxxxxxxxxxxx'

s_box = 'qwertyuiopasdfghjkzxcvb123456#$'
tmp = ''
for i in flag:
    tmp += str(bin(ord(i)))[2:].zfill(8)
b1 = int(tmp,2)
s = ''
while b1//31 != 0:
    s += s_box[b1%31]
    b1 = b1//31

print(s)

# s = u#k4ggia61egegzjuqz12jhfspfkay

简单的来说,前面的循环是把字符串转换为了二进制,后面的循环则是不断地将一个数进行整除,并将余数储存起来。只不过这里换了个形式存储余数。

在取余模运算中,我们有了除数和余数还不足以推出完整的b1,还缺少商,这个时候可以采用爆破的形式来推出完整的b1。

推出完整的b1之后可以用libnum的函数给我们推出原来的字符串。

完整exp:

import libnum
s='u#k4ggia61egegzjuqz12jhfspfkay'
s_box ='qwertyuiopasdfghjkzxcvb123456#$'

for k in range(0,31):
    b1=k
    for i in s[::-1]:
        b1=31*b1+s_box.index(i)
    print(libnum.n2s(int(b1)))

两两异或:

例题([HNCTF 2022 Week1]你知道什么是Py嘛?):

这里已知flag的第一个字符,所以能推出flag

result=[29, 0, 16, 23, 18, 61, 43, 41, 13, 28, 88, 94, 49, 110, 66, 44, 43, 28, 91, 108, 61, 7, 22, 7, 43, 51, 44, 46, 9, 18, 20, 6, 2, 24]
flag='N'
for i in range(1,len(result)+1):
    flag+=chr(ord(flag[i-1])^result[i-1])

print(flag)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值