前言
时隔一月没写点东西,忙这忙那,物是人非,不说废话,看到题。
xman选拔赛asong
这道题真的很郁闷,在我的ubuntu上,open始终失败,无法调试,换了台机子还是一样,但学弟说他那没问题。–。–
没办法,只好纯静态的看了。
解题过程
0x0:
sub_400DB4(char *input,int len):
反汇编后,整理成c代码
int i;
char *a1;
int len;
unsigned int a1>>5;
for(i=0;len-1>a1;i++){
input[i]=8*input[i]|input[i+1]>>5;
}
result=&input[i];
*result=8*input[i]|input[0]>>5;
return result;
很明显这是不可逆的,但在已知最终结果的情况下可以爆破出input。每组爆破出来都是多解,先是尝试前面两位,第一位存在多解[125, 61, 93, 189, 29, 253, 221, 157],第二位为133
代码如下:
import json
result=[0xec,0x29,0xe3,0x41,0xe1,0xf7,0xaa,0x1d,0x29,0xed,0x29,0x99,0x39,0xf3,0xb7,0xa9,0xe7,0xac,0x2b,0xb7,0xab,0x40,0x9f,0xa9,0x31,0x35,0x2c,0x29,0xef,0xa8,0x3d,0x4b,0xb0,0xe9,0xe1,0x68,0x7b,0x41]
# print len(result)#28
k=0
st={}
for i in range(256):#input[i]
for j in range(256):#input[i+1]
fl=(8*i|j>>5)%256
if fl==result[k]:
if i in st:
st[i].append(j)
else:
st[i]=[j]
continue
# js = json.dumps(st, sort_keys=True, indent=4, separators=(',', ':'))# format json output
#print js
print "done!\n"
print st.keys()
n=1
sst={}
k=61
for i in st[k]:
for j in range(256):
fl=(8*i|j>>5)%256
if fl==result[n]:
if i in sst:
sst[i].append(j)
else:
sst[i]=[j]
continue
js = json.dumps(sst, sort_keys=True, indent=4, separators=(',', ':'))# format json output
print js
继续可以爆破出后面的
完整代码如下:
result=[0xec,0x29,0xe3,0x41,0xe1,0xf7,0xaa,0x1d,0x29,0xed,0x29,0x99,0x39,0xf3,0xb7,0xa9,0xe7,0xac,0x2b,0xb7,0xab,0x40,0x9f,0xa9,0x31,0x35,0x2c,0x29,0xef