pwnable.kr의 두번째 문제입니다.


계정의 홈 폴더에는 역시나 첫번째 문제와 같이 세 개의 파일이 존재합니다. 


소스코드를 살표보면 char형 포인터를 인자로 받는 함수가 있습니다. 이 함수(check_password)는 char형 포인터를 int형 포인터로 Type Casting 합니다.

그리고 char형은 1byte, int형은 4byte의 크기를 가지므로 for 문에서는 들어온 char형 사이즈를 4byte로 5번씩 나누어 res변수에 더해집니다.


main 함수에선 인자를 1개 받도록 하였고, 인자의 사이즈가 20byte여야 합니다. 그리고 hashcode와 check_password된 argv[1]의 값이 같게 되면 collision2의 권한으로 /bin/cat 명령을 수행할 수 있습니다.

0x21DD09EC / 5 = 0x6C5CEC8

0x21DD09EC % 5 = 4


0x21DD09EC = 0x6C5CEC8*4 + 0x6C5CECC

이므로 인자로 6C5CEC8을 4번, (6C5CEC8+4)를 1번 입력해주면 hashcode와 같게 됩니다.

Intel CPU의 바이트 오더링은 Little Endian 방식이므로 2바이트씩 뒤집어서 입력해줘야 합니다.


ex) 0x6C5CEC8 - > \xC8\xCE\xC5\x06


이제 인자로 이 값을 넣어주겠습니다. 저는 스크립트 언어인 python을 이용하였습니다.

collision2 쉘을 획득하여서 /bin/cat 명령을 성공적으로 수행했습니다.

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

[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29
[pwanble.kr 1번] fd 1pt  (0) 2016.07.27

file 디스크립터에 대한 문제인듯 합니다.


문제 계정 홈에는 총 세가지의 파일이 있습니다.

실행 파일 fd, 소스파일 fd.c 그리고 flag 파일이 있습니다.

fd 파일을통해 fd2의 쉘을 획득하여 flag 파일을 읽으면 문제를 해결할 수 있을듯 합니다.


atoi 함수에 관한 설명입니다.

설명

10진 정수 문자열을 정수로 변환합니다.

      1. 문자열에서 10진 정수 숫자 문자 뒤의 일반 문자는 취소되며, 10진 정수 숫자 문자까지만 숫자로 변환됩니다. 
      2. 10진 정수 숫자 문자 앞의 공백문자는 자동 제거되어 10진 정수 숫자 문자까지만 숫자로 변환됩니다. 
      3. 공백 및 10진 정수 문자가 아닌 문자로 시작하면 0을 반환합니다.

read 함수에 대한 설명입니다.

설명

open() 함수로 열기를 한 파일의 내용을 읽기를 합니다. 

헤더unistd.h
형태ssize_t read (int fd, void *buf, size_t nbytes)
인수int fd파일 디스크립터 
 void *buf파일을 읽어 들일 버퍼 
 size_t nbytes퍼버의 크기 
반환ssize_t정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환


문제에서 fd값이 0이되면 값을 임의로 입력할 수 있습니다. 

따라서 int fd = atoi(argv[1]) - 0x1234 에서 fd에 0이 들어가도록 하면 됩니다.

argv[1]에 0x1234의 10진 정수문자열 값인 4660을 인자로 주면 atoi 함수가 정수로 변환 해주니 fd는 0으로 초기화 됩니다.


입력을 기다리고 있습니다.

strcmp 함수가 0이 되도록 하려면 LETMEWIN을 입력합니다.


fd2의 권한으로 flag 파일을 /bin/cat 명령으로 읽었습니다.


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

[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29
[pwnable.kr 2번] collision 3pt  (0) 2016.07.27

hint : block 당한 계정을 bypass 하여라!


문제 접속 화면입니다. 로그인 폼이 있네요

get source로 소스코드 힌트를 확인보겠습니다.


id에 guest 또는 blueh4g 가 있으면 "your account is blocked" 라는 문자열이 출력됩니다.

비밀번호가 틀리면 "wrong.."이 출력됩니다.


이렇게 말이죠


sql에선 대소문자를 구분하지 않습니다. 따라서 id에 guest가 아닌 gueSt를 입력하면 php에선 필터링에 걸리지 않고 sql에선 guest로 인정합니다.


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

wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 3번 flee button 450p  (0) 2016.07.25
wargame.kr 2번 QR CODE PUZZLE 300p  (0) 2016.07.25
wargame.kr 1번 already got 200p  (0) 2016.07.25

hint : 버튼을 click!



버튼을 click 하려고 해도 마우스를 따라다니면서 옆에 찰거머리처럼 딱 붙어있네요..

 소스를 한번 확인해보도록 하겠습니다. 

onclick event를 확인합니다. 


http://wargame.kr:8080/flee_button/?key=39e7 로 접근하면 flag가 나옵니다.

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

wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 4번 login filtering 450p  (0) 2016.07.25
wargame.kr 2번 QR CODE PUZZLE 300p  (0) 2016.07.25
wargame.kr 1번 already got 200p  (0) 2016.07.25

hint : javascript 퍼즐 챌린지


문제를 클릭해보도록 하겠습니다.

qr코드가 흩어진 퍼즐조각처럼 있습니다. 클릭하면 퍼즐을 움직일 수 있지만 문제 의도는 소스코드를 통해 풀어야 하는 것 입니다.

소스를 한번 확인해보도록 하겠습니다. 


qr code의 원본 img 파일의 위치를 알아냈습니다.

qr code를 스캔하면 flag가 나옵니다.

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

wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 4번 login filtering 450p  (0) 2016.07.25
wargame.kr 3번 flee button 450p  (0) 2016.07.25
wargame.kr 1번 already got 200p  (0) 2016.07.25


hint : HTTP Response 헤더를 볼 수 있냐고 묻습니다.

문제를 한번 확인해 보겠습니다.


key를 획득했다는 문자열이 나옵니다. 프락시 툴로 HTTP Response를 확인해보도록 하겠습니다.



flag가 Response에 포함되어있습니다.

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

wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 4번 login filtering 450p  (0) 2016.07.25
wargame.kr 3번 flee button 450p  (0) 2016.07.25
wargame.kr 2번 QR CODE PUZZLE 300p  (0) 2016.07.25

#-*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import BeautifulSoup, urlparse, os, time, random

def getPeopleLinks(page):
    links = []
    for link in page.findAll('a'):
        url = link.get('href')
        if url:
            if '/profile.php?id=' in url:
                links.append(url)
    return links

def getID(url):
    pUrl = urlparse.urlparse(url)
    return urlparse.parse_qs(pUrl.query)['id'][0]

def view_friend():
    print "[+] 친구목록 탐색중"
    private_page = driver.find_element_by_class_name('fbxWelcomeBoxSmallRow')
    ActionChains(driver).move_to_element(private_page).click().perform()
    friend_page = driver.find_element_by_class_name('_39g5')
    ActionChains(driver).move_to_element(friend_page).click().perform()

def login_web():
    facebook_id = driver.find_element_by_name("email")
    facebook_pw = driver.find_element_by_name("pass")

    facebook_id.clear()

    facebook_pw.clear()

    facebook_id.send_keys("")

    facebook_pw.send_keys("")

    facebook_pw.send_keys(Keys.RETURN)
    print "[+] 로그인 성공! 봇을 시작합니다."

def write_timeline():
    facebook_write = driver.find_element_by_name("xhpc_message")
    facebook_write.clear()
    facebook_write.send_keys("`1234567890~!@#$%^&*()_+|")
    if facebook_write.send_keys(Keys.RETURN) == None:
        print "[+] 글 작성 완료!"

def viewbot(driver):
    visited = {}
    pList = [ ]
    count = 0
#	while True:
    for i in range(10):
#      sleep to make sure everything loads.
#      add random to make us look human.
#time.sleep(random.uniform(3.5,6.9))
        page = BeautifulSoup.BeautifulSoup(driver.page_source)
        people = getPeopleLinks(page)
        if people:
            for person in people:
                ID = getID(person)
                if ID not in visited:
                    pList.append(person)
                    visited[ID] = 1
        if pList: #If there is people to look at, then look at them
            person = pList.pop()
            driver.get(person)
            count += 1

        print "[+]"+driver.title[3:len(driver.title)]+" Visited! \n("\
            +str(count)+"/"+str(len(pList))+") Visited/Queue"
        driver.back()

def Main():
    os.system('clear')
    print """
    =====================**************************======================
    =====================Facebook Friends Search Bot_made by SSo===========
    =====================**************************======================

    """
    web = 'https://facebook.com/login.php'
    global driver
    driver = webdriver.Firefox()
    driver.get(web)
    print "[+] 웹 사이트 접근 성공(" + web + ")"
    assert "Facebook" in driver.title

    login_web()
    driver.implicitly_wait(10)

    view_friend()
    viewbot(driver)



    assert "No results found." not in driver.page_source

    print "[+] 자동탐색기 종료"
    driver.close()

if __name__ == "__main__":
    Main()

'Language > python' 카테고리의 다른 글

python에서 bash 명령  (0) 2017.05.24
[라이브러리] pwntools - CTF toolkit  (0) 2016.08.04
Python String maketrans() Method  (0) 2016.07.19
파이썬으로 웹 브라우저 실행하기  (0) 2016.07.10
정규표현식 (Regular Expression)  (0) 2016.06.13

+ Recent posts