ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • xor write up
    System hacking training/pwnable.xyz 2020. 2. 5. 23:21

    xor(50)
    prob
    file, checksec binary

    보호기법으로는 Full RELRO, NX, PIE가 걸려있다.

     

    IDA-View main()

    main()함수에서 무한 루프를 돌며 v4, v5, v6에 %ld(long)으로 입력받는다.

    이후 if문에 의해 각 입력값이 0이 아니고, v6이 9보다 작고, scanf()의 return 값인 v3가 3일 경우에만

    result[v6] = v5 ^ v4가 실행된다.

     

    IDA-View win()

    또한 flag를 출력해주는 win()함수가 존재한다.

    앞서 봐왔던 문제들과 비슷하지만 Full RELRO가 걸려있기 때문에 got overwrite를 할 수 없다.

     

    gdb-peda$ vm

    하지만 위와 같이 코드 영역에 w(write)권한이 있기 때문에 result[v6] = v5 ^ v4을 통해 코드 패치가 가능하다.

     

    따라서 v6으로 result를 기준으로 패치할 코드 위치를 조절하고,

    v4, v5를 xor한 값을 해당 주소에 call win() shellcode를 넣으면 된다.

     

    익스에 앞서 먼저 v6을 통해 코드 영역에 접근 가능한지 확인해봤다.

     

    gdb-peda$ pd main

    xor결과가 rcx에 저장되고 <main+183>에서 mov QWORD PTR [rdx+rax*1], rcx로 result를 기준으로 특정 위치에 해당 값을 넣는다.

     

    input 1 1 -262887

    따라서 1 1 -262887를 입력하여 해당 코드 영역에 접근할 수 있는지 확인을 해보면

    다음과 같이 [rdx+rax*1]이 <main+148>의 위치에 가있는 것을 확인할 수 있다.

     

    이제 call win() shellcode를 작성하여 해당 위치에 넣어주면 되는데,

    이 부분에서 많이 헤맸다. ㅜ.ㅜ

     

    gdb-peda$ x/g <main+148>

    현재 <main+148>에는 0x458b48fffffd63e8이 저장되어있다.

    여기서 e8은 asm으로 call을 의미하고, fffffd63가 exit@plt의 주소를 의미하는데,

     

    RIP-relative addressing

    주소값이 왜 이 모양일까.. 하고 찾아보니 RIP-relative addressing에 의해 그렇단다.

    쉽게 이해하기 위해 <main+148>이 실행될 때의 rip인 0xacd에 0xfffffd63를 더해 보면 0x830, exit@plt가 나온다.

     

    이제 이를 win()의 주소로 바꿔주면 exit@plt대신 win()함수가 실행되면서 flag를 출력할 수 있다.

     

    rip+[임의값] = win() 함수 주소

     

    함수 주소는 위와 같이 rip를 기준으로 +한 값으로 세팅이 가능하기 때문에

    [임의값] = win() - rip로 임의값을 구할 수 있게된다.

     

    rip = 0xacd, win() = 0xa21이므로 임의 값은 0xffffff54가 되고, 이 값이 win()함수의 주소가 된다.

     

    따라서 <main+148>에서 0xfffffd63 대신 0xffffff54를 넣어주면 되는데,

    입력을 %ld로 받는다는 점과 xor결과가 0xffffff54가 되어야한다는 점을 주의해서 익스하면 된다.

     

    from pwn import *
    
    # p = process('./xor')
    p = remote('svc.pwnable.xyz', 30029)
    
    p.sendlineafter('   ','1 5011179274728592617 -262887')
    p.sendlineafter('   ', '0 0 0')
    
    p.interactive()
    [+] Opening connection to svc.pwnable.xyz on port 30029: Done
    [*] Switching to interactive mode
    FLAG{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}Result: 0
    > 💩   $
    반응형

    'System hacking training > pwnable.xyz' 카테고리의 다른 글

    Free Spirit write up  (0) 2020.04.04
    two targets write up  (0) 2020.02.06
    note write up  (1) 2020.01.10
    GrownUp write up  (0) 2020.01.02
    misalignment write up  (0) 2020.01.01
Designed by Tistory.