이 실행파일 역시 컴퓨터에 dll이 없어 실행할 수 없다고 나온다


그래서 pe뷰어로 pe구조를 보니 import directory table msvbvm50.dll이 있었다


컴퓨터에 dll이 없다고 했던 그 dll이.  그래서 dll 내 함수명들을 쭉 보니



이런 함수명이 있었다. vb는 비쥬얼베이직을 뜻하고 strcmp는 스트링 비교를 뜻하는거 같아 인증해보니 인증이 되었다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10
CodeEngn Basic 01  (0) 2017.01.10


먼저 다운받은 실행파일을 실행시켜 보았으나 실행파일이 손상되어 실행을 할 수 없었다.


그래서 pe뷰어로 실행파일의 pe구조를 보니



목록이 이렇게 밖에 나오지 않아 pe구조를 분석하지 못하는구나 라고 생각했다.



그래서 그냥 hex값들을 쭉 보다보니 실행파일이 손상되기전 파일을 실행시키면 쓰일 것 같은 문자열들이 보였다.


그중 비밀번호 같은 것을 인증해보니 인증되었다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 01  (0) 2017.01.10




GetDriveTypeA의 리턴값이 eax에 저장되는데 함수 종료후 eax는 두번 감소 된다


그리고 리턴값에서 -2 된 값과 esi를 비교해서 같을경우 CD-ROM으로 인식하는데 esi 3이므로 리턴값은 3이 되야 한다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10


문제 설명에  xss 봇이 서버에서 돌고있다고 설명해준다. 페이로드를 짜서 내 서버에 xss 봇의 정보를 전송하면 될듯하다.



문제 메인인데 내가 입력한것은 항상 봇이 확인한다고 한다.



기본적으로 alert부터 띄워보니 필터링은 하나도 없고 쿼터만 사용이 무력화된다. 


페이로드 짤때 쿼터 못쓰니까 짜증날거같아서 아예 스크립트를 만들기로 생각했다.



이런식으로 내 서버에있는 js파일을 삽입했다.



js파일은 간단하다. 내 서버로 xss 봇의 쿠키값을 전송한다.



 php 파일은 내 DB에 봇에서 날라온 쿠키를 저장하는 역할이다.


그러나 쿠키는 존재하지 않는가보다. 날라오는데 아무것도 보이지 않는다.



두번째로 생각한것은 그냥 봇의 소스이다. 봇 소스에 주석으로 FLAG 적혀있지 않을까 생각했다.



소스를 가져왔는데 내가 날린 스크립트만 있고 아무기능도 단서도 없다.



세번째로 생각한것은 봇의 URL이다. 내가 직접 들어가 보기로 했다.



그런데 그냥 파라미터 이름으로 flag가 박혀있었다.


재밌다.


'문제 > RingZeroTeam' 카테고리의 다른 글

RingZer0Team RingZer0 Authenticator  (0) 2016.09.06
RingZer0Team Windows API for the win!  (0) 2016.09.06

파일업로드 취약점을 통해 웹쉘을 올릴때 확장자 검사만을 통해 필터링하는 경우가 있다.


이때 .asp  .php  .jsp  를 필터링 하는경우 우회가 가능하다.


- 파일 업로드 우회 가능 확장자


asp : asa, cer, cdx


jsp : war


php : php3, html, htm


각 언어에 따라 확장자 필터링을 우회하면 웹쉘 업로드 및 실행이 가능하므로 취약하다고 할수 있다.





파일 업로드 대안방안


1. 업로드 폴더의 권한을 제거


2. jpg,gif 등 게시판 용도에 맞게 필요한 확장자만 허용(화이트 리스트)


3. 파일명을 암호화 해서 저장( webshell.asp > 29ba9191e9a8d6dc )


4. 확장자를 강제로 변경해서 저장( webshell.asp > webshell.xaspx )


5. 데이터베이스에 바이너리화 해서 저장


6. 파일 서버를 따로두어 클라이언트가 업로드하는 파일들은 따로 저장

'' 카테고리의 다른 글

LetsEncrypt Certificate Auto Renewal  (0) 2021.01.19
HttpOnly Vulnerability  (0) 2016.09.30
How To use IIS(Internet Information Services) - ASP  (0) 2016.09.19
strcmp vulnerability on php  (0) 2016.09.19
Directory Listing denied on Apache  (0) 2016.09.19

apt(advanced packaging tool)는 리눅스에서 소프트웨어를 설치하고 제거할때 사용하는 소프트웨어이다.


사용법 : apt-get [option] command package



* command


   -    update : 새 패키지 목록 가져오기

   -    upgrade : 업그레이드 실행

   -    install : 새 피키지 설치 (패키지 이름은 확장자를 제외함)

   -    remove : 패키지 제거

   -    autoremove : 사용하지 않는 모든 패키지를 자동으로 제거

   -    purge : 패키지와 설정 파일을 함께 제거

   -    source : 소스 압축 파일 다운로드

   -    build-dep : 소스 패키지의 빌드 의존성 설정

   -    dist-upgrade : 배포판 업그레이드, apt-get(8) 페이지 확인

   -    dselect-upgrade : dselect 선택 따르기

   -    clean : 다운로드한 압축 파일 지우기

   -    autoclean : 다운로드한 압축 파일 중 오래된 것 지우기

   -    check : 의존성이 깨진 패키지를 확인

   -    changelog : 주어진 패키지의 바뀐 내용 목록을 다운로드한 후 표시

   -    download : 현재 디렉터리로 바이너리 패키지 다운로드



* option


   -h  이 도움말.

   -q  기록할 수 있는 출력 - 작업 알리미 없음

   -qq 올 이외의 메시지 표시하지 않기

   -d  압축 파일을 설치하거나 압축 해제하지 않고 다운로드만 하기

   -s  동작 없음. 명령 시뮬레이션 실행

   -y  모든 질문을 표시하지 않고 예라고 대답하기

   -m  압축 파일을 찾을 수 없어도 계속 진행

   -u  업그레이드한 패키지의 목록도 표시

   -b  소스 패키지를 가져온 후 빌드

   -V  자세한 버전 번호 표시




패키지 소스 리스트 갱신(upgrade 를 하기 전에 update 해서 /etc/apt/source.list 를 갱신)

sudo apt-get update



설치된 패키지 업그레이드

sudo apt-get upgrade



패키지 설치

sudo apt-get install 패키지명



패키지 제거

sudo apt-get remove 패키지명



패키지 재설치(소프트웨어가 잘못되어 있을 때 사용)

sudo apt-get reinstall 패키지명



apt-get install 명령어로 설치한 패키지(deb) 파일의 삭제

sudo apt-get clean


* 경로(/var/cache/apt/archives)에 .deb 패키지 파일로 저장되어 있다.



패키지 검색

apt-cache search 패키지명



패키지 정보보기

apt-cache show 패키지명

보통 우분투 환경에서 컴파일을 하면 x86 아키텍처 환경에서 컴파일된 바이너리가 나온다.


그러나 아키텍처는 x86만 있는게 아니라 mips,arm등 다양하다.


x86에서 mips,arm등 다양한 아키텍처를 사용한 바이너리를 만들기 위해서 크로스 컴파일을 한다.



1. 다양한 아키텍처 환경 구성

먼저 ubuntu 14.04에서는 아래의 패키지가 설치되지 않는다.


나는 칼리리눅스에서 실습했다.


sudo apt-get install -y  gcc-multilib-arm-linux-gnueabi

sudo apt-get install -y  gcc-multilib-arm-linux-gnueabihf

sudo apt-get install -y  gcc-multilib-mips-linux-gnu

sudo apt-get install -y  gcc-multilib-mips64-linux-gnuabi64

sudo apt-get install -y  gcc-multilib-mips64el-linux-gnuabi64

sudo apt-get install -y  gcc-multilib-mipsel-linux-gnu

sudo apt-get install -y  gcc-multilib-powerpc-linux-gnu

sudo apt-get install -y  gcc-multilib-powerpc64-linux-gnu

sudo apt-get install -y  gcc-multilib-s390x-linux-gnu

sudo apt-get install -y  gcc-multilib-sparc64-linux-gnu

sudo apt-get install -y  gcc-multilib                                 ->                 m32옵션(64bit에서 32bit 바이너리 크로스 컴파일) 


위 명령어들을 통해 패키지를 설치하면 다양한 아키텍처 환경이 구성된다.


2. 크로스 컴파일


mips 아키텍처로 컴파일을 해보겠다.


mips-linux-gnu-gcc -o test test.c


매우 간단하게 x86환경에서 mips 바이너리를 컴파일 했다.


3. 실행


우분투 환경에서 위 아키테처 파일들을 실행시키고 싶으면 먼저 실행이 가능하도록 환경을 구성해줘야 한다.


sudo apt-get install qemu-user-static


이 패키지는 이렇게 다양한 아키텍처를 지원한다.



이제 위에서 컴파일한 바이너리를 실행시키면 된다.


qemu-mips-static -L /usr/mips-linux-gnu ./test


4. 디버깅


x86이 아닌 다른 아키텍처 바이너리를 디버깅 하기 위해선 먼저 gdb-multiarch를 설치해야 한다.


sudo apt-get install gdb-multiarch


gdb로 원격 디버깅을 통해 디버깅이 가능하다.


qemu-mips-static -L /usr/mips-linux-gnu -g 1234(포트) ./test


gdb-multiarch (터미널 새로 열어서)

(gdb) target remote localhost:1234





가끔 가다 안되는 것들도 있다.


크로스 컴파일 및 실행할 때 환경을 잘 구축 해줘야 하는데


msb,lsb 문제 운영체제 문제등 각종 문제들로 잘 작동되지 않을 수 있다.


위에서 설명한 부분은 아예 환경을 구축한게 아니고 크로스컴파일러를 통해 컴파일 하였으므로 완전하지 않다.


이부분에 대해서는 좀더 많은 공부와 삽질이 필요할 듯 하다.




문제 이름에서도 알수있듯 이 파일은 PE32+  즉 윈도우 64비트 실행파일이다.


올리디버거 peviewer peid 등 대부분의 프로그램이 32비트 파일에 맞춰 나오므로 IDA를 통해 분석할 수 밖에 없었다.




먼저 실행을 시키면 숫자를 입력받는다.




소스를 보면 먼저 무한루프 아닌 무한루프를 도는데 6개의 랜덤값을 생성하고 입력값과 모두 일치하면 반복문을 빠져나간다.


v5는 1인 상태로 빠져나간다.


빠져나간뒤 하는 일을 보니 FLAG를 출력해주는 루틴같다.


루틴을 자세히보니 미리 선언해 놓은 값들을 연산해 플래그로 만드는 작업같다.


굳이 랜덤값 6개를 맞출 필요없이 위의 반복문만 빠져나가면 될거같다.


중요한건 밑에서 v5가 참일때 플래그를 출력해주는데 이부분도 반복문 빠져나가듯이 우회하면 될듯하다.


사실 플래그 출력해주는 부분은 선언해놓은 값들을 연산하는 부분이므로 간단한 코딩을 하면되긴 하는데 


나는 32비트 환경이라 64비트 환경에서 연산하면 값이 달라질거 같기도 해서 디버깅으로 풀기로 했다.


IDA로 디컴파일이 되니까 디버깅도 될거같았는데 IDA에서 쓰는 64비트 디버거를 어떻게 설정해주는지 모르겠어서 64비트 디버거를 찾아보기로했다.


구글링을 해보니 x64dbg라는 디버거를 찾았다.



먼저 cmp edx,6 부분을 우회해야 하는데 이부분은 반복문을 빠져나가는 부분이다.


rdx를 6으로 바꿔주면 빠져나간다.



test r8b,r8b 이부분은 위에서 v5가 참이냐 거짓이냐를 따지는 부분인데 r8 레지스터값을 1로 변경해주면 마찬가지로 우회가 된다.


두 부분을 우회하고 나니 플래그가 출력된다.




'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr ImagePrc  (0) 2017.01.23
Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Position  (0) 2016.09.30


실행파일과 readme를 준다. password를 찾으란다. 실행시켜보니 실행은 되지않고 무슨 파일인지 보니 mac os-x arm 환경에서 만들어진 파일이다.


현재 ARM 환경을 구축해놓은 서버가 없어서 일단 아이다로 보았다.



correct key! 라는 문자열이 있으니 따라가 보았다.



ARM 어셈블리어로 보여지는데 문법을 모른다.


그러나 IDA로 디어셈블링이 되기때문에 문제푸는데 문제는 없어보인다.



처음에 입력을 받고 sub_232c ()함수를 호출한 뒤 입력한값을 어떠한 배열과 비교한다.


당연히 sub_232c() 함수에서 입력한 문자열이 바뀔거라 생각하고 sub_232c() 함수를 분석했다.



sub_232c() 함수를 통해 연산이 끝나고 아래의 배열로 내가 입력한 문자열이 바뀌어야 한다.



반복문을 통해 각종 연산을 한다.



뭐 분석할 필요도 없이 코드도 짧고 연산도 간단해 brute forcing을 하면 될거라 생각했다.


입력값의 범위는 키보드로 입력할수 있는 아스키값들이다.


이 값들중 연산을 거쳐 위의 비교하는 배열과 맞으면 된다.



간단한 코딩을 통해 내가 입력해야 할 값이 나왔다. 비록 원본파일을 실행은 시키지 못하지만 인증하니 성공했다.





문제 이름부터 알수 있듯이 이 문제는 ARM 아키텍처를 이해하고 있는가에 대한 문제이다.


Intel 과 AT&T syntax에만 익숙해 있던 나에게는 공부없이 못풀 문제였지만  고급툴  IDA 통해 쉽게 풀었다.


안드로이드도 ARM 으로 구성되있기 때문에 시간될때  ARM 아키텍처에 대해 공부해야겠다는 필요성을 느꼈다.

'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Position  (0) 2016.09.30
Reversing.kr Direct3D FPS  (0) 2016.09.01


문제를 보면 음악 플레이어를 주는데 1분 이상은 못듣게 되있다. 1분이상을 듣도록 하면 플래그가 나온다고 한다.



일단 메시지 박스를 띄우길래 메시지 박스를 띄우는 곳으로 가보니 윗부분에 0xea60과 비교를 하는 부분이 보인다.


0xea60은 10진수로 60000이기 때문에 이부분이 1분을 limit 걸어놓는 부분이라는 것을 알 수 있다.


그러므로 cmp eax,0ea60h를 cmp eax,2ea60h로 패치했다.



실행 시켜보니 에러가난다.



이유가 뭘까하고 디버깅 하면서 삽질 하다가 밑줄친 함수에서 프로그램이 비정상종료된다.


test eax,eax 부분에서 eax가 0이면 함수를 실행시키지 않고 다른부분으로 점프되니까 eax를 0으로 맞춰주도록 프로그램을 패치했다.



최종적으로 총 2부분, 60000을 충분히 키워주고 sub eax,eax로 eax를 0으로 맞춰주도록 패치했다.



실행해보니 1분이상 음악듣기가 가능해졌고 프로그램 타이틀에 플래그가 뜬다.


1분이상 못듣는 음악 플레이어를 크랙한것이다.


확실히 비쥬얼 베이직으로 만들어져서 한번도 코딩해보지 않은 언어라 분석하기도 좀더 껄끄럽고 짜증났다.



'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Position  (0) 2016.09.30
Reversing.kr Direct3D FPS  (0) 2016.09.01

+ Recent posts