[LOB] orc -> wolfman

Posted by dw0rdptr
2015. 3. 24. 23:46 System/LOB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
 
extern char **environ;
 
main(int argc, char *argv[])
{
    char buffer[40];
    int i;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // egghunter 
    for(i=0; environ[i]; i++)
        memset(environ[i], 0, strlen(environ[i]));
 
    if(argv[1][47!= '\xbf')
    {
        printf("stack is still your friend.\n");
        exit(0);
    }
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
 
        // buffer hunter
        memset(buffer, 040);
}
 
 
 

cs

전레벨과 같은 소스에서 buffer hunter가 추가되어 버퍼를 비운다.


1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합

3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가



strcpy함수를 보자

argv[1], 즉 프로그램에서 받은 인자를 buffer에 복사한다면 argv[1]의 주소에도 인자가 쓰여져 있으므로 buffer hunter 때문에  ret에 buffer의 주소를 덮지 못한다면 argv[1]의 주소를 덮으면 된다.


printf("%s\n",buffer);를 printf("%p"\n",argv[1]);로 바꾸고 argv[1]의 주소를 알아내 ret에 덮어쓰면 끝


전레벨과 동일하지만 ret에 argv[1]의 주소를 덮는다는 것이 차이점이다


페이로드와 Password




'System > LOB' 카테고리의 다른 글

[LOB] darkelf -> orge  (0) 2015.03.31
[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] goblin -> orc  (0) 2015.03.21
[LOB] cobolt -> goblin  (0) 2015.03.20
[LOB] gremlin -> cobolt  (0) 2015.03.18

[LOB] goblin -> orc

Posted by dw0rdptr
2015. 3. 21. 18:26 System/LOB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
        The Lord of the BOF : The Fellowship of the BOF
        - orc
        - egghunter
*/
 
#include <stdio.h>
#include <stdlib.h>
 
extern char **environ;
 
main(int argc, char *argv[])
{
    char buffer[40];
    int i;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // egghunter 
    for(i=0; environ[i]; i++)
        memset(environ[i], 0, strlen(environ[i]));
 
    if(argv[1][47!= '\xbf')
    {
        printf("stack is still your friend.\n");
        exit(0);
    }
 
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
}
cs

여러 제약조건이 추가되었다

1) egghunter 환경변수를 못씀

2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드삽입을 뜻함


gdb로 분석해보면


스택에 2c(44)바이트만큼의 공간이 할당되어있다.

메모리구조는

(row) | i[4] | buffer[40] | sfp[4] | ret[4] | (high)


strcpy 함수가 호출된 직후 브포를 걸어 buffer의 시작주소를 찾는다


NOP(19)+쉘코드(25)+버퍼의 시작주소(4)로 페이로드를 짜서 공격해봤다

Segmentation fault가 뜬다. 어떻게 된건지 찾아봤더니 gdb로 디버깅해서 나오는 주소값과 실제 프로그램상의 주소가 차이가 난다고 한다.

정확한 버퍼 주소를 알아보기 위해 orc.c 소스에서 printf("%s",buffer);를 %p로 바꿔 주소를 출력하게 했다.



페이로드와 Password


'System > LOB' 카테고리의 다른 글

[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] orc -> wolfman  (0) 2015.03.24
[LOB] cobolt -> goblin  (0) 2015.03.20
[LOB] gremlin -> cobolt  (0) 2015.03.18
[LOB] gate->gremlin  (0) 2015.03.17

[LOB] cobolt -> goblin

Posted by dw0rdptr
2015. 3. 20. 15:54 System/LOB
1
2
3
4
5
6
7
8
9
10
11
12
/*
        The Lord of the BOF : The Fellowship of the BOF
        - goblin
        - small buffer + stdin
*/
 
int main()
{
    char buffer[16];
    gets(buffer);
    printf("%s\n", buffer);
}
cs

- goblin 소스


gets로 buffer에 입력을 받아 출력하는데 gets함수 역시 입력문자열의 길이를 제한하지 않아
버퍼오버플로우 취약점이 발생한다.


스택에 16바이트 할당했으므로
메모리구조
| buffer(16) | sfp(4) | ret(4) |


전레벨과 똑같은 환경변수 shellcode를 등록하고 주소를 찾는다.

앞의 문제와는 다르게 실행할 때 인자를 받지 않고 프로그램 내에서 입력을 받으므로
파이프 명령어 | (shift + \)를 이용해 스크립트를 전달한다.


성공

Password


'System > LOB' 카테고리의 다른 글

[LOB] wolfman -> darkelf  (0) 2015.03.25
[LOB] orc -> wolfman  (0) 2015.03.24
[LOB] goblin -> orc  (0) 2015.03.21
[LOB] gremlin -> cobolt  (0) 2015.03.18
[LOB] gate->gremlin  (0) 2015.03.17