QCTF-re-asong-纯静态详解

本文详细介绍了QCTF比赛中xman选拔赛asong的解题过程,包括sub_400DB4、sub_400D33和sub_400936等函数的静态分析,通过爆破和理解置换表来解决不可逆的加密问题。最终通过静态分析得到了解题的关键步骤和结果。
摘要由CSDN通过智能技术生成

前言

时隔一月没写点东西,忙这忙那,物是人非,不说废话,看到题。

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值