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)))