semtex

Posted by rk700 on July 17, 2014
  • semtex0
    首先把文件下载下来:
    $ nc 178.79.134.250 24001 > semtex

    然后每两个bytes打印一个:

import sys

fin = open('semtex1', 'rb')
fout = open('semtex1.out', 'wb')
while 1:
    bytes = fin.read(2)
    if not bytes:
        break
    fout.write(bytes[0])
  • semtex1
    用控制变量法之类的,发现加密的方法,然后解密:
a='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
c='HRXDZNWEAWWCP'
p=[None]*len(c)

p[12] = c[0]

p[11] = a[(a.index(c[5])+13)%26]

p[10] = a[(a.index(c[8])-19)%26]

p[9] = a[(a.index(c[3])-3)%26]

p[8] = a[(a.index(c[6])-15)%26]

p[7] = a[(a.index(c[1])-23)%26]

p[6] = a[(a.index(c[4])-13)%26]

p[5] = a[(a.index(c[11])-20)%26]

p[4] = a[(a.index(c[2])-12)%26]

p[3] = a[(a.index(c[9])-4)%26]

p[2] = a[(a.index(c[12])-11)%26]

p[1] = a[(a.index(c[7])-10)%26]

p[0] = a[(a.index(c[10])-10)%26]

print(''.join(p))
  • semtex2
    devils number是666

    通过提示,还是要用LD_PRELOAD。写一个c文件,定义函数geteuid,然后编译为库:

    $ gcc -m32 --shared -fPIC preload.c -o preload.so

    再定义LD_PRELOAD

  • semtex3
    相当于求一个线性方程组的整数解,用matlab穷举了,类似于
    [i,j,k,m]=ndgrid(1:11);
    n=find(i+j+k+m==11);
    s=[i(n),j(n),k(n),m(n)]
    

    最后得到各个数字的个数为2, 3, 1, 1, 3, 1, 2, 0。输入得到shell

  • semtex4
    之前的一直都没有读的权限,到这里实在是不爽。在网上搜了下,找到一个用来dump内存的工具:xocopy。用它把semtex4转存下来,再用IDA分析。

    由于dump之后的程序比较大(估计是把相关的库,或者是准备的函数什么的都存了),打开比较慢。我们直接查找字符串password,进到了一个函数里。检查调用这个函数的函数,可以知道这个就是main。然后我们直接看汇编,得到密码会一个个字符打出来

    然后看了看其他人的解答,还是用ptrace修改eax的值来达到修改geteuid返回值的目的。由于geteuid的syscall是0xc9,当上一步eax是0xc9时,将eax改为6005。具体看http://0xbadc0de.org/blog/2013/11/17/wargame-semtex-4-solution/

  • semtex5
    这里要求从10个不同的ip连过去。可以用localhost.

    IPv4 network standards reserve the entire 127.0.0.0/8 address block for loopback purposes.

    我们用10个thread,每个收10bytes,与密码xor之后,附加上一个共同的10bytes的id。最后某一个连接读密码。

import socket
import threading

class semtex(threading.Thread):
    def __init__(self, lock, raddr, rport, tid, passwd, ansID):
        threading.Thread.__init__(self)
        self.tid = tid
        self.raddr = raddr
        self.rport = rport
        self.passwd = passwd
        self.ansID = ansID
        self.lock = lock
    def run(self):
        print("start %d" % self.tid)
        self.doWork()
        print("end %d" % self.tid)
    def doWork(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        laddr = "127.0.0.%d" % self.tid
        s.bind((laddr,0))
        s.connect((self.raddr,self.rport))
        data = s.recv(128)
        ans = [None]*20
        for i in range(len(self.passwd)):
            ans[i] = ord(data[i]) ^ ord(self.passwd[i])
        ans[10:] = list(ansID)
        s.send(bytearray(ans))
        data = s.recv(128)
        self.lock.acquire()
        print("recv: %s" % data)
        self.lock.release()

if __name__=="__main__":
    tidList = range(2,12)
    lock = threading.Lock()
    raddr = "127.0.0.1"
    rport = 24027
    passwd = "HELICOTRMA"
    ansID = "nabla12345"

    threads = []
    for tid in tidList:
        thread = semtex(lock, raddr, rport, tid, passwd, ansID)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()